mirror of
https://github.com/Dasharo/linux.git
synced 2026-03-06 15:25:10 -08:00
fs: pass the request_mask to generic_fillattr
generic_fillattr just fills in the entire stat struct indiscriminately today, copying data from the inode. There is at least one attribute (STATX_CHANGE_COOKIE) that can have side effects when it is reported, and we're looking at adding more with the addition of multigrain timestamps. Add a request_mask argument to generic_fillattr and have most callers just pass in the value that is passed to getattr. Have other callers (e.g. ksmbd) just pass in STATX_BASIC_STATS. Also move the setting of STATX_CHANGE_COOKIE into generic_fillattr. Acked-by: Joseph Qi <joseph.qi@linux.alibaba.com> Reviewed-by: Xiubo Li <xiubli@redhat.com> Reviewed-by: "Paulo Alcantara (SUSE)" <pc@manguebit.com> Reviewed-by: Jan Kara <jack@suse.cz> Signed-off-by: Jeff Layton <jlayton@kernel.org> Message-Id: <20230807-mgctime-v7-2-d1dec143a704@kernel.org> Signed-off-by: Christian Brauner <brauner@kernel.org>
This commit is contained in:
committed by
Christian Brauner
parent
b3030e4f23
commit
0d72b92883
@@ -1016,7 +1016,7 @@ v9fs_vfs_getattr(struct mnt_idmap *idmap, const struct path *path,
|
||||
p9_debug(P9_DEBUG_VFS, "dentry: %p\n", dentry);
|
||||
v9ses = v9fs_dentry2v9ses(dentry);
|
||||
if (v9ses->cache & (CACHE_META|CACHE_LOOSE)) {
|
||||
generic_fillattr(&nop_mnt_idmap, inode, stat);
|
||||
generic_fillattr(&nop_mnt_idmap, request_mask, inode, stat);
|
||||
return 0;
|
||||
} else if (v9ses->cache & CACHE_WRITEBACK) {
|
||||
if (S_ISREG(inode->i_mode)) {
|
||||
@@ -1037,7 +1037,7 @@ v9fs_vfs_getattr(struct mnt_idmap *idmap, const struct path *path,
|
||||
return PTR_ERR(st);
|
||||
|
||||
v9fs_stat2inode(st, d_inode(dentry), dentry->d_sb, 0);
|
||||
generic_fillattr(&nop_mnt_idmap, d_inode(dentry), stat);
|
||||
generic_fillattr(&nop_mnt_idmap, request_mask, d_inode(dentry), stat);
|
||||
|
||||
p9stat_free(st);
|
||||
kfree(st);
|
||||
|
||||
@@ -451,7 +451,7 @@ v9fs_vfs_getattr_dotl(struct mnt_idmap *idmap,
|
||||
p9_debug(P9_DEBUG_VFS, "dentry: %p\n", dentry);
|
||||
v9ses = v9fs_dentry2v9ses(dentry);
|
||||
if (v9ses->cache & (CACHE_META|CACHE_LOOSE)) {
|
||||
generic_fillattr(&nop_mnt_idmap, inode, stat);
|
||||
generic_fillattr(&nop_mnt_idmap, request_mask, inode, stat);
|
||||
return 0;
|
||||
} else if (v9ses->cache) {
|
||||
if (S_ISREG(inode->i_mode)) {
|
||||
@@ -476,7 +476,7 @@ v9fs_vfs_getattr_dotl(struct mnt_idmap *idmap,
|
||||
return PTR_ERR(st);
|
||||
|
||||
v9fs_stat2inode_dotl(st, d_inode(dentry), 0);
|
||||
generic_fillattr(&nop_mnt_idmap, d_inode(dentry), stat);
|
||||
generic_fillattr(&nop_mnt_idmap, request_mask, d_inode(dentry), stat);
|
||||
/* Change block size to what the server returned */
|
||||
stat->blksize = st->st_blksize;
|
||||
|
||||
|
||||
@@ -773,7 +773,7 @@ int afs_getattr(struct mnt_idmap *idmap, const struct path *path,
|
||||
|
||||
do {
|
||||
read_seqbegin_or_lock(&vnode->cb_lock, &seq);
|
||||
generic_fillattr(&nop_mnt_idmap, inode, stat);
|
||||
generic_fillattr(&nop_mnt_idmap, request_mask, inode, stat);
|
||||
if (test_bit(AFS_VNODE_SILLY_DELETED, &vnode->flags) &&
|
||||
stat->nlink > 0)
|
||||
stat->nlink -= 1;
|
||||
|
||||
@@ -8746,7 +8746,7 @@ static int btrfs_getattr(struct mnt_idmap *idmap,
|
||||
STATX_ATTR_IMMUTABLE |
|
||||
STATX_ATTR_NODUMP);
|
||||
|
||||
generic_fillattr(idmap, inode, stat);
|
||||
generic_fillattr(idmap, request_mask, inode, stat);
|
||||
stat->dev = BTRFS_I(inode)->root->anon_dev;
|
||||
|
||||
spin_lock(&BTRFS_I(inode)->lock);
|
||||
|
||||
@@ -2467,7 +2467,7 @@ int ceph_getattr(struct mnt_idmap *idmap, const struct path *path,
|
||||
return err;
|
||||
}
|
||||
|
||||
generic_fillattr(&nop_mnt_idmap, inode, stat);
|
||||
generic_fillattr(&nop_mnt_idmap, request_mask, inode, stat);
|
||||
stat->ino = ceph_present_inode(inode);
|
||||
|
||||
/*
|
||||
|
||||
@@ -256,7 +256,8 @@ int coda_getattr(struct mnt_idmap *idmap, const struct path *path,
|
||||
{
|
||||
int err = coda_revalidate_inode(d_inode(path->dentry));
|
||||
if (!err)
|
||||
generic_fillattr(&nop_mnt_idmap, d_inode(path->dentry), stat);
|
||||
generic_fillattr(&nop_mnt_idmap, request_mask,
|
||||
d_inode(path->dentry), stat);
|
||||
return err;
|
||||
}
|
||||
|
||||
|
||||
@@ -982,7 +982,7 @@ static int ecryptfs_getattr_link(struct mnt_idmap *idmap,
|
||||
|
||||
mount_crypt_stat = &ecryptfs_superblock_to_private(
|
||||
dentry->d_sb)->mount_crypt_stat;
|
||||
generic_fillattr(&nop_mnt_idmap, d_inode(dentry), stat);
|
||||
generic_fillattr(&nop_mnt_idmap, request_mask, d_inode(dentry), stat);
|
||||
if (mount_crypt_stat->flags & ECRYPTFS_GLOBAL_ENCRYPT_FILENAMES) {
|
||||
char *target;
|
||||
size_t targetsiz;
|
||||
@@ -1011,7 +1011,8 @@ static int ecryptfs_getattr(struct mnt_idmap *idmap,
|
||||
if (!rc) {
|
||||
fsstack_copy_attr_all(d_inode(dentry),
|
||||
ecryptfs_inode_to_lower(d_inode(dentry)));
|
||||
generic_fillattr(&nop_mnt_idmap, d_inode(dentry), stat);
|
||||
generic_fillattr(&nop_mnt_idmap, request_mask,
|
||||
d_inode(dentry), stat);
|
||||
stat->blocks = lower_stat.blocks;
|
||||
}
|
||||
return rc;
|
||||
|
||||
@@ -368,7 +368,7 @@ int erofs_getattr(struct mnt_idmap *idmap, const struct path *path,
|
||||
stat->attributes_mask |= (STATX_ATTR_COMPRESSED |
|
||||
STATX_ATTR_IMMUTABLE);
|
||||
|
||||
generic_fillattr(idmap, inode, stat);
|
||||
generic_fillattr(idmap, request_mask, inode, stat);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -232,7 +232,7 @@ int exfat_getattr(struct mnt_idmap *idmap, const struct path *path,
|
||||
struct inode *inode = d_backing_inode(path->dentry);
|
||||
struct exfat_inode_info *ei = EXFAT_I(inode);
|
||||
|
||||
generic_fillattr(&nop_mnt_idmap, inode, stat);
|
||||
generic_fillattr(&nop_mnt_idmap, request_mask, inode, stat);
|
||||
exfat_truncate_atime(&stat->atime);
|
||||
stat->result_mask |= STATX_BTIME;
|
||||
stat->btime.tv_sec = ei->i_crtime.tv_sec;
|
||||
|
||||
@@ -1628,7 +1628,7 @@ int ext2_getattr(struct mnt_idmap *idmap, const struct path *path,
|
||||
STATX_ATTR_IMMUTABLE |
|
||||
STATX_ATTR_NODUMP);
|
||||
|
||||
generic_fillattr(&nop_mnt_idmap, inode, stat);
|
||||
generic_fillattr(&nop_mnt_idmap, request_mask, inode, stat);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -5535,7 +5535,7 @@ int ext4_getattr(struct mnt_idmap *idmap, const struct path *path,
|
||||
STATX_ATTR_NODUMP |
|
||||
STATX_ATTR_VERITY);
|
||||
|
||||
generic_fillattr(idmap, inode, stat);
|
||||
generic_fillattr(idmap, request_mask, inode, stat);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -882,7 +882,7 @@ int f2fs_getattr(struct mnt_idmap *idmap, const struct path *path,
|
||||
STATX_ATTR_NODUMP |
|
||||
STATX_ATTR_VERITY);
|
||||
|
||||
generic_fillattr(idmap, inode, stat);
|
||||
generic_fillattr(idmap, request_mask, inode, stat);
|
||||
|
||||
/* we need to show initial sectors used for inline_data/dentries */
|
||||
if ((S_ISREG(inode->i_mode) && f2fs_has_inline_data(inode)) ||
|
||||
|
||||
@@ -401,7 +401,7 @@ int fat_getattr(struct mnt_idmap *idmap, const struct path *path,
|
||||
struct inode *inode = d_inode(path->dentry);
|
||||
struct msdos_sb_info *sbi = MSDOS_SB(inode->i_sb);
|
||||
|
||||
generic_fillattr(idmap, inode, stat);
|
||||
generic_fillattr(idmap, request_mask, inode, stat);
|
||||
stat->blksize = sbi->cluster_size;
|
||||
|
||||
if (sbi->options.nfs == FAT_NFS_NOSTALE_RO) {
|
||||
|
||||
@@ -1224,7 +1224,7 @@ static int fuse_update_get_attr(struct inode *inode, struct file *file,
|
||||
forget_all_cached_acls(inode);
|
||||
err = fuse_do_getattr(inode, stat, file);
|
||||
} else if (stat) {
|
||||
generic_fillattr(&nop_mnt_idmap, inode, stat);
|
||||
generic_fillattr(&nop_mnt_idmap, request_mask, inode, stat);
|
||||
stat->mode = fi->orig_i_mode;
|
||||
stat->ino = fi->orig_ino;
|
||||
}
|
||||
|
||||
@@ -2071,7 +2071,7 @@ static int gfs2_getattr(struct mnt_idmap *idmap,
|
||||
STATX_ATTR_IMMUTABLE |
|
||||
STATX_ATTR_NODUMP);
|
||||
|
||||
generic_fillattr(&nop_mnt_idmap, inode, stat);
|
||||
generic_fillattr(&nop_mnt_idmap, request_mask, inode, stat);
|
||||
|
||||
if (gfs2_holder_initialized(&gh))
|
||||
gfs2_glock_dq_uninit(&gh);
|
||||
|
||||
@@ -298,7 +298,7 @@ int hfsplus_getattr(struct mnt_idmap *idmap, const struct path *path,
|
||||
stat->attributes_mask |= STATX_ATTR_APPEND | STATX_ATTR_IMMUTABLE |
|
||||
STATX_ATTR_NODUMP;
|
||||
|
||||
generic_fillattr(&nop_mnt_idmap, inode, stat);
|
||||
generic_fillattr(&nop_mnt_idmap, request_mask, inode, stat);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -190,7 +190,7 @@ int kernfs_iop_getattr(struct mnt_idmap *idmap,
|
||||
|
||||
down_read(&root->kernfs_iattr_rwsem);
|
||||
kernfs_refresh_inode(kn, inode);
|
||||
generic_fillattr(&nop_mnt_idmap, inode, stat);
|
||||
generic_fillattr(&nop_mnt_idmap, request_mask, inode, stat);
|
||||
up_read(&root->kernfs_iattr_rwsem);
|
||||
|
||||
return 0;
|
||||
|
||||
@@ -33,7 +33,7 @@ int simple_getattr(struct mnt_idmap *idmap, const struct path *path,
|
||||
unsigned int query_flags)
|
||||
{
|
||||
struct inode *inode = d_inode(path->dentry);
|
||||
generic_fillattr(&nop_mnt_idmap, inode, stat);
|
||||
generic_fillattr(&nop_mnt_idmap, request_mask, inode, stat);
|
||||
stat->blocks = inode->i_mapping->nrpages << (PAGE_SHIFT - 9);
|
||||
return 0;
|
||||
}
|
||||
@@ -1334,7 +1334,7 @@ static int empty_dir_getattr(struct mnt_idmap *idmap,
|
||||
u32 request_mask, unsigned int query_flags)
|
||||
{
|
||||
struct inode *inode = d_inode(path->dentry);
|
||||
generic_fillattr(&nop_mnt_idmap, inode, stat);
|
||||
generic_fillattr(&nop_mnt_idmap, request_mask, inode, stat);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -656,7 +656,7 @@ int minix_getattr(struct mnt_idmap *idmap, const struct path *path,
|
||||
struct super_block *sb = path->dentry->d_sb;
|
||||
struct inode *inode = d_inode(path->dentry);
|
||||
|
||||
generic_fillattr(&nop_mnt_idmap, inode, stat);
|
||||
generic_fillattr(&nop_mnt_idmap, request_mask, inode, stat);
|
||||
if (INODE_VERSION(inode) == MINIX_V1)
|
||||
stat->blocks = (BLOCK_SIZE / 512) * V1_minix_blocks(stat->size, sb);
|
||||
else
|
||||
|
||||
@@ -912,7 +912,7 @@ out_no_revalidate:
|
||||
/* Only return attributes that were revalidated. */
|
||||
stat->result_mask = nfs_get_valid_attrmask(inode) | request_mask;
|
||||
|
||||
generic_fillattr(&nop_mnt_idmap, inode, stat);
|
||||
generic_fillattr(&nop_mnt_idmap, request_mask, inode, stat);
|
||||
stat->ino = nfs_compat_user_ino64(NFS_FILEID(inode));
|
||||
stat->change_cookie = inode_peek_iversion_raw(inode);
|
||||
stat->attributes_mask |= STATX_ATTR_CHANGE_MONOTONIC;
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user