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 #2] Date: Fri, 18 Nov 2016 16:20:52 +0000 [thread overview] Message-ID: <147948605248.5122.10980680031719884756.stgit@warthog.procyon.org.uk> (raw) In-Reply-To: <147948603103.5122.1043337990092830185.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;
WARNING: multiple messages have this Message-ID (diff)
From: David Howells <dhowells-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org> To: linux-fsdevel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org Cc: dhowells-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org, linux-api-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org Subject: [PATCH 3/4] statx: NFS: Return enhanced file attributes [ver #2] Date: Fri, 18 Nov 2016 16:20:52 +0000 [thread overview] Message-ID: <147948605248.5122.10980680031719884756.stgit@warthog.procyon.org.uk> (raw) In-Reply-To: <147948603103.5122.1043337990092830185.stgit-S6HVgzuS8uM4Awkfq6JHfwNdhmdF6hFW@public.gmane.org> 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-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org> --- 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;
next prev parent reply other threads:[~2016-11-18 16:21 UTC|newest] Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top 2016-11-18 16:20 [RFC][PATCH 0/4] Enhanced file stat system call [ver #2] David Howells 2016-11-18 16:20 ` David Howells 2016-11-18 16:20 ` [PATCH 1/4] statx: Add a system call to make enhanced file info available " David Howells 2016-11-18 16:57 ` Arnd Bergmann 2016-11-18 16:20 ` [PATCH 2/4] statx: Ext4: Return enhanced file attributes " David Howells 2016-11-18 18:02 ` Andreas Dilger 2016-11-18 16:20 ` David Howells [this message] 2016-11-18 16:20 ` [PATCH 3/4] statx: NFS: " David Howells 2016-11-18 16:20 ` [PATCH 4/4] statx: AFS: " David Howells
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=147948605248.5122.10980680031719884756.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 \ /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: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
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.