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: 64+ 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 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-24 20:10 ` Arnd Bergmann
2015-11-29 2:45 ` Theodore Ts'o
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-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:37 ` Arnd Bergmann
2015-11-30 14:46 ` Elmar Stellnberger
2015-11-26 15:28 ` David Howells
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-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 16:01 ` David Howells
2015-11-26 22:10 ` Andreas Dilger
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-11-24 20:21 ` Dave Chinner
2015-12-04 12:06 ` Pavel Machek
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-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-20 14:56 ` David Howells
2015-11-24 8:11 ` [RFC][PATCH 00/12] Enhanced file stat system call Christoph Hellwig
2015-11-24 8:11 ` Christoph Hellwig
2015-11-20 16:19 ` Martin Steigerwald
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:28 ` David Howells
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
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-25 19:30 ` Andreas Dilger
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 8:15 ` Christoph Hellwig
2015-11-24 14:43 ` Casey Schaufler
2015-11-24 16:28 ` Andreas Dilger
2015-11-26 15:19 ` David Howells
2015-11-26 22: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=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 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.