diff --git a/config/spl-build.m4 b/config/spl-build.m4 index 8d0e8aba..7c428a17 100644 --- a/config/spl-build.m4 +++ b/config/spl-build.m4 @@ -43,7 +43,7 @@ AC_DEFUN([SPL_AC_CONFIG_KERNEL], [ SPL_AC_RWSEM_ACTIVITY SPL_AC_RWSEM_ATOMIC_LONG_COUNT SPL_AC_SCHED_RT_HEADER - SPL_AC_2ARGS_VFS_GETATTR + SPL_AC_4ARGS_VFS_GETATTR SPL_AC_USLEEP_RANGE SPL_AC_KMEM_CACHE_ALLOCFLAGS SPL_AC_WAIT_ON_BIT @@ -1409,33 +1409,52 @@ AC_DEFUN([SPL_AC_SCHED_RT_HEADER], ]) ]) + +dnl # +dnl # 4.11 API change, a528d35e@torvalds/linux +dnl # vfs_getattr() uses 4 args dnl # dnl # 3.9 API change, dnl # vfs_getattr() uses 2 args dnl # It takes struct path * instead of struct vfsmount * and struct dentry * dnl # -AC_DEFUN([SPL_AC_2ARGS_VFS_GETATTR], [ +AC_DEFUN([SPL_AC_4ARGS_VFS_GETATTR], [ AC_MSG_CHECKING([whether vfs_getattr() wants]) SPL_LINUX_TRY_COMPILE([ #include ],[ - vfs_getattr((struct path *) NULL, - (struct kstat *)NULL); + vfs_getattr((const struct path *)NULL, + (struct kstat *)NULL, + (u32)0, + (unsigned int)0); ],[ - AC_MSG_RESULT(2 args) - AC_DEFINE(HAVE_2ARGS_VFS_GETATTR, 1, - [vfs_getattr wants 2 args]) + AC_MSG_RESULT(4 args) + AC_DEFINE(HAVE_4ARGS_VFS_GETATTR, 1, + [vfs_getattr wants 4 args]) ],[ SPL_LINUX_TRY_COMPILE([ #include ],[ - vfs_getattr((struct vfsmount *)NULL, - (struct dentry *)NULL, + vfs_getattr((struct path *) NULL, (struct kstat *)NULL); ],[ - AC_MSG_RESULT(3 args) + AC_MSG_RESULT(2 args) + AC_DEFINE(HAVE_2ARGS_VFS_GETATTR, 1, + [vfs_getattr wants 2 args]) ],[ - AC_MSG_ERROR(unknown) + SPL_LINUX_TRY_COMPILE([ + #include + ],[ + vfs_getattr((struct vfsmount *)NULL, + (struct dentry *)NULL, + (struct kstat *)NULL); + ],[ + AC_MSG_RESULT(3 args) + AC_DEFINE(HAVE_3ARGS_VFS_GETATTR, 1, + [vfs_getattr wants 3 args]) + ],[ + AC_MSG_ERROR(unknown) + ]) ]) ]) ]) diff --git a/module/spl/spl-vnode.c b/module/spl/spl-vnode.c index cd276b5c..f1eef8f7 100644 --- a/module/spl/spl-vnode.c +++ b/module/spl/spl-vnode.c @@ -153,7 +153,9 @@ vn_open(const char *path, uio_seg_t seg, int flags, int mode, if (IS_ERR(fp)) return (-PTR_ERR(fp)); -#ifdef HAVE_2ARGS_VFS_GETATTR +#if defined(HAVE_4ARGS_VFS_GETATTR) + rc = vfs_getattr(&fp->f_path, &stat, STATX_MODE, AT_STATX_SYNC_AS_STAT); +#elif defined(HAVE_2ARGS_VFS_GETATTR) rc = vfs_getattr(&fp->f_path, &stat); #else rc = vfs_getattr(fp->f_path.mnt, fp->f_dentry, &stat); @@ -510,7 +512,10 @@ vn_getattr(vnode_t *vp, vattr_t *vap, int flags, void *x3, void *x4) fp = vp->v_file; -#ifdef HAVE_2ARGS_VFS_GETATTR +#if defined(HAVE_4ARGS_VFS_GETATTR) + rc = vfs_getattr(&fp->f_path, &stat, STATX_BASIC_STATS, + AT_STATX_SYNC_AS_STAT); +#elif defined(HAVE_2ARGS_VFS_GETATTR) rc = vfs_getattr(&fp->f_path, &stat); #else rc = vfs_getattr(fp->f_path.mnt, fp->f_dentry, &stat); @@ -708,7 +713,9 @@ vn_getf(int fd) if (vp == NULL) goto out_fget; -#ifdef HAVE_2ARGS_VFS_GETATTR +#if defined(HAVE_4ARGS_VFS_GETATTR) + rc = vfs_getattr(&lfp->f_path, &stat, STATX_MODE, AT_STATX_SYNC_AS_STAT); +#elif defined(HAVE_2ARGS_VFS_GETATTR) rc = vfs_getattr(&lfp->f_path, &stat); #else rc = vfs_getattr(lfp->f_path.mnt, lfp->f_dentry, &stat);