From 50a0749eba31e821a7edf286f1e3b149f7d13c59 Mon Sep 17 00:00:00 2001 From: Richard Yao Date: Mon, 25 Nov 2013 11:22:33 -0500 Subject: [PATCH] Linux 3.13 compat: Pass NULL for new delegated inode argument This check was originally added for SLES10, a093c6a, to check for a 'struct vfsmount *' argument which they added. However, since SLES10 is based on a 2.6.16 kernel which is no longer supported this functionality was dropped. The checks were refactored to support Linux 3.13 without concern for historical versions. Signed-off-by: Richard Yao Signed-off-by: Brian Behlendorf Closes #312 --- config/spl-build.m4 | 52 ++++++++++++++++++++++++++++++++++++++++---------- module/spl/spl-vnode.c | 22 ++++++++++++--------- 2 files changed, 55 insertions(+), 19 deletions(-) diff --git a/config/spl-build.m4 b/config/spl-build.m4 index 7d744db..8426780 100644 --- a/config/spl-build.m4 +++ b/config/spl-build.m4 @@ -1842,41 +1842,73 @@ AC_DEFUN([SPL_AC_SET_FS_PWD_WITH_CONST], EXTRA_KCFLAGS="$tmp_flags" ]) -dnl # -dnl # SLES API change, never adopted in mainline, -dnl # Third 'struct vfsmount *' argument removed. -dnl # AC_DEFUN([SPL_AC_2ARGS_VFS_UNLINK], [AC_MSG_CHECKING([whether vfs_unlink() wants 2 args]) SPL_LINUX_TRY_COMPILE([ #include ],[ - vfs_unlink(NULL, NULL); + vfs_unlink((struct inode *) NULL, (struct dentry *) NULL); ],[ AC_MSG_RESULT(yes) AC_DEFINE(HAVE_2ARGS_VFS_UNLINK, 1, [vfs_unlink() wants 2 args]) ],[ AC_MSG_RESULT(no) + dnl # + dnl # Linux 3.13 API change + dnl # Added delegated inode + dnl # + AC_MSG_CHECKING([whether vfs_unlink() wants 3 args]) + SPL_LINUX_TRY_COMPILE([ + #include + ],[ + vfs_unlink((struct inode *) NULL, + (struct dentry *) NULL, + (struct inode **) NULL); + ],[ + AC_MSG_RESULT(yes) + AC_DEFINE(HAVE_3ARGS_VFS_UNLINK, 1, + [vfs_unlink() wants 3 args]) + ],[ + AC_MSG_ERROR(no) + ]) + ]) ]) -dnl # -dnl # SLES API change, never adopted in mainline, -dnl # Third and sixth 'struct vfsmount *' argument removed. -dnl # AC_DEFUN([SPL_AC_4ARGS_VFS_RENAME], [AC_MSG_CHECKING([whether vfs_rename() wants 4 args]) SPL_LINUX_TRY_COMPILE([ #include ],[ - vfs_rename(NULL, NULL, NULL, NULL); + vfs_rename((struct inode *) NULL, (struct dentry *) NULL, + (struct inode *) NULL, (struct dentry *) NULL); ],[ AC_MSG_RESULT(yes) AC_DEFINE(HAVE_4ARGS_VFS_RENAME, 1, [vfs_rename() wants 4 args]) ],[ AC_MSG_RESULT(no) + dnl # + dnl # Linux 3.13 API change + dnl # Added delegated inode + dnl # + AC_MSG_CHECKING([whether vfs_rename() wants 5 args]) + SPL_LINUX_TRY_COMPILE([ + #include + ],[ + vfs_rename((struct inode *) NULL, + (struct dentry *) NULL, + (struct inode *) NULL, + (struct dentry *) NULL, + (struct inode **) NULL); + ],[ + AC_MSG_RESULT(yes) + AC_DEFINE(HAVE_5ARGS_VFS_RENAME, 1, + [vfs_rename() wants 5 args]) + ],[ + AC_MSG_ERROR(no) + ]) ]) ]) diff --git a/module/spl/spl-vnode.c b/module/spl/spl-vnode.c index 0784ff2..5496067 100644 --- a/module/spl/spl-vnode.c +++ b/module/spl/spl-vnode.c @@ -334,7 +334,11 @@ vn_remove(const char *path, uio_seg_t seg, int flags) if (inode) ihold(inode); +#ifdef HAVE_2ARGS_VFS_UNLINK rc = vfs_unlink(parent.dentry->d_inode, dentry); +#else + rc = vfs_unlink(parent.dentry->d_inode, dentry, NULL); +#endif /* HAVE_2ARGS_VFS_UNLINK */ exit1: dput(dentry); } else { @@ -412,10 +416,10 @@ vn_rename(const char *oldname, const char *newname, int x1) #ifdef HAVE_4ARGS_VFS_RENAME rc = vfs_rename(old_dir->d_inode, old_dentry, - new_dir->d_inode, new_dentry); + new_dir->d_inode, new_dentry); #else - rc = vfs_rename(old_dir->d_inode, old_dentry, oldnd.nd_mnt, - new_dir->d_inode, new_dentry, newnd.nd_mnt); + rc = vfs_rename(old_dir->d_inode, old_dentry, + new_dir->d_inode, new_dentry, NULL); #endif /* HAVE_4ARGS_VFS_RENAME */ exit4: unlock_rename(new_dir, old_dir); @@ -478,9 +482,9 @@ vn_remove(const char *path, uio_seg_t seg, int flags) if (inode) atomic_inc(&inode->i_count); #ifdef HAVE_2ARGS_VFS_UNLINK - rc = vfs_unlink(nd.nd_dentry->d_inode, dentry); + rc = vfs_unlink(nd.nd_dentry->d_inode, dentry); #else - rc = vfs_unlink(nd.nd_dentry->d_inode, dentry, nd.nd_mnt); + rc = vfs_unlink(nd.nd_dentry->d_inode, dentry, NULL); #endif /* HAVE_2ARGS_VFS_UNLINK */ exit2: dput(dentry); @@ -571,11 +575,11 @@ vn_rename(const char *oldname, const char *newname, int x1) SGOTO(exit5, rc); #ifdef HAVE_4ARGS_VFS_RENAME - rc = vfs_rename(old_dir->d_inode, old_dentry, - new_dir->d_inode, new_dentry); + rc = vfs_rename(old_dir->d_inode, old_dentry, + new_dir->d_inode, new_dentry); #else - rc = vfs_rename(old_dir->d_inode, old_dentry, oldnd.nd_mnt, - new_dir->d_inode, new_dentry, newnd.nd_mnt); + rc = vfs_rename(old_dir->d_inode, old_dentry, + new_dir->d_inode, new_dentry, NULL); #endif /* HAVE_4ARGS_VFS_RENAME */ exit5: dput(new_dentry); -- 1.9.3 From 3e96de17d723d6f6c9e2fd04b059b50d4e0bbef0 Mon Sep 17 00:00:00 2001 From: Richard Yao Date: Thu, 8 Aug 2013 04:30:55 -0400 Subject: [PATCH] Linux 3.13 compat: Remove unused flags variable from __cv_init() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit GCC 4.8.1 complained about an unused flags variable when building against Linux 2.6.26.8: /var/tmp/portage/sys-kernel/spl-9999/work/spl-9999/module/spl/../../module/spl/spl-condvar.c: In function ‘__cv_init’: /var/tmp/portage/sys-kernel/spl-9999/work/spl-9999/module/spl/../../module/spl/spl-condvar.c:39:6: error: variable ‘flags’ set but not used [-Werror=unused-but-set-variable] int flags = KM_SLEEP; ^ cc1: all warnings being treated as errors Additionally, the superfluous code uses a preempt_count variable that is no longer available on Linux 3.13. Deleting the unnecessary code fixes a Linux 3.13 compatibility issue. Signed-off-by: Richard Yao Signed-off-by: Brian Behlendorf Closes #312 --- module/spl/spl-condvar.c | 8 -------- 1 file changed, 8 deletions(-) diff --git a/module/spl/spl-condvar.c b/module/spl/spl-condvar.c index 283648a..8236412 100644 --- a/module/spl/spl-condvar.c +++ b/module/spl/spl-condvar.c @@ -36,8 +36,6 @@ void __cv_init(kcondvar_t *cvp, char *name, kcv_type_t type, void *arg) { - int flags = KM_SLEEP; - SENTRY; ASSERT(cvp); ASSERT(name == NULL); @@ -51,12 +49,6 @@ __cv_init(kcondvar_t *cvp, char *name, kcv_type_t type, void *arg) atomic_set(&cvp->cv_refs, 1); cvp->cv_mutex = NULL; - /* We may be called when there is a non-zero preempt_count or - * interrupts are disabled is which case we must not sleep. - */ - if (current_thread_info()->preempt_count || irqs_disabled()) - flags = KM_NOSLEEP; - SEXIT; } EXPORT_SYMBOL(__cv_init); -- 1.9.3