Linux v4.11: getattr takes struct path 88/12588/2
authorJoe Gorse <jhgorse@gmail.com>
Mon, 20 Mar 2017 14:30:46 +0000 (14:30 +0000)
committerStephan Wiesand <stephan.wiesand@desy.de>
Thu, 13 Apr 2017 11:16:39 +0000 (07:16 -0400)
With Linux commit a528d35e8bfcc521d7cb70aaf03e1bd296c8493f

    statx: Add a system call to make enhanced file info available

The Linux getattr inode operation is altered to take two additional
arguments: a u32 request_mask and an unsigned int flags that indicate
the synchronisation mode.  This change is propagated to the
vfs_getattr*() function.

-   int (*getattr) (struct vfsmount *, struct dentry *, struct kstat *);
+   int (*getattr) (const struct path *, struct kstat *,
+                     u32 request_mask, unsigned int sync_mode);

The first argument, request_mask, indicates which fields of the statx
structure are of interest to the userland call. The second argument,
flags, currently may take the values defined in
include/uapi/linux/fcntl.h and are optionally used for cache coherence:

 (1) AT_STATX_SYNC_AS_STAT tells statx() to behave as stat() does.

 (2) AT_STATX_FORCE_SYNC will require a network filesystem to
     synchronise its attributes with the server - which might require
     data writeback to occur to get the timestamps correct.

 (3) AT_STATX_DONT_SYNC will suppress synchronisation with the server in
     a network filesystem.  The resulting values should be considered
     approximate.

This patch provides a new autoconf test and conditional compilation to
cope with the changes in our getattr implementation.

Reviewed-on: https://gerrit.openafs.org/12572
Reviewed-by: Joe Gorse <jhgorse@gmail.com>
Tested-by: Joe Gorse <jhgorse@gmail.com>
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Reviewed-by: Michael Meffie <mmeffie@sinenomine.net>
Reviewed-by: Mark Vitale <mvitale@sinenomine.net>
Reviewed-by: Benjamin Kaduk <kaduk@mit.edu>
(cherry picked from commit de5ee1a67d1c3284d65dc69bbbf89664af70b357)

Change-Id: I41ff134e1e71944f0629c9837d38cfbc495264c8
Reviewed-on: https://gerrit.openafs.org/12588
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Reviewed-by: Mark Vitale <mvitale@sinenomine.net>
Reviewed-by: Stephan Wiesand <stephan.wiesand@desy.de>

acinclude.m4
src/afs/LINUX/osi_vnodeops.c
src/cf/linux-test4.m4

index 53ffcc5..9515747 100644 (file)
@@ -1112,6 +1112,7 @@ case $AFS_SYSNAME in *_linux* | *_umlinux*)
                 LINUX_REGISTER_SYSCTL_TABLE_NOFLAG
                 LINUX_HAVE_DCACHE_LOCK
                 LINUX_D_COUNT_IS_INT
+                LINUX_IOP_GETATTR_TAKES_PATH_STRUCT
                 LINUX_IOP_MKDIR_TAKES_UMODE_T
                 LINUX_IOP_CREATE_TAKES_UMODE_T
                 LINUX_EXPORT_OP_ENCODE_FH_TAKES_INODES
index 816cddd..f46d8dd 100644 (file)
@@ -1127,15 +1127,27 @@ out:
     return afs_convert_code(code);
 }
 
+#if defined(IOP_GETATTR_TAKES_PATH_STRUCT)
+static int
+afs_linux_getattr(const struct path *path, struct kstat *stat, u32 request_mask, unsigned int sync_mode)
+{
+       int err = afs_linux_revalidate(path->dentry);
+       if (!err) {
+                generic_fillattr(path->dentry->d_inode, stat);
+       }
+       return err;
+}
+#else
 static int
 afs_linux_getattr(struct vfsmount *mnt, struct dentry *dentry, struct kstat *stat)
 {
         int err = afs_linux_revalidate(dentry);
         if (!err) {
                 generic_fillattr(dentry->d_inode, stat);
+       }
+       return err;
 }
-        return err;
-}
+#endif
 
 /* Validate a dentry. Return 1 if unchanged, 0 if VFS layer should re-evaluate.
  * In kernels 2.2.10 and above, we are passed an additional flags var which
index 604d380..194c1ef 100644 (file)
@@ -651,6 +651,18 @@ AC_DEFUN([LINUX_DOP_D_DELETE_TAKES_CONST], [
                        [-Werror])
 ])
 
+AC_DEFUN([LINUX_IOP_GETATTR_TAKES_PATH_STRUCT], [
+  AC_CHECK_LINUX_BUILD([whether 4.11+ inode.i_op->getattr takes a struct path argument],
+                        [ac_cv_linux_iop_getattr_takes_path_struct],
+                        [#include <linux/fs.h>
+                        int _getattr(const struct path *path, struct kstat *stat, u32 request_mask,
+                          unsigned int sync_mode) {return 0;};
+                        struct inode_operations _i_ops;],
+                        [_i_ops.getattr = _getattr;],
+                        [IOP_GETATTR_TAKES_PATH_STRUCT],
+                        [define if 4.11+ inode.i_op->getattr takes a struct path argument],
+                        [-Werror])
+])
 
 AC_DEFUN([LINUX_IOP_MKDIR_TAKES_UMODE_T], [
   AC_CHECK_LINUX_BUILD([whether inode.i_op->mkdir takes a umode_t argument],