diff options
author | Yuxuan Shui <[email protected]> | 2012-10-12 22:41:06 +0800 |
---|---|---|
committer | Brian Behlendorf <[email protected]> | 2012-10-14 13:06:54 -0700 |
commit | 8f195a908ffaa8faf8f4c8a0e701e44ae3859e33 (patch) | |
tree | 48ade7ec19cb9689b2d7c5e508626cd29df09272 | |
parent | 3c203610756f98f275c7c9f731d67a38b1111509 (diff) |
Linux 3.6 compat, iops->lookup()
As of Linux commit 00cd8dd3bf95f2cc8435b4cac01d9995635c6d0b the
struct nameidata is no longer passed to iops->lookup. Instead
only the inamedata->flags are passed.
ZFS like almost all Linux fileystems never made use of this so
only the prototype needs to be wrapped for compatibility.
Signed-off-by: Yuxuan Shui <[email protected]>
Signed-off-by: Brian Behlendorf <[email protected]>
Issue #873
-rw-r--r-- | config/kernel-lookup-nameidata.m4 | 21 | ||||
-rw-r--r-- | config/kernel.m4 | 1 | ||||
-rw-r--r-- | module/zfs/zpl_ctldir.c | 15 | ||||
-rw-r--r-- | module/zfs/zpl_inode.c | 4 |
4 files changed, 41 insertions, 0 deletions
diff --git a/config/kernel-lookup-nameidata.m4 b/config/kernel-lookup-nameidata.m4 new file mode 100644 index 000000000..5e30be433 --- /dev/null +++ b/config/kernel-lookup-nameidata.m4 @@ -0,0 +1,21 @@ +dnl # +dnl # 3.6 API change +dnl # +AC_DEFUN([ZFS_AC_KERNEL_LOOKUP_NAMEIDATA], [ + AC_MSG_CHECKING([whether iops->lookup() takes struct nameidata]) + ZFS_LINUX_TRY_COMPILE([ + #include <linux/fs.h> + ],[ + struct dentry * (*inode_lookup) (struct inode *,struct dentry *, + struct nameidata *) = NULL; + struct inode_operations iops __attribute__ ((unused)) = { + .lookup = inode_lookup, + }; + ],[ + AC_MSG_RESULT(yes) + AC_DEFINE(HAVE_LOOKUP_NAMEIDATA, 1, + [iops->lookup() operation takes nameidata]) + ],[ + AC_MSG_RESULT(no) + ]) +]) diff --git a/config/kernel.m4 b/config/kernel.m4 index 3a144a337..8d8cd6b48 100644 --- a/config/kernel.m4 +++ b/config/kernel.m4 @@ -49,6 +49,7 @@ AC_DEFUN([ZFS_AC_CONFIG_KERNEL], [ ZFS_AC_KERNEL_NR_CACHED_OBJECTS ZFS_AC_KERNEL_FREE_CACHED_OBJECTS ZFS_AC_KERNEL_FALLOCATE + ZFS_AC_KERNEL_LOOKUP_NAMEIDATA ZFS_AC_KERNEL_TRUNCATE_RANGE ZFS_AC_KERNEL_CREATE_UMODE_T ZFS_AC_KERNEL_AUTOMOUNT diff --git a/module/zfs/zpl_ctldir.c b/module/zfs/zpl_ctldir.c index c680e5443..7dfaf6ebc 100644 --- a/module/zfs/zpl_ctldir.c +++ b/module/zfs/zpl_ctldir.c @@ -143,7 +143,11 @@ zpl_root_getattr(struct vfsmount *mnt, struct dentry *dentry, } static struct dentry * +#ifdef HAVE_LOOKUP_NAMEIDATA zpl_root_lookup(struct inode *dip, struct dentry *dentry, struct nameidata *nd) +#else +zpl_root_lookup(struct inode *dip, struct dentry *dentry, unsigned int flags) +#endif { cred_t *cr = CRED(); struct inode *ip; @@ -180,8 +184,14 @@ const struct inode_operations zpl_ops_root = { }; static struct dentry * +#ifdef HAVE_LOOKUP_NAMEIDATA zpl_snapdir_lookup(struct inode *dip, struct dentry *dentry, struct nameidata *nd) +#else +zpl_snapdir_lookup(struct inode *dip, struct dentry *dentry, + unsigned int flags) +#endif + { cred_t *cr = CRED(); struct inode *ip; @@ -410,8 +420,13 @@ const struct dentry_operations zpl_dops_snapdirs = { #endif /* HAVE_AUTOMOUNT */ static struct dentry * +#ifdef HAVE_LOOKUP_NAMEIDATA zpl_shares_lookup(struct inode *dip, struct dentry *dentry, struct nameidata *nd) +#else +zpl_shares_lookup(struct inode *dip, struct dentry *dentry, + unsigned int flags) +#endif { cred_t *cr = CRED(); struct inode *ip = NULL; diff --git a/module/zfs/zpl_inode.c b/module/zfs/zpl_inode.c index 0dab82cc0..5b31c126c 100644 --- a/module/zfs/zpl_inode.c +++ b/module/zfs/zpl_inode.c @@ -31,7 +31,11 @@ static struct dentry * +#ifdef HAVE_LOOKUP_NAMEIDATA zpl_lookup(struct inode *dir, struct dentry *dentry, struct nameidata *nd) +#else +zpl_lookup(struct inode *dir, struct dentry *dentry, unsigned int flags) +#endif { cred_t *cr = CRED(); struct inode *ip; |