From: David Howells <dhowells@redhat.com>
To: arnd@arndb.de
Cc: linux-afs@vger.kernel.org, linux-nfs@vger.kernel.org,
linux-cifs@vger.kernel.org, samba-technical@lists.samba.org,
linux-kernel@vger.kernel.org, dhowells@redhat.com,
linux-fsdevel@vger.kernel.org, linux-ext4@vger.kernel.org
Subject: [PATCH 06/12] statx: NFS: Return enhanced file attributes
Date: Fri, 20 Nov 2015 14:55:35 +0000 [thread overview]
Message-ID: <20151120145535.18930.14054.stgit@warthog.procyon.org.uk> (raw)
In-Reply-To: <20151120145422.18930.72662.stgit@warthog.procyon.org.uk>
Return enhanced file atrributes from the NFS filesystem. This includes the
following:
(1) The change attribute as st_version if NFSv4.
(2) STATX_INFO_AUTOMOUNT and STATX_INFO_FABRICATED are set on referral or
submount directories that are automounted upon. NFS shows one
directory with a different FSID, but the local filesystem has two: the
mountpoint directory and the root of the filesystem mounted upon it.
(3) STATX_INFO_REMOTE is set on files acquired over NFS.
(4) STATX_IOC_FLAGS is set and if the atime is unavailable on a file,
st_ioc_flags will have FL_NOATIME_FL set in it.
Furthermore, what nfs_getattr() does can be controlled as follows:
(1) If AT_NO_ATTR_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_FORCE_ATTR_SYNC is indicated, or mtime, ctime or
data_version (NFSv4 only) 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_FORCE_ATTR_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=37ef
Size: 4096 Blocks: 8 IO Block: 1048576 directory
Device: 00:26 Inode: 2 Links: 122
Access: (3777/drwxrwxrwx) Uid: 0 Gid: 4041
Access: 2015-10-30 16:15:41.730925545+0000
Modify: 2015-10-07 10:33:19.896108112+0100
Change: 2015-10-07 10:33:19.896108112+0100
Data version: 5614e6df35698650h
Inode flags: 00000000 (-------- -------- -------- --------)
Information: 00000010 (-------- -------- -------- ---r----)
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 IOC flags. There is also a backup time that could be
added.
Signed-off-by: David Howells <dhowells@redhat.com>
---
fs/nfs/inode.c | 45 ++++++++++++++++++++++++++++++++++++++-------
1 file changed, 38 insertions(+), 7 deletions(-)
diff --git a/fs/nfs/inode.c b/fs/nfs/inode.c
index 326d9e10d833..4d86663e37b2 100644
--- a/fs/nfs/inode.c
+++ b/fs/nfs/inode.c
@@ -645,12 +645,23 @@ 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;
+ bool force_sync = stat->query_flags & AT_FORCE_ATTR_SYNC;
+ bool suppress_sync = stat->query_flags & AT_NO_ATTR_SYNC;
+ 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)) {
+
+ if (NFS_SERVER(inode)->nfs_client->rpc_ops->version < 4)
+ stat->request_mask &= ~STATX_VERSION;
+
+ /* Flush out writes to the server in order to update c/mtime or data
+ * version if the user wants them.
+ */
+ if (S_ISREG(inode->i_mode) && !suppress_sync &&
+ (force_sync || (stat->request_mask &
+ (STATX_MTIME | STATX_CTIME | STATX_VERSION)))
+ ) {
mutex_lock(&inode->i_mutex);
err = nfs_sync_inode(inode);
mutex_unlock(&inode->i_mutex);
@@ -667,11 +678,16 @@ 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 ((mnt->mnt_flags & MNT_NOATIME) ||
+ ((mnt->mnt_flags & MNT_NODIRATIME) && S_ISDIR(inode->i_mode))) {
+ stat->ioc_flags |= FS_NOATIME_FL;
+ need_atime = false;
+ } else if (!(stat->request_mask & STATX_ATIME)) {
+ need_atime = false;
+ }
- if (need_atime || nfs_need_revalidate_inode(inode)) {
+ if (!suppress_sync &&
+ (force_sync || need_atime || nfs_need_revalidate_inode(inode))) {
struct nfs_server *server = NFS_SERVER(inode);
if (server->caps & NFS_CAP_READDIRPLUS)
@@ -684,6 +700,21 @@ 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));
+
+ if (stat->request_mask & STATX_VERSION) {
+ stat->version = inode->i_version;
+ stat->result_mask |= STATX_VERSION;
+ }
+
+ if (IS_AUTOMOUNT(inode))
+ stat->information |= STATX_INFO_FABRICATED;
+
+ stat->information |= STATX_INFO_REMOTE;
+ stat->result_mask |= STATX_IOC_FLAGS;
+
out:
trace_nfs_getattr_exit(inode, err);
return err;
next prev parent reply other threads:[~2015-11-20 14:55 UTC|newest]
Thread overview: 46+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-11-20 14:54 [RFC][PATCH 00/12] Enhanced file stat system call David Howells
2015-11-20 14:54 ` [PATCH 01/12] Ext4: Fix extended timestamp encoding and decoding David Howells
[not found] ` <20151120145434.18930.89755.stgit-S6HVgzuS8uM4Awkfq6JHfwNdhmdF6hFW@public.gmane.org>
2015-11-24 17:37 ` Andreas Dilger
2015-11-24 19:36 ` Theodore Ts'o
[not found] ` <20151124193646.GA3482-AKGzg7BKzIDYtjvyW6yDsg@public.gmane.org>
2015-11-24 20:10 ` Arnd Bergmann
2015-11-29 2:45 ` Theodore Ts'o
[not found] ` <20151129024555.GA31968-AKGzg7BKzIDYtjvyW6yDsg@public.gmane.org>
2015-11-29 21:30 ` Arnd Bergmann
2015-11-30 14:16 ` Theodore Ts'o
[not found] ` <20151130141605.GA4316-AKGzg7BKzIDYtjvyW6yDsg@public.gmane.org>
2015-11-30 14:37 ` Arnd Bergmann
2015-11-30 14:46 ` Elmar Stellnberger
2015-11-26 15:28 ` David Howells
2015-11-20 14:54 ` [PATCH 02/12] statx: Provide IOC flags for Windows fs attributes David Howells
[not found] ` <20151120145447.18930.5308.stgit-S6HVgzuS8uM4Awkfq6JHfwNdhmdF6hFW@public.gmane.org>
2015-11-24 19:52 ` Theodore Ts'o
2015-11-26 15:35 ` David Howells
[not found] ` <7976.1448552129-S6HVgzuS8uM4Awkfq6JHfwNdhmdF6hFW@public.gmane.org>
2015-11-26 16:01 ` David Howells
2015-11-26 22:10 ` Andreas Dilger
2015-11-20 14:54 ` [PATCH 03/12] statx: Add a system call to make enhanced file info available David Howells
[not found] ` <20151120145457.18930.79678.stgit-S6HVgzuS8uM4Awkfq6JHfwNdhmdF6hFW@public.gmane.org>
2015-11-24 20:21 ` Dave Chinner
2015-12-04 12:06 ` Pavel Machek
2015-12-21 23:21 ` David Howells
2015-11-20 14:55 ` [PATCH 04/12] statx: AFS: Return enhanced file attributes David Howells
2015-11-20 14:55 ` [PATCH 05/12] statx: Ext4: " David Howells
2015-11-20 14:55 ` David Howells [this message]
2015-11-20 14:55 ` [PATCH 07/12] statx: CIFS: Return enhanced attributes David Howells
2015-11-24 17:33 ` Steve French
2015-11-24 17:34 ` Steve French
2015-11-20 14:56 ` [PATCH 08/12] fsinfo: Add a system call to make enhanced filesystem info available David Howells
2015-11-20 14:56 ` [PATCH 09/12] fsinfo: Ext4: Return information through the filesystem info syscall David Howells
2015-11-20 14:56 ` [PATCH 10/12] fsinfo: AFS: " David Howells
2015-11-20 14:56 ` [PATCH 11/12] fsinfo: NFS: " David Howells
[not found] ` <20151120145422.18930.72662.stgit-S6HVgzuS8uM4Awkfq6JHfwNdhmdF6hFW@public.gmane.org>
2015-11-20 14:56 ` [PATCH 12/12] fsinfo: CIFS: " David Howells
2015-11-24 8:11 ` [RFC][PATCH 00/12] Enhanced file stat system call Christoph Hellwig
2015-11-26 15:19 ` David Howells
2015-11-26 22:06 ` Andreas Dilger
2015-11-20 16:19 ` Martin Steigerwald
2015-11-20 16:28 ` David Howells
2015-11-20 16:35 ` Martin Steigerwald
[not found] ` <4495.1448036915-S6HVgzuS8uM4Awkfq6JHfwNdhmdF6hFW@public.gmane.org>
2015-11-25 17:51 ` J. Bruce Fields
[not found] ` <20151125175153.GA30335-uC3wQj2KruNg9hUCZPvPmw@public.gmane.org>
2015-11-25 19:30 ` Andreas Dilger
2015-11-24 8:13 ` Christoph Hellwig
2015-11-24 8:48 ` Martin Steigerwald
2015-11-24 8:50 ` Christoph Hellwig
2015-11-20 16:50 ` Casey Schaufler
[not found] ` <564F4F4E.8060603-iSGtlc1asvQWG2LlvL+J4A@public.gmane.org>
2015-11-24 8:15 ` Christoph Hellwig
2015-11-24 14:43 ` Casey Schaufler
2015-11-24 16:28 ` 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=20151120145535.18930.14054.stgit@warthog.procyon.org.uk \
--to=dhowells@redhat.com \
--cc=arnd@arndb.de \
--cc=linux-afs@vger.kernel.org \
--cc=linux-cifs@vger.kernel.org \
--cc=linux-ext4@vger.kernel.org \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-nfs@vger.kernel.org \
--cc=samba-technical@lists.samba.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