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 <ryao@gentoo.org>
Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
Closes #312
This commit is contained in:
Richard Yao 2013-11-25 11:22:33 -05:00 committed by Brian Behlendorf
parent 3e96de17d7
commit 50a0749eba
2 changed files with 55 additions and 19 deletions

View File

@ -1842,41 +1842,73 @@ AC_DEFUN([SPL_AC_SET_FS_PWD_WITH_CONST],
EXTRA_KCFLAGS="$tmp_flags" 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_DEFUN([SPL_AC_2ARGS_VFS_UNLINK],
[AC_MSG_CHECKING([whether vfs_unlink() wants 2 args]) [AC_MSG_CHECKING([whether vfs_unlink() wants 2 args])
SPL_LINUX_TRY_COMPILE([ SPL_LINUX_TRY_COMPILE([
#include <linux/fs.h> #include <linux/fs.h>
],[ ],[
vfs_unlink(NULL, NULL); vfs_unlink((struct inode *) NULL, (struct dentry *) NULL);
],[ ],[
AC_MSG_RESULT(yes) AC_MSG_RESULT(yes)
AC_DEFINE(HAVE_2ARGS_VFS_UNLINK, 1, AC_DEFINE(HAVE_2ARGS_VFS_UNLINK, 1,
[vfs_unlink() wants 2 args]) [vfs_unlink() wants 2 args])
],[ ],[
AC_MSG_RESULT(no) 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 <linux/fs.h>
],[
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_DEFUN([SPL_AC_4ARGS_VFS_RENAME],
[AC_MSG_CHECKING([whether vfs_rename() wants 4 args]) [AC_MSG_CHECKING([whether vfs_rename() wants 4 args])
SPL_LINUX_TRY_COMPILE([ SPL_LINUX_TRY_COMPILE([
#include <linux/fs.h> #include <linux/fs.h>
],[ ],[
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_MSG_RESULT(yes)
AC_DEFINE(HAVE_4ARGS_VFS_RENAME, 1, AC_DEFINE(HAVE_4ARGS_VFS_RENAME, 1,
[vfs_rename() wants 4 args]) [vfs_rename() wants 4 args])
],[ ],[
AC_MSG_RESULT(no) 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 <linux/fs.h>
],[
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)
])
]) ])
]) ])

View File

@ -334,7 +334,11 @@ vn_remove(const char *path, uio_seg_t seg, int flags)
if (inode) if (inode)
ihold(inode); ihold(inode);
#ifdef HAVE_2ARGS_VFS_UNLINK
rc = vfs_unlink(parent.dentry->d_inode, dentry); rc = vfs_unlink(parent.dentry->d_inode, dentry);
#else
rc = vfs_unlink(parent.dentry->d_inode, dentry, NULL);
#endif /* HAVE_2ARGS_VFS_UNLINK */
exit1: exit1:
dput(dentry); dput(dentry);
} else { } else {
@ -412,10 +416,10 @@ vn_rename(const char *oldname, const char *newname, int x1)
#ifdef HAVE_4ARGS_VFS_RENAME #ifdef HAVE_4ARGS_VFS_RENAME
rc = vfs_rename(old_dir->d_inode, old_dentry, rc = vfs_rename(old_dir->d_inode, old_dentry,
new_dir->d_inode, new_dentry); new_dir->d_inode, new_dentry);
#else #else
rc = vfs_rename(old_dir->d_inode, old_dentry, oldnd.nd_mnt, rc = vfs_rename(old_dir->d_inode, old_dentry,
new_dir->d_inode, new_dentry, newnd.nd_mnt); new_dir->d_inode, new_dentry, NULL);
#endif /* HAVE_4ARGS_VFS_RENAME */ #endif /* HAVE_4ARGS_VFS_RENAME */
exit4: exit4:
unlock_rename(new_dir, old_dir); unlock_rename(new_dir, old_dir);
@ -478,9 +482,9 @@ vn_remove(const char *path, uio_seg_t seg, int flags)
if (inode) if (inode)
atomic_inc(&inode->i_count); atomic_inc(&inode->i_count);
#ifdef HAVE_2ARGS_VFS_UNLINK #ifdef HAVE_2ARGS_VFS_UNLINK
rc = vfs_unlink(nd.nd_dentry->d_inode, dentry); rc = vfs_unlink(nd.nd_dentry->d_inode, dentry);
#else #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 */ #endif /* HAVE_2ARGS_VFS_UNLINK */
exit2: exit2:
dput(dentry); dput(dentry);
@ -571,11 +575,11 @@ vn_rename(const char *oldname, const char *newname, int x1)
SGOTO(exit5, rc); SGOTO(exit5, rc);
#ifdef HAVE_4ARGS_VFS_RENAME #ifdef HAVE_4ARGS_VFS_RENAME
rc = vfs_rename(old_dir->d_inode, old_dentry, rc = vfs_rename(old_dir->d_inode, old_dentry,
new_dir->d_inode, new_dentry); new_dir->d_inode, new_dentry);
#else #else
rc = vfs_rename(old_dir->d_inode, old_dentry, oldnd.nd_mnt, rc = vfs_rename(old_dir->d_inode, old_dentry,
new_dir->d_inode, new_dentry, newnd.nd_mnt); new_dir->d_inode, new_dentry, NULL);
#endif /* HAVE_4ARGS_VFS_RENAME */ #endif /* HAVE_4ARGS_VFS_RENAME */
exit5: exit5:
dput(new_dentry); dput(new_dentry);