lkml.org 
[lkml]   [2016]   [Nov]   [17]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Subject[PATCH 4/4] statx: AFS: Return enhanced file attributes
    From
    Date
    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.

    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@redhat.com>
    ---

    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;
    }

    \
     
     \ /
      Last update: 2016-11-17 18:13    [W:4.122 / U:0.628 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site