linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Andreas Dilger <adilger@dilger.ca>
To: David Howells <dhowells@redhat.com>
Cc: linux-fsdevel@vger.kernel.org, linux-afs@vger.kernel.org,
	linux-nfs@vger.kernel.org, samba-technical@lists.samba.org,
	linux-kernel@vger.kernel.org, linux-ext4@vger.kernel.org
Subject: Re: [PATCH 4/6] statx: NFS: Return enhanced file attributes
Date: Mon, 2 May 2016 16:48:50 -0600	[thread overview]
Message-ID: <CA657A25-B00C-47BC-B9BB-DF6C22B6D5CF@dilger.ca> (raw)
In-Reply-To: <20160429125806.23636.51590.stgit@warthog.procyon.org.uk>

[-- Attachment #1: Type: text/plain, Size: 5967 bytes --]

On Apr 29, 2016, at 6:58 AM, David Howells <dhowells@redhat.com> wrote:
> 
> 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.

This is not implemented in this patch, and should removed from the commit
message.  The generic_fillattr() change in [1/6] will clear the STATX_ATIME
flag if IS_NOATIME() is true, so maybe that is enough for what you intended?

Cheers, Andreas

> 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 |   41 ++++++++++++++++++++++++++++++++++-------
> 1 file changed, 34 insertions(+), 7 deletions(-)
> 
> diff --git a/fs/nfs/inode.c b/fs/nfs/inode.c
> index 738c84a42eb0..8637236bca0c 100644
> --- a/fs/nfs/inode.c
> +++ b/fs/nfs/inode.c
> @@ -655,12 +655,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)))
> +	    ) {
> 		inode_lock(inode);
> 		err = nfs_sync_inode(inode);
> 		inode_unlock(inode);
> @@ -677,11 +688,13 @@ 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 (!(stat->request_mask & STATX_ATIME) ||
> +	    (mnt->mnt_flags & MNT_NOATIME) ||
> +	    ((mnt->mnt_flags & MNT_NODIRATIME) && S_ISDIR(inode->i_mode)))
> +		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)
> @@ -694,6 +707,20 @@ 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;
> +
> out:
> 	trace_nfs_getattr_exit(inode, err);
> 	return err;
> 
> --
> To unsubscribe from this list: send the line "unsubscribe linux-ext4" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html


Cheers, Andreas






[-- Attachment #2: Message signed with OpenPGP using GPGMail --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

  reply	other threads:[~2016-05-02 22:48 UTC|newest]

Thread overview: 52+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-04-29 12:57 [RFC][PATCH 0/6] Enhanced file stat system call David Howells
2016-04-29 12:57 ` [PATCH 1/6] statx: Add a system call to make enhanced file info available David Howells
2016-05-02 22:46   ` Andreas Dilger
2016-05-03 15:53   ` David Howells
2016-05-04 22:56   ` Dave Chinner
2016-05-05  0:09     ` NeilBrown
2016-05-05 19:48       ` Jeff Layton
2016-05-06 18:07         ` J. Bruce Fields
2016-05-05 20:04       ` David Howells
2016-05-06  1:39         ` Dave Chinner
2016-05-06 18:29     ` J. Bruce Fields
2016-05-09  1:45       ` Dave Chinner
2016-05-09  2:46         ` J. Bruce Fields
2016-05-04 23:56   ` NeilBrown
2016-05-08  8:35   ` Christoph Hellwig
2016-05-09 12:02     ` Jeff Layton
2016-05-10  7:00       ` Christoph Hellwig
2016-05-10 13:21         ` Jeff Layton
2016-05-09 12:57   ` David Howells
2016-05-09 13:23     ` Trond Myklebust
2016-05-10  7:04     ` Christoph Hellwig
2016-05-10  8:25     ` David Howells
2016-05-12  9:11       ` Christoph Hellwig
2016-05-13 15:28         ` Arnd Bergmann
2016-05-23  8:22           ` Christoph Hellwig
2016-05-23  9:33           ` David Howells
2016-05-18 10:55         ` David Howells
2016-05-09 13:00   ` David Howells
2016-05-09 13:38   ` David Howells
2016-05-10  7:08     ` Christoph Hellwig
2016-05-10  8:43     ` David Howells
2016-05-12  9:12       ` Christoph Hellwig
2016-05-09 13:40   ` David Howells
2016-04-29 12:57 ` [PATCH 2/6] statx: AFS: Return enhanced file attributes David Howells
2016-04-29 12:57 ` [PATCH 3/6] statx: Ext4: " David Howells
2016-05-02 22:48   ` Andreas Dilger
2016-05-03 20:24   ` David Howells
2016-05-08  8:38   ` Christoph Hellwig
2016-04-29 12:58 ` [PATCH 4/6] statx: NFS: " David Howells
2016-05-02 22:48   ` Andreas Dilger [this message]
2016-04-29 12:58 ` [PATCH 5/6] statx: Make windows attributes available for CIFS, NTFS and FAT to use David Howells
2016-05-02 22:52   ` Andreas Dilger
2016-10-03 21:03     ` Steve French
2016-05-03 20:23   ` David Howells
2016-05-08  8:39   ` Christoph Hellwig
2016-04-29 12:58 ` [PATCH 6/6] statx: CIFS: Return enhanced attributes David Howells
2016-04-30 21:05 ` [RFC][PATCH 0/6] Enhanced file stat system call Jeff Layton
2016-05-04 13:46 ` Arnd Bergmann
     [not found]   ` <CAH2r5mvWHwmqkzyfjHro__dWf-9ZAskPHgHDGS22jNzXZVQ4iA@mail.gmail.com>
2016-05-06  2:00     ` Steve French
2016-05-09 13:09       ` Arnd Bergmann
2016-05-13 14:28         ` Richard Sharpe
2016-05-13 15:08           ` Arnd Bergmann

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=CA657A25-B00C-47BC-B9BB-DF6C22B6D5CF@dilger.ca \
    --to=adilger@dilger.ca \
    --cc=dhowells@redhat.com \
    --cc=linux-afs@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;
as well as URLs for NNTP newsgroup(s).