])
#
+# 2.6.38 inode.i_rcu added.
+#
+AC_DEFUN([LC_INODE_I_RCU],
+[AC_MSG_CHECKING([if inode.i_rcu exists])
+LB_LINUX_TRY_COMPILE([
+ #include <linux/fs.h>
+],[
+ struct inode ino;
+ struct rcu_head rcu = {};
+ ino.i_rcu = rcu;
+],[
+ AC_DEFINE(HAVE_INODE_I_RCU, 1,
+ [inode.i_rcu exists])
+ AC_MSG_RESULT([yes])
+],[
+ AC_MSG_RESULT([no])
+])
+])
+
+#
# 2.6.38 export blkdev_get_by_dev
#
AC_DEFUN([LC_BLKDEV_GET_BY_DEV],
LC_GENERIC_PERMISSION
LC_QUOTA_ON_USE_PATH
LC_DCACHE_LOCK
+ LC_INODE_I_RCU
LC_D_COMPARE_7ARGS
LC_D_DELETE_CONST
return &lli->lli_vfs_inode;
}
+#ifdef HAVE_INODE_I_RCU
+static void ll_inode_destroy_callback(struct rcu_head *head)
+{
+ struct inode *inode = container_of(head, struct inode, i_rcu);
+ struct ll_inode_info *ptr = ll_i2info(inode);
+ OBD_SLAB_FREE_PTR(ptr, ll_inode_cachep);
+}
+
+static void ll_destroy_inode(struct inode *inode)
+{
+ call_rcu(&inode->i_rcu, ll_inode_destroy_callback);
+}
+#else
static void ll_destroy_inode(struct inode *inode)
{
- struct ll_inode_info *ptr = ll_i2info(inode);
- OBD_SLAB_FREE_PTR(ptr, ll_inode_cachep);
+ struct ll_inode_info *ptr = ll_i2info(inode);
+ OBD_SLAB_FREE_PTR(ptr, ll_inode_cachep);
}
+#endif
int ll_init_inodecache(void)
{