Message ID | 147938972442.13574.1819690786475800772.stgit@warthog.procyon.org.uk (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Nov 17, 2016, at 6:35 AM, David Howells <dhowells@redhat.com> 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@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; > } > > > -- > To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html Cheers, Andreas
Andreas Dilger <adilger@dilger.ca> wrote: > > 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. I'm not sure it make a difference. generic_fillattr() has to initialise result_mask to STATX_BASIC_STATS for the support of any unmodified filesystem. We can then either clear the bits we don't want or just overwrite the mask entirely with the bits we do want. Bits in request_mask that are beyond STATX_BASIC_STATS are not automatically propagated to result_mask. Possibly vfs_xgetattr_nosec() should preset the result_mask rather than doing this in generic_fillattr(). David -- To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
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; }
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(-) -- To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html