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;
next prev parent reply other threads:[~2016-11-18 16:21 UTC|newest]
Thread overview: 7+ 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 ` [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 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: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).