aboutsummaryrefslogtreecommitdiffstats
path: root/module/spl/spl-kmem.c
diff options
context:
space:
mode:
authorBrian Behlendorf <[email protected]>2011-02-23 12:25:45 -0800
committerBrian Behlendorf <[email protected]>2011-02-23 12:44:32 -0800
commit914b063133365a17b1f607cbe96102259e497753 (patch)
treef90c6739c85e1c71638aa7e43efc6123eb7d4aec /module/spl/spl-kmem.c
parentbf665d4075e9777af089e669c65f72d5d652f26e (diff)
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.
Diffstat (limited to 'module/spl/spl-kmem.c')
-rw-r--r--module/spl/spl-kmem.c14
1 files changed, 14 insertions, 0 deletions
diff --git a/module/spl/spl-kmem.c b/module/spl/spl-kmem.c
index 1a9c1fe96..100d674e5 100644
--- a/module/spl/spl-kmem.c
+++ b/module/spl/spl-kmem.c
@@ -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;
}