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
+14
View File
@@ -180,6 +180,11 @@ spl_global_page_state(spl_zone_stat_item_t item)
#endif /* NEED_GET_ZONE_COUNTS */
EXPORT_SYMBOL(spl_global_page_state);
#ifndef HAVE_INVALIDATE_INODES
invalidate_inodes_t invalidate_inodes_fn = SYMBOL_POISON;
EXPORT_SYMBOL(invalidate_inodes_fn);
#endif /* HAVE_INVALIDATE_INODES */
pgcnt_t
spl_kmem_availrmem(void)
{
@@ -2089,6 +2094,15 @@ spl_kmem_init_kallsyms_lookup(void)
*/
spl_kmem_init_globals();
#ifndef HAVE_INVALIDATE_INODES
invalidate_inodes_fn = (invalidate_inodes_t)
spl_kallsyms_lookup_name("invalidate_inodes");
if (!invalidate_inodes_fn) {
printk(KERN_ERR "Error: Unknown symbol invalidate_inodes\n");
return -EFAULT;
}
#endif /* HAVE_INVALIDATE_INODES */
return 0;
}