Linux compat 2.6.37, invalidate_inodes()

In the 2.6.37 kernel the function invalidate_inodes() is no longer
exported for use by modules.  This memory management functionality
is needed to invalidate the inodes attached to a super block without
unmounting the filesystem.

Because this function still exists in the kernel and the prototype
is available is a common header all we strictly need is the symbol
address.  The address is obtained using spl_kallsyms_lookup_name()
and assigned to the variable invalidate_inodes_fn.  Then a #define
is used to replace all instances of invalidate_inodes() with a
call to the acquired address.  All the complexity is hidden behind
HAVE_INVALIDATE_INODES and invalidate_inodes() can be used as usual.

Long term we should try to get this, or another, interface made
available to modules again.
This commit is contained in:
Brian Behlendorf
2011-02-23 12:25:45 -08:00
parent bf665d4075
commit 914b063133
5 changed files with 128 additions and 0 deletions
+13
View File
@@ -26,6 +26,7 @@
#define _SPL_MM_COMPAT_H
#include <linux/mm.h>
#include <linux/fs.h>
/*
* Linux 2.6.31 API Change.
@@ -43,4 +44,16 @@
#define high_wmark_pages(z) (z->pages_high)
#endif
/*
* 2.6.37 API compat,
* The function invalidate_inodes() is no longer exported by the kernel.
* The prototype however is still available which means it is safe
* to acquire the symbol's address using spl_kallsyms_lookup_name().
*/
#ifndef HAVE_INVALIDATE_INODES
typedef int (*invalidate_inodes_t)(struct super_block *sb);
extern invalidate_inodes_t invalidate_inodes_fn;
#define invalidate_inodes(sb) invalidate_inodes_fn(sb)
#endif /* HAVE_INVALIDATE_INODES */
#endif /* SPL_MM_COMPAT_H */