All of lore.kernel.org
 help / color / mirror / Atom feed
From: David Howells <dhowells@redhat.com>
To: linux-fsdevel@vger.kernel.org
Cc: dhowells@redhat.com, linux-api@vger.kernel.org,
	linux-kernel@vger.kernel.org
Subject: [PATCH 3/4] statx: NFS: Return enhanced file attributes [ver #3]
Date: Wed, 23 Nov 2016 00:56:06 +0000	[thread overview]
Message-ID: <147986256611.19139.1662089024935161714.stgit@warthog.procyon.org.uk> (raw)
In-Reply-To: <147986254484.19139.8038609825799670925.stgit@warthog.procyon.org.uk>

Return enhanced file atrributes from the NFS filesystem.  This includes the
following:

 (1) STATX_ATTR_AUTOMOUNT is set on referral or submount directories that
     are automounted upon.  NFS shows one directory with a different FSID,
     but the local VFS has two: the mountpoint directory (fabricated) and
     the root of the filesystem mounted upon it.

Furthermore, what nfs_getattr() does can be controlled as follows:

 (1) If AT_STATX_DONT_SYNC is indicated then this will suppress the
     flushing of outstanding writes and the rereading of the inode's
     attributes with the server as detailed below.

 (2) Otherwise:

     (a) If AT_STATX_FORCE_SYNC is indicated, or mtime or ctime are
     	 requested then the outstanding writes will be written to the
     	 server first.

     (b) The inode's attributes will be reread from the server:

     	 (i) if AT_STATX_FORCE_SYNC is indicated;

        (ii) if atime is requested (and atime updating is not suppressed by
     	     a mount flag); or

       (iii) if the cached attributes have expired;

If the inode isn't synchronised, then the cached attributes will be used -
even if expired - without reference to the server.

Example output:

	[root@andromeda ~]# ./samples/statx/test-statx /warthog/
	statx(/warthog/) = 0
	results=17ff
	  Size: 4096            Blocks: 8          IO Block: 1048576  directory
	Device: 00:26           Inode: 2           Links: 21
	Access: (0555/dr-xr-xr-x)  Uid:     0   Gid:     0
	Access: 2016-11-14 11:49:14.582749262+0000
	Modify: 2016-09-08 20:39:46.785788707+0100
	Change: 2016-09-08 20:39:46.785788707+0100
	IO-blocksize: blksize=1048576

Note that the NFS4 protocol potentially provides a creation time that could
be passed through this interface and system, hidden and archive values that
could be passed as attributes.  There is also a backup time that could be
exposed.

Signed-off-by: David Howells <dhowells@redhat.com>
---

 fs/nfs/inode.c |   32 ++++++++++++++++++++++++--------
 1 file changed, 24 insertions(+), 8 deletions(-)

diff --git a/fs/nfs/inode.c b/fs/nfs/inode.c
index bf4ec5ecc97e..3002350d4a84 100644
--- a/fs/nfs/inode.c
+++ b/fs/nfs/inode.c
@@ -656,12 +656,20 @@ static bool nfs_need_revalidate_inode(struct inode *inode)
 int nfs_getattr(struct vfsmount *mnt, struct dentry *dentry, struct kstat *stat)
 {
 	struct inode *inode = d_inode(dentry);
-	int need_atime = NFS_I(inode)->cache_validity & NFS_INO_INVALID_ATIME;
+	unsigned int sync_type = stat->query_flags & AT_STATX_SYNC_TYPE;
+	bool need_atime = NFS_I(inode)->cache_validity & NFS_INO_INVALID_ATIME;
 	int err = 0;
 
 	trace_nfs_getattr_enter(inode);
-	/* Flush out writes to the server in order to update c/mtime.  */
-	if (S_ISREG(inode->i_mode)) {
+
+	/* Flush out writes to the server in order to update c/mtime if the
+	 * user wants them.
+	 */
+	if (sync_type != AT_STATX_DONT_SYNC &&
+	    S_ISREG(inode->i_mode) &&
+	    (sync_type == AT_STATX_FORCE_SYNC ||
+	     (stat->request_mask & (STATX_MTIME | STATX_CTIME)))
+	    ) {
 		err = filemap_write_and_wait(inode->i_mapping);
 		if (err)
 			goto out;
@@ -676,11 +684,15 @@ int nfs_getattr(struct vfsmount *mnt, struct dentry *dentry, struct kstat *stat)
 	 *  - NFS never sets MS_NOATIME or MS_NODIRATIME so there is
 	 *    no point in checking those.
 	 */
- 	if ((mnt->mnt_flags & MNT_NOATIME) ||
- 	    ((mnt->mnt_flags & MNT_NODIRATIME) && S_ISDIR(inode->i_mode)))
-		need_atime = 0;
-
-	if (need_atime || nfs_need_revalidate_inode(inode)) {
+	if (!(stat->request_mask & STATX_ATIME) ||
+	    (mnt->mnt_flags & MNT_NOATIME) ||
+	    ((mnt->mnt_flags & MNT_NODIRATIME) && S_ISDIR(inode->i_mode)))
+		need_atime = false;
+
+	if (sync_type != AT_STATX_DONT_SYNC &&
+	    (sync_type == AT_STATX_FORCE_SYNC ||
+	     need_atime ||
+	     nfs_need_revalidate_inode(inode))) {
 		struct nfs_server *server = NFS_SERVER(inode);
 
 		if (server->caps & NFS_CAP_READDIRPLUS)
@@ -693,6 +705,10 @@ int nfs_getattr(struct vfsmount *mnt, struct dentry *dentry, struct kstat *stat)
 		if (S_ISDIR(inode->i_mode))
 			stat->blksize = NFS_SERVER(inode)->dtsize;
 	}
+
+	generic_fillattr(inode, stat);
+	stat->ino = nfs_compat_user_ino64(NFS_FILEID(inode));
+
 out:
 	trace_nfs_getattr_exit(inode, err);
 	return err;

  parent reply	other threads:[~2016-11-23  0:59 UTC|newest]

Thread overview: 31+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-11-23  0:55 [RFC][PATCH 0/4] Enhanced file stat system call " David Howells
2016-11-23  0:55 ` [PATCH 1/4] statx: Add a system call to make enhanced file info available " David Howells
2016-11-23  8:37   ` Michael Kerrisk (man-pages)
2016-11-23 22:42     ` Andreas Dilger
     [not found]     ` <768343b5-e9b4-a86c-53de-2929bc290342-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2016-11-23 22:42       ` Andreas Dilger
2016-11-23 22:57       ` Andreas Dilger
2016-11-24  8:13         ` Michael Kerrisk (man-pages)
     [not found]         ` <19284F6D-73B9-4A1A-8227-2B2B87F29FE9-m1MBpc4rdrD3fQ9qLvQP4Q@public.gmane.org>
2016-11-24  8:13           ` Michael Kerrisk (man-pages)
2016-11-23 22:57     ` Andreas Dilger
     [not found]   ` <147986255194.19139.9583434946564699577.stgit-S6HVgzuS8uM4Awkfq6JHfwNdhmdF6hFW@public.gmane.org>
2016-11-24  2:08     ` Andreas Dilger
2016-11-24  2:08   ` Andreas Dilger
2016-11-24  7:27   ` David Howells
     [not found]   ` <D1A5E76A-5739-42FE-A451-B49CD1699DB0-m1MBpc4rdrD3fQ9qLvQP4Q@public.gmane.org>
2016-11-24  7:27     ` David Howells
2016-12-04  4:00   ` Al Viro
2016-12-04  4:38   ` Al Viro
2016-12-04 16:05     ` Al Viro
2016-12-04 17:33     ` Al Viro
     [not found]     ` <20161204043803.GA1022-3bDd1+5oDREiFSDQTTA3OLVCufUGDwFn@public.gmane.org>
2016-12-04 17:33       ` Al Viro
2016-12-05 14:49         ` Miklos Szeredi
     [not found]         ` <20161204173317.GH1555-3bDd1+5oDREiFSDQTTA3OLVCufUGDwFn@public.gmane.org>
2016-12-05 14:49           ` Miklos Szeredi
     [not found]     ` <20161204160504.GG1555-3bDd1+5oDREiFSDQTTA3OLVCufUGDwFn@public.gmane.org>
2016-12-05 15:37       ` David Howells
2016-12-05 15:37     ` David Howells
2016-11-23  0:55 ` [PATCH 2/4] statx: Ext4: Return enhanced file attributes " David Howells
     [not found]   ` <147986255921.19139.6012507332848890196.stgit-S6HVgzuS8uM4Awkfq6JHfwNdhmdF6hFW@public.gmane.org>
2016-11-23 17:59     ` Andreas Dilger
2016-11-23 17:59   ` Andreas Dilger
2016-11-23  0:56 ` David Howells [this message]
2016-11-23  0:56 ` [PATCH 4/4] statx: AFS: " David Howells
     [not found] ` <147986254484.19139.8038609825799670925.stgit-S6HVgzuS8uM4Awkfq6JHfwNdhmdF6hFW@public.gmane.org>
2016-11-23  0:56   ` David Howells
2016-11-24  2:06     ` Andreas Dilger
     [not found]     ` <147986257312.19139.10417237189956494459.stgit-S6HVgzuS8uM4Awkfq6JHfwNdhmdF6hFW@public.gmane.org>
2016-11-24  2:06       ` Andreas Dilger

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=147986256611.19139.1662089024935161714.stgit@warthog.procyon.org.uk \
    --to=dhowells@redhat.com \
    --cc=linux-api@vger.kernel.org \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --subject='Re: [PATCH 3/4] statx: NFS: Return enhanced file attributes [ver #3]' \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.