From 95f5c63b47d8f8294b38843f9ba710e97b749b63 Mon Sep 17 00:00:00 2001 From: Richard Yao Date: Thu, 16 Aug 2012 19:31:54 -0400 Subject: Linux 3.6 compat, iops->mkdir() Use .mkdir instead of .create in 3.3 compatibility check. Linux 3.6 modifies inode_operations->create's function prototype. This causes an autotools Linux 3.3. compatibility check for a function prototype change in create, mkdir and mknode to fail. Since mkdir and mknode are unchanged, we modify the check to examine it instead. Signed-off-by: Richard Yao Signed-off-by: Brian Behlendorf Issue #873 --- config/kernel-create-umode-t.m4 | 26 -------------------------- config/kernel-mkdir-umode-t.m4 | 25 +++++++++++++++++++++++++ config/kernel.m4 | 2 +- include/linux/vfs_compat.h | 2 +- 4 files changed, 27 insertions(+), 28 deletions(-) delete mode 100644 config/kernel-create-umode-t.m4 create mode 100644 config/kernel-mkdir-umode-t.m4 diff --git a/config/kernel-create-umode-t.m4 b/config/kernel-create-umode-t.m4 deleted file mode 100644 index f88113f40..000000000 --- a/config/kernel-create-umode-t.m4 +++ /dev/null @@ -1,26 +0,0 @@ -dnl # -dnl # 3.3 API change -dnl # The VFS .create, .mkdir and .mknod callbacks were updated to take a -dnl # umode_t type rather than an int. The expectation is that any backport -dnl # would also change all three prototypes. However, if it turns out that -dnl # some distribution doesn't backport the whole thing this could be -dnl # broken apart in to three seperate checks. -dnl # -AC_DEFUN([ZFS_AC_KERNEL_CREATE_UMODE_T], [ - AC_MSG_CHECKING([whether iops->create()/mkdir()/mknod() take umode_t]) - ZFS_LINUX_TRY_COMPILE([ - #include - ],[ - int (*create) (struct inode *, struct dentry *, umode_t, - struct nameidata *) = NULL; - struct inode_operations iops __attribute__ ((unused)) = { - .create = create, - }; - ],[ - AC_MSG_RESULT(yes) - AC_DEFINE(HAVE_CREATE_UMODE_T, 1, - [iops->create()/mkdir()/mknod() take umode_t]) - ],[ - AC_MSG_RESULT(no) - ]) -]) diff --git a/config/kernel-mkdir-umode-t.m4 b/config/kernel-mkdir-umode-t.m4 new file mode 100644 index 000000000..dd5d94ba9 --- /dev/null +++ b/config/kernel-mkdir-umode-t.m4 @@ -0,0 +1,25 @@ +dnl # +dnl # 3.3 API change +dnl # The VFS .create, .mkdir and .mknod callbacks were updated to take a +dnl # umode_t type rather than an int. The expectation is that any backport +dnl # would also change all three prototypes. However, if it turns out that +dnl # some distribution doesn't backport the whole thing this could be +dnl # broken apart in to three seperate checks. +dnl # +AC_DEFUN([ZFS_AC_KERNEL_MKDIR_UMODE_T], [ + AC_MSG_CHECKING([whether iops->create()/mkdir()/mknod() take umode_t]) + ZFS_LINUX_TRY_COMPILE([ + #include + ],[ + int (*mkdir) (struct inode *,struct dentry *,umode_t) = NULL; + struct inode_operations iops __attribute__ ((unused)) = { + .mkdir = mkdir, + }; + ],[ + AC_MSG_RESULT(yes) + AC_DEFINE(HAVE_MKDIR_UMODE_T, 1, + [iops->create()/mkdir()/mknod() take umode_t]) + ],[ + AC_MSG_RESULT(no) + ]) +]) diff --git a/config/kernel.m4 b/config/kernel.m4 index dd01fb28b..13238d8ac 100644 --- a/config/kernel.m4 +++ b/config/kernel.m4 @@ -49,10 +49,10 @@ 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_MKDIR_UMODE_T ZFS_AC_KERNEL_LOOKUP_NAMEIDATA ZFS_AC_KERNEL_CREATE_NAMEIDATA ZFS_AC_KERNEL_TRUNCATE_RANGE - ZFS_AC_KERNEL_CREATE_UMODE_T ZFS_AC_KERNEL_AUTOMOUNT ZFS_AC_KERNEL_ENCODE_FH_WITH_INODE ZFS_AC_KERNEL_COMMIT_METADATA diff --git a/include/linux/vfs_compat.h b/include/linux/vfs_compat.h index 7181625df..c4e1771ae 100644 --- a/include/linux/vfs_compat.h +++ b/include/linux/vfs_compat.h @@ -115,7 +115,7 @@ set_nlink(struct inode *inode, unsigned int nlink) * umode_t type rather than an int. To cleanly handle both definitions * the zpl_umode_t type is introduced and set accordingly. */ -#ifdef HAVE_CREATE_UMODE_T +#ifdef HAVE_MKDIR_UMODE_T typedef umode_t zpl_umode_t; #else typedef int zpl_umode_t; -- cgit v1.2.3