Re: [PATCH 4/4] statx: AFS: Return enhanced file attributes

From: Andreas Dilger
Date: Fri Nov 18 2016 - 03:23:52 EST


On Nov 17, 2016, at 6:35 AM, David Howells <dhowells@xxxxxxxxxx> wrote:
>
> Return enhanced file attributes from the AFS filesystem. This includes the
> following:
>
> (1) The data version number as st_version, setting STATX_VERSION.
>
> (2) STATX_ATTR_AUTOMOUNT will be set on automount directories by virtue of
> S_AUTOMOUNT being set on the inode. These are referrals to other
> volumes or other cells.
>
> (3) STATX_ATTR_UNLISTED_DENTS on a directory that does cell lookup for
> non-existent names and mounts them (typically mounted on /afs with -o
> autocell). The resulting directories are marked STATX_ATTR_FABRICATED
> as they do not actually exist in the mounted AFS directory.
>
> (4) Files, directories and symlinks accessed over AFS are marked
> STATX_ATTR_REMOTE.
>
> STATX_ATIME, STATX_CTIME and STATX_BLOCKS are cleared as AFS does not
> support them.

Rather than clearing specific flags, wouldn't it be better to explicitly
set the flags that are actually being returned? Otherwise, this would
have the problem that Dave pointed out on the 0/4 patch, that there may
be flags still set from userspace that do not mean anything to AFS.

Cheers, Andreas

>
> Example output:
>
> [root@andromeda ~]# ./samples/statx/test-statx /afs
> statx(/afs) = 0
> results=7ef
> Size: 2048 Blocks: 0 IO Block: 4096 directory
> Device: 00:25 Inode: 1 Links: 2
> Access: (0777/drwxrwxrwx) Uid: 0 Gid: 0
> Access: 2006-05-07 00:21:15.000000000+0100
> Modify: 2006-05-07 00:21:15.000000000+0100
> Change: 2006-05-07 00:21:15.000000000+0100
> IO-blocksize: blksize=4096
>
> Signed-off-by: David Howells <dhowells@xxxxxxxxxx>
> ---
>
> fs/afs/inode.c | 21 ++++++++++++++++-----
> 1 file changed, 16 insertions(+), 5 deletions(-)
>
> diff --git a/fs/afs/inode.c b/fs/afs/inode.c
> index 86cc7264c21c..b08c405a7e1b 100644
> --- a/fs/afs/inode.c
> +++ b/fs/afs/inode.c
> @@ -72,9 +72,9 @@ static int afs_inode_map_status(struct afs_vnode *vnode, struct key *key)
> inode->i_uid = vnode->status.owner;
> inode->i_gid = GLOBAL_ROOT_GID;
> inode->i_size = vnode->status.size;
> - inode->i_ctime.tv_sec = vnode->status.mtime_server;
> - inode->i_ctime.tv_nsec = 0;
> - inode->i_atime = inode->i_mtime = inode->i_ctime;
> + inode->i_mtime.tv_sec = vnode->status.mtime_server;
> + inode->i_mtime.tv_nsec = 0;
> + inode->i_atime = inode->i_ctime = inode->i_mtime;
> inode->i_blocks = 0;
> inode->i_generation = vnode->fid.unique;
> inode->i_version = vnode->status.data_version;
> @@ -375,8 +375,7 @@ int afs_validate(struct afs_vnode *vnode, struct key *key)
> /*
> * read the attributes of an inode
> */
> -int afs_getattr(struct vfsmount *mnt, struct dentry *dentry,
> - struct kstat *stat)
> +int afs_getattr(struct vfsmount *mnt, struct dentry *dentry, struct kstat *stat)
> {
> struct inode *inode;
>
> @@ -385,6 +384,18 @@ int afs_getattr(struct vfsmount *mnt, struct dentry *dentry,
> _enter("{ ino=%lu v=%u }", inode->i_ino, inode->i_generation);
>
> generic_fillattr(inode, stat);
> +
> + stat->result_mask &= ~(STATX_ATIME | STATX_CTIME | STATX_BLOCKS);
> + stat->result_mask |= STATX_VERSION;
> + stat->version = inode->i_version;
> +
> + if (test_bit(AFS_VNODE_AUTOCELL, &AFS_FS_I(inode)->flags))
> + stat->attributes |= STATX_ATTR_UNLISTED_DENTS;
> +
> + if (test_bit(AFS_VNODE_PSEUDODIR, &AFS_FS_I(inode)->flags))
> + stat->attributes |= STATX_ATTR_FABRICATED;
> + else
> + stat->attributes |= STATX_ATTR_REMOTE;
> return 0;
> }
>
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in
> the body of a message to majordomo@xxxxxxxxxxxxxxx
> More majordomo info at http://vger.kernel.org/majordomo-info.html


Cheers, Andreas





Attachment: signature.asc
Description: Message signed with OpenPGP using GPGMail