2
0
mirror of https://github.com/edk2-porting/linux-next.git synced 2024-11-30 13:34:44 +08:00

fs: port ->getattr() to pass mnt_idmap

Convert to struct mnt_idmap.

Last cycle we merged the necessary infrastructure in
256c8aed2b ("fs: introduce dedicated idmap type for mounts").
This is just the conversion to struct mnt_idmap.

Currently we still pass around the plain namespace that was attached to a
mount. This is in general pretty convenient but it makes it easy to
conflate namespaces that are relevant on the filesystem with namespaces
that are relevent on the mount level. Especially for non-vfs developers
without detailed knowledge in this area this can be a potential source for
bugs.

Once the conversion to struct mnt_idmap is done all helpers down to the
really low-level helpers will take a struct mnt_idmap argument instead of
two namespace arguments. This way it becomes impossible to conflate the two
eliminating the possibility of any bugs. All of the vfs and all filesystems
only operate on struct mnt_idmap.

Acked-by: Dave Chinner <dchinner@redhat.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Christian Brauner (Microsoft) <brauner@kernel.org>
This commit is contained in:
Christian Brauner 2023-01-13 12:49:12 +01:00 committed by Christian Brauner (Microsoft)
parent c1632a0f11
commit b74d24f7a7
No known key found for this signature in database
GPG Key ID: 91C61BC06578DCA2
72 changed files with 152 additions and 148 deletions

View File

@ -72,7 +72,7 @@ prototypes::
int (*permission) (struct inode *, int, unsigned int); int (*permission) (struct inode *, int, unsigned int);
struct posix_acl * (*get_inode_acl)(struct inode *, int, bool); struct posix_acl * (*get_inode_acl)(struct inode *, int, bool);
int (*setattr) (struct mnt_idmap *, struct dentry *, struct iattr *); int (*setattr) (struct mnt_idmap *, struct dentry *, struct iattr *);
int (*getattr) (const struct path *, struct kstat *, u32, unsigned int); int (*getattr) (struct mnt_idmap *, const struct path *, struct kstat *, u32, unsigned int);
ssize_t (*listxattr) (struct dentry *, char *, size_t); ssize_t (*listxattr) (struct dentry *, char *, size_t);
int (*fiemap)(struct inode *, struct fiemap_extent_info *, u64 start, u64 len); int (*fiemap)(struct inode *, struct fiemap_extent_info *, u64 start, u64 len);
void (*update_time)(struct inode *, struct timespec *, int); void (*update_time)(struct inode *, struct timespec *, int);

View File

@ -437,7 +437,7 @@ As of kernel 2.6.22, the following members are defined:
int (*permission) (struct user_namespace *, struct inode *, int); int (*permission) (struct user_namespace *, struct inode *, int);
struct posix_acl * (*get_inode_acl)(struct inode *, int, bool); struct posix_acl * (*get_inode_acl)(struct inode *, int, bool);
int (*setattr) (struct mnt_idmap *, struct dentry *, struct iattr *); int (*setattr) (struct mnt_idmap *, struct dentry *, struct iattr *);
int (*getattr) (struct user_namespace *, const struct path *, struct kstat *, u32, unsigned int); int (*getattr) (struct mnt_idmap *, const struct path *, struct kstat *, u32, unsigned int);
ssize_t (*listxattr) (struct dentry *, char *, size_t); ssize_t (*listxattr) (struct dentry *, char *, size_t);
void (*update_time)(struct inode *, struct timespec *, int); void (*update_time)(struct inode *, struct timespec *, int);
int (*atomic_open)(struct inode *, struct dentry *, struct file *, int (*atomic_open)(struct inode *, struct dentry *, struct file *,

View File

@ -1018,7 +1018,7 @@ error:
/** /**
* v9fs_vfs_getattr - retrieve file metadata * v9fs_vfs_getattr - retrieve file metadata
* @mnt_userns: The user namespace of the mount * @idmap: idmap of the mount
* @path: Object to query * @path: Object to query
* @stat: metadata structure to populate * @stat: metadata structure to populate
* @request_mask: Mask of STATX_xxx flags indicating the caller's interests * @request_mask: Mask of STATX_xxx flags indicating the caller's interests
@ -1027,7 +1027,7 @@ error:
*/ */
static int static int
v9fs_vfs_getattr(struct user_namespace *mnt_userns, const struct path *path, v9fs_vfs_getattr(struct mnt_idmap *idmap, const struct path *path,
struct kstat *stat, u32 request_mask, unsigned int flags) struct kstat *stat, u32 request_mask, unsigned int flags)
{ {
struct dentry *dentry = path->dentry; struct dentry *dentry = path->dentry;
@ -1038,7 +1038,7 @@ v9fs_vfs_getattr(struct user_namespace *mnt_userns, const struct path *path,
p9_debug(P9_DEBUG_VFS, "dentry: %p\n", dentry); p9_debug(P9_DEBUG_VFS, "dentry: %p\n", dentry);
v9ses = v9fs_dentry2v9ses(dentry); v9ses = v9fs_dentry2v9ses(dentry);
if (v9ses->cache == CACHE_LOOSE || v9ses->cache == CACHE_FSCACHE) { if (v9ses->cache == CACHE_LOOSE || v9ses->cache == CACHE_FSCACHE) {
generic_fillattr(&init_user_ns, d_inode(dentry), stat); generic_fillattr(&nop_mnt_idmap, d_inode(dentry), stat);
return 0; return 0;
} }
fid = v9fs_fid_lookup(dentry); fid = v9fs_fid_lookup(dentry);
@ -1051,7 +1051,7 @@ v9fs_vfs_getattr(struct user_namespace *mnt_userns, const struct path *path,
return PTR_ERR(st); return PTR_ERR(st);
v9fs_stat2inode(st, d_inode(dentry), dentry->d_sb, 0); v9fs_stat2inode(st, d_inode(dentry), dentry->d_sb, 0);
generic_fillattr(&init_user_ns, d_inode(dentry), stat); generic_fillattr(&nop_mnt_idmap, d_inode(dentry), stat);
p9stat_free(st); p9stat_free(st);
kfree(st); kfree(st);

View File

@ -450,7 +450,7 @@ error:
} }
static int static int
v9fs_vfs_getattr_dotl(struct user_namespace *mnt_userns, v9fs_vfs_getattr_dotl(struct mnt_idmap *idmap,
const struct path *path, struct kstat *stat, const struct path *path, struct kstat *stat,
u32 request_mask, unsigned int flags) u32 request_mask, unsigned int flags)
{ {
@ -462,7 +462,7 @@ v9fs_vfs_getattr_dotl(struct user_namespace *mnt_userns,
p9_debug(P9_DEBUG_VFS, "dentry: %p\n", dentry); p9_debug(P9_DEBUG_VFS, "dentry: %p\n", dentry);
v9ses = v9fs_dentry2v9ses(dentry); v9ses = v9fs_dentry2v9ses(dentry);
if (v9ses->cache == CACHE_LOOSE || v9ses->cache == CACHE_FSCACHE) { if (v9ses->cache == CACHE_LOOSE || v9ses->cache == CACHE_FSCACHE) {
generic_fillattr(&init_user_ns, d_inode(dentry), stat); generic_fillattr(&nop_mnt_idmap, d_inode(dentry), stat);
return 0; return 0;
} }
fid = v9fs_fid_lookup(dentry); fid = v9fs_fid_lookup(dentry);
@ -479,7 +479,7 @@ v9fs_vfs_getattr_dotl(struct user_namespace *mnt_userns,
return PTR_ERR(st); return PTR_ERR(st);
v9fs_stat2inode_dotl(st, d_inode(dentry), 0); v9fs_stat2inode_dotl(st, d_inode(dentry), 0);
generic_fillattr(&init_user_ns, d_inode(dentry), stat); generic_fillattr(&nop_mnt_idmap, d_inode(dentry), stat);
/* Change block size to what the server returned */ /* Change block size to what the server returned */
stat->blksize = st->st_blksize; stat->blksize = st->st_blksize;

View File

@ -737,7 +737,7 @@ error_unlock:
/* /*
* read the attributes of an inode * read the attributes of an inode
*/ */
int afs_getattr(struct user_namespace *mnt_userns, const struct path *path, int afs_getattr(struct mnt_idmap *idmap, const struct path *path,
struct kstat *stat, u32 request_mask, unsigned int query_flags) struct kstat *stat, u32 request_mask, unsigned int query_flags)
{ {
struct inode *inode = d_inode(path->dentry); struct inode *inode = d_inode(path->dentry);
@ -761,7 +761,7 @@ int afs_getattr(struct user_namespace *mnt_userns, const struct path *path,
do { do {
read_seqbegin_or_lock(&vnode->cb_lock, &seq); read_seqbegin_or_lock(&vnode->cb_lock, &seq);
generic_fillattr(&init_user_ns, inode, stat); generic_fillattr(&nop_mnt_idmap, inode, stat);
if (test_bit(AFS_VNODE_SILLY_DELETED, &vnode->flags) && if (test_bit(AFS_VNODE_SILLY_DELETED, &vnode->flags) &&
stat->nlink > 0) stat->nlink > 0)
stat->nlink -= 1; stat->nlink -= 1;

View File

@ -1170,7 +1170,7 @@ extern struct inode *afs_iget(struct afs_operation *, struct afs_vnode_param *);
extern struct inode *afs_root_iget(struct super_block *, struct key *); extern struct inode *afs_root_iget(struct super_block *, struct key *);
extern bool afs_check_validity(struct afs_vnode *); extern bool afs_check_validity(struct afs_vnode *);
extern int afs_validate(struct afs_vnode *, struct key *); extern int afs_validate(struct afs_vnode *, struct key *);
extern int afs_getattr(struct user_namespace *mnt_userns, const struct path *, extern int afs_getattr(struct mnt_idmap *idmap, const struct path *,
struct kstat *, u32, unsigned int); struct kstat *, u32, unsigned int);
extern int afs_setattr(struct mnt_idmap *idmap, struct dentry *, struct iattr *); extern int afs_setattr(struct mnt_idmap *idmap, struct dentry *, struct iattr *);
extern void afs_evict_inode(struct inode *); extern void afs_evict_inode(struct inode *);

View File

@ -95,7 +95,7 @@ static int bad_inode_permission(struct user_namespace *mnt_userns,
return -EIO; return -EIO;
} }
static int bad_inode_getattr(struct user_namespace *mnt_userns, static int bad_inode_getattr(struct mnt_idmap *idmap,
const struct path *path, struct kstat *stat, const struct path *path, struct kstat *stat,
u32 request_mask, unsigned int query_flags) u32 request_mask, unsigned int query_flags)
{ {

View File

@ -9005,7 +9005,7 @@ fail:
return -ENOMEM; return -ENOMEM;
} }
static int btrfs_getattr(struct user_namespace *mnt_userns, static int btrfs_getattr(struct mnt_idmap *idmap,
const struct path *path, struct kstat *stat, const struct path *path, struct kstat *stat,
u32 request_mask, unsigned int flags) u32 request_mask, unsigned int flags)
{ {
@ -9035,7 +9035,7 @@ static int btrfs_getattr(struct user_namespace *mnt_userns,
STATX_ATTR_IMMUTABLE | STATX_ATTR_IMMUTABLE |
STATX_ATTR_NODUMP); STATX_ATTR_NODUMP);
generic_fillattr(mnt_userns, inode, stat); generic_fillattr(idmap, inode, stat);
stat->dev = BTRFS_I(inode)->root->anon_dev; stat->dev = BTRFS_I(inode)->root->anon_dev;
spin_lock(&BTRFS_I(inode)->lock); spin_lock(&BTRFS_I(inode)->lock);

View File

@ -2445,7 +2445,7 @@ static int statx_to_caps(u32 want, umode_t mode)
* Get all the attributes. If we have sufficient caps for the requested attrs, * Get all the attributes. If we have sufficient caps for the requested attrs,
* then we can avoid talking to the MDS at all. * then we can avoid talking to the MDS at all.
*/ */
int ceph_getattr(struct user_namespace *mnt_userns, const struct path *path, int ceph_getattr(struct mnt_idmap *idmap, const struct path *path,
struct kstat *stat, u32 request_mask, unsigned int flags) struct kstat *stat, u32 request_mask, unsigned int flags)
{ {
struct inode *inode = d_inode(path->dentry); struct inode *inode = d_inode(path->dentry);
@ -2466,7 +2466,7 @@ int ceph_getattr(struct user_namespace *mnt_userns, const struct path *path,
return err; return err;
} }
generic_fillattr(&init_user_ns, inode, stat); generic_fillattr(&nop_mnt_idmap, inode, stat);
stat->ino = ceph_present_inode(inode); stat->ino = ceph_present_inode(inode);
/* /*

View File

@ -1045,7 +1045,7 @@ extern int ceph_permission(struct user_namespace *mnt_userns,
extern int __ceph_setattr(struct inode *inode, struct iattr *attr); extern int __ceph_setattr(struct inode *inode, struct iattr *attr);
extern int ceph_setattr(struct mnt_idmap *idmap, extern int ceph_setattr(struct mnt_idmap *idmap,
struct dentry *dentry, struct iattr *attr); struct dentry *dentry, struct iattr *attr);
extern int ceph_getattr(struct user_namespace *mnt_userns, extern int ceph_getattr(struct mnt_idmap *idmap,
const struct path *path, struct kstat *stat, const struct path *path, struct kstat *stat,
u32 request_mask, unsigned int flags); u32 request_mask, unsigned int flags);
void ceph_inode_shutdown(struct inode *inode); void ceph_inode_shutdown(struct inode *inode);

View File

@ -72,7 +72,7 @@ extern int cifs_revalidate_dentry(struct dentry *);
extern int cifs_invalidate_mapping(struct inode *inode); extern int cifs_invalidate_mapping(struct inode *inode);
extern int cifs_revalidate_mapping(struct inode *inode); extern int cifs_revalidate_mapping(struct inode *inode);
extern int cifs_zap_mapping(struct inode *inode); extern int cifs_zap_mapping(struct inode *inode);
extern int cifs_getattr(struct user_namespace *, const struct path *, extern int cifs_getattr(struct mnt_idmap *, const struct path *,
struct kstat *, u32, unsigned int); struct kstat *, u32, unsigned int);
extern int cifs_setattr(struct mnt_idmap *, struct dentry *, extern int cifs_setattr(struct mnt_idmap *, struct dentry *,
struct iattr *); struct iattr *);

View File

@ -2496,7 +2496,7 @@ int cifs_revalidate_dentry(struct dentry *dentry)
return cifs_revalidate_mapping(inode); return cifs_revalidate_mapping(inode);
} }
int cifs_getattr(struct user_namespace *mnt_userns, const struct path *path, int cifs_getattr(struct mnt_idmap *idmap, const struct path *path,
struct kstat *stat, u32 request_mask, unsigned int flags) struct kstat *stat, u32 request_mask, unsigned int flags)
{ {
struct dentry *dentry = path->dentry; struct dentry *dentry = path->dentry;
@ -2537,7 +2537,7 @@ int cifs_getattr(struct user_namespace *mnt_userns, const struct path *path,
return rc; return rc;
} }
generic_fillattr(&init_user_ns, inode, stat); generic_fillattr(&nop_mnt_idmap, inode, stat);
stat->blksize = cifs_sb->ctx->bsize; stat->blksize = cifs_sb->ctx->bsize;
stat->ino = CIFS_I(inode)->uniqueid; stat->ino = CIFS_I(inode)->uniqueid;

View File

@ -49,7 +49,7 @@ int coda_release(struct inode *i, struct file *f);
int coda_permission(struct user_namespace *mnt_userns, struct inode *inode, int coda_permission(struct user_namespace *mnt_userns, struct inode *inode,
int mask); int mask);
int coda_revalidate_inode(struct inode *); int coda_revalidate_inode(struct inode *);
int coda_getattr(struct user_namespace *, const struct path *, struct kstat *, int coda_getattr(struct mnt_idmap *, const struct path *, struct kstat *,
u32, unsigned int); u32, unsigned int);
int coda_setattr(struct mnt_idmap *, struct dentry *, struct iattr *); int coda_setattr(struct mnt_idmap *, struct dentry *, struct iattr *);

View File

@ -251,12 +251,12 @@ static void coda_evict_inode(struct inode *inode)
coda_cache_clear_inode(inode); coda_cache_clear_inode(inode);
} }
int coda_getattr(struct user_namespace *mnt_userns, const struct path *path, int coda_getattr(struct mnt_idmap *idmap, const struct path *path,
struct kstat *stat, u32 request_mask, unsigned int flags) struct kstat *stat, u32 request_mask, unsigned int flags)
{ {
int err = coda_revalidate_inode(d_inode(path->dentry)); int err = coda_revalidate_inode(d_inode(path->dentry));
if (!err) if (!err)
generic_fillattr(&init_user_ns, d_inode(path->dentry), stat); generic_fillattr(&nop_mnt_idmap, d_inode(path->dentry), stat);
return err; return err;
} }

View File

@ -972,7 +972,7 @@ out:
return rc; return rc;
} }
static int ecryptfs_getattr_link(struct user_namespace *mnt_userns, static int ecryptfs_getattr_link(struct mnt_idmap *idmap,
const struct path *path, struct kstat *stat, const struct path *path, struct kstat *stat,
u32 request_mask, unsigned int flags) u32 request_mask, unsigned int flags)
{ {
@ -982,7 +982,7 @@ static int ecryptfs_getattr_link(struct user_namespace *mnt_userns,
mount_crypt_stat = &ecryptfs_superblock_to_private( mount_crypt_stat = &ecryptfs_superblock_to_private(
dentry->d_sb)->mount_crypt_stat; dentry->d_sb)->mount_crypt_stat;
generic_fillattr(&init_user_ns, d_inode(dentry), stat); generic_fillattr(&nop_mnt_idmap, d_inode(dentry), stat);
if (mount_crypt_stat->flags & ECRYPTFS_GLOBAL_ENCRYPT_FILENAMES) { if (mount_crypt_stat->flags & ECRYPTFS_GLOBAL_ENCRYPT_FILENAMES) {
char *target; char *target;
size_t targetsiz; size_t targetsiz;
@ -998,7 +998,7 @@ static int ecryptfs_getattr_link(struct user_namespace *mnt_userns,
return rc; return rc;
} }
static int ecryptfs_getattr(struct user_namespace *mnt_userns, static int ecryptfs_getattr(struct mnt_idmap *idmap,
const struct path *path, struct kstat *stat, const struct path *path, struct kstat *stat,
u32 request_mask, unsigned int flags) u32 request_mask, unsigned int flags)
{ {
@ -1011,7 +1011,7 @@ static int ecryptfs_getattr(struct user_namespace *mnt_userns,
if (!rc) { if (!rc) {
fsstack_copy_attr_all(d_inode(dentry), fsstack_copy_attr_all(d_inode(dentry),
ecryptfs_inode_to_lower(d_inode(dentry))); ecryptfs_inode_to_lower(d_inode(dentry)));
generic_fillattr(&init_user_ns, d_inode(dentry), stat); generic_fillattr(&nop_mnt_idmap, d_inode(dentry), stat);
stat->blocks = lower_stat.blocks; stat->blocks = lower_stat.blocks;
} }
return rc; return rc;

View File

@ -353,7 +353,7 @@ struct inode *erofs_iget(struct super_block *sb, erofs_nid_t nid)
return inode; return inode;
} }
int erofs_getattr(struct user_namespace *mnt_userns, const struct path *path, int erofs_getattr(struct mnt_idmap *idmap, const struct path *path,
struct kstat *stat, u32 request_mask, struct kstat *stat, u32 request_mask,
unsigned int query_flags) unsigned int query_flags)
{ {
@ -366,7 +366,7 @@ int erofs_getattr(struct user_namespace *mnt_userns, const struct path *path,
stat->attributes_mask |= (STATX_ATTR_COMPRESSED | stat->attributes_mask |= (STATX_ATTR_COMPRESSED |
STATX_ATTR_IMMUTABLE); STATX_ATTR_IMMUTABLE);
generic_fillattr(mnt_userns, inode, stat); generic_fillattr(idmap, inode, stat);
return 0; return 0;
} }

View File

@ -494,7 +494,7 @@ extern const struct inode_operations erofs_symlink_iops;
extern const struct inode_operations erofs_fast_symlink_iops; extern const struct inode_operations erofs_fast_symlink_iops;
struct inode *erofs_iget(struct super_block *sb, erofs_nid_t nid); struct inode *erofs_iget(struct super_block *sb, erofs_nid_t nid);
int erofs_getattr(struct user_namespace *mnt_userns, const struct path *path, int erofs_getattr(struct mnt_idmap *idmap, const struct path *path,
struct kstat *stat, u32 request_mask, struct kstat *stat, u32 request_mask,
unsigned int query_flags); unsigned int query_flags);

View File

@ -452,7 +452,7 @@ int __exfat_truncate(struct inode *inode);
void exfat_truncate(struct inode *inode); void exfat_truncate(struct inode *inode);
int exfat_setattr(struct mnt_idmap *idmap, struct dentry *dentry, int exfat_setattr(struct mnt_idmap *idmap, struct dentry *dentry,
struct iattr *attr); struct iattr *attr);
int exfat_getattr(struct user_namespace *mnt_userns, const struct path *path, int exfat_getattr(struct mnt_idmap *idmap, const struct path *path,
struct kstat *stat, unsigned int request_mask, struct kstat *stat, unsigned int request_mask,
unsigned int query_flags); unsigned int query_flags);
int exfat_file_fsync(struct file *file, loff_t start, loff_t end, int datasync); int exfat_file_fsync(struct file *file, loff_t start, loff_t end, int datasync);

View File

@ -226,14 +226,14 @@ write_size:
mutex_unlock(&sbi->s_lock); mutex_unlock(&sbi->s_lock);
} }
int exfat_getattr(struct user_namespace *mnt_uerns, const struct path *path, int exfat_getattr(struct mnt_idmap *idmap, const struct path *path,
struct kstat *stat, unsigned int request_mask, struct kstat *stat, unsigned int request_mask,
unsigned int query_flags) unsigned int query_flags)
{ {
struct inode *inode = d_backing_inode(path->dentry); struct inode *inode = d_backing_inode(path->dentry);
struct exfat_inode_info *ei = EXFAT_I(inode); struct exfat_inode_info *ei = EXFAT_I(inode);
generic_fillattr(&init_user_ns, inode, stat); generic_fillattr(&nop_mnt_idmap, inode, stat);
exfat_truncate_atime(&stat->atime); exfat_truncate_atime(&stat->atime);
stat->result_mask |= STATX_BTIME; stat->result_mask |= STATX_BTIME;
stat->btime.tv_sec = ei->i_crtime.tv_sec; stat->btime.tv_sec = ei->i_crtime.tv_sec;

View File

@ -754,7 +754,7 @@ extern int ext2_write_inode (struct inode *, struct writeback_control *);
extern void ext2_evict_inode(struct inode *); extern void ext2_evict_inode(struct inode *);
extern int ext2_get_block(struct inode *, sector_t, struct buffer_head *, int); extern int ext2_get_block(struct inode *, sector_t, struct buffer_head *, int);
extern int ext2_setattr (struct mnt_idmap *, struct dentry *, struct iattr *); extern int ext2_setattr (struct mnt_idmap *, struct dentry *, struct iattr *);
extern int ext2_getattr (struct user_namespace *, const struct path *, extern int ext2_getattr (struct mnt_idmap *, const struct path *,
struct kstat *, u32, unsigned int); struct kstat *, u32, unsigned int);
extern void ext2_set_inode_flags(struct inode *inode); extern void ext2_set_inode_flags(struct inode *inode);
extern int ext2_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo, extern int ext2_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo,

View File

@ -1592,7 +1592,7 @@ int ext2_write_inode(struct inode *inode, struct writeback_control *wbc)
return __ext2_write_inode(inode, wbc->sync_mode == WB_SYNC_ALL); return __ext2_write_inode(inode, wbc->sync_mode == WB_SYNC_ALL);
} }
int ext2_getattr(struct user_namespace *mnt_userns, const struct path *path, int ext2_getattr(struct mnt_idmap *idmap, const struct path *path,
struct kstat *stat, u32 request_mask, unsigned int query_flags) struct kstat *stat, u32 request_mask, unsigned int query_flags)
{ {
struct inode *inode = d_inode(path->dentry); struct inode *inode = d_inode(path->dentry);
@ -1614,7 +1614,7 @@ int ext2_getattr(struct user_namespace *mnt_userns, const struct path *path,
STATX_ATTR_IMMUTABLE | STATX_ATTR_IMMUTABLE |
STATX_ATTR_NODUMP); STATX_ATTR_NODUMP);
generic_fillattr(&init_user_ns, inode, stat); generic_fillattr(&nop_mnt_idmap, inode, stat);
return 0; return 0;
} }

View File

@ -2979,11 +2979,11 @@ extern int ext4_write_inode(struct inode *, struct writeback_control *);
extern int ext4_setattr(struct mnt_idmap *, struct dentry *, extern int ext4_setattr(struct mnt_idmap *, struct dentry *,
struct iattr *); struct iattr *);
extern u32 ext4_dio_alignment(struct inode *inode); extern u32 ext4_dio_alignment(struct inode *inode);
extern int ext4_getattr(struct user_namespace *, const struct path *, extern int ext4_getattr(struct mnt_idmap *, const struct path *,
struct kstat *, u32, unsigned int); struct kstat *, u32, unsigned int);
extern void ext4_evict_inode(struct inode *); extern void ext4_evict_inode(struct inode *);
extern void ext4_clear_inode(struct inode *); extern void ext4_clear_inode(struct inode *);
extern int ext4_file_getattr(struct user_namespace *, const struct path *, extern int ext4_file_getattr(struct mnt_idmap *, const struct path *,
struct kstat *, u32, unsigned int); struct kstat *, u32, unsigned int);
extern int ext4_sync_inode(handle_t *, struct inode *); extern int ext4_sync_inode(handle_t *, struct inode *);
extern void ext4_dirty_inode(struct inode *, int); extern void ext4_dirty_inode(struct inode *, int);

View File

@ -5669,7 +5669,7 @@ u32 ext4_dio_alignment(struct inode *inode)
return 1; /* use the iomap defaults */ return 1; /* use the iomap defaults */
} }
int ext4_getattr(struct user_namespace *mnt_userns, const struct path *path, int ext4_getattr(struct mnt_idmap *idmap, const struct path *path,
struct kstat *stat, u32 request_mask, unsigned int query_flags) struct kstat *stat, u32 request_mask, unsigned int query_flags)
{ {
struct inode *inode = d_inode(path->dentry); struct inode *inode = d_inode(path->dentry);
@ -5726,18 +5726,18 @@ int ext4_getattr(struct user_namespace *mnt_userns, const struct path *path,
STATX_ATTR_NODUMP | STATX_ATTR_NODUMP |
STATX_ATTR_VERITY); STATX_ATTR_VERITY);
generic_fillattr(mnt_userns, inode, stat); generic_fillattr(idmap, inode, stat);
return 0; return 0;
} }
int ext4_file_getattr(struct user_namespace *mnt_userns, int ext4_file_getattr(struct mnt_idmap *idmap,
const struct path *path, struct kstat *stat, const struct path *path, struct kstat *stat,
u32 request_mask, unsigned int query_flags) u32 request_mask, unsigned int query_flags)
{ {
struct inode *inode = d_inode(path->dentry); struct inode *inode = d_inode(path->dentry);
u64 delalloc_blocks; u64 delalloc_blocks;
ext4_getattr(mnt_userns, path, stat, request_mask, query_flags); ext4_getattr(idmap, path, stat, request_mask, query_flags);
/* /*
* If there is inline data in the inode, the inode will normally not * If there is inline data in the inode, the inode will normally not

View File

@ -55,12 +55,12 @@ static const char *ext4_encrypted_get_link(struct dentry *dentry,
return paddr; return paddr;
} }
static int ext4_encrypted_symlink_getattr(struct user_namespace *mnt_userns, static int ext4_encrypted_symlink_getattr(struct mnt_idmap *idmap,
const struct path *path, const struct path *path,
struct kstat *stat, u32 request_mask, struct kstat *stat, u32 request_mask,
unsigned int query_flags) unsigned int query_flags)
{ {
ext4_getattr(mnt_userns, path, stat, request_mask, query_flags); ext4_getattr(idmap, path, stat, request_mask, query_flags);
return fscrypt_symlink_getattr(path, stat); return fscrypt_symlink_getattr(path, stat);
} }

View File

@ -3469,7 +3469,7 @@ void f2fs_truncate_data_blocks(struct dnode_of_data *dn);
int f2fs_do_truncate_blocks(struct inode *inode, u64 from, bool lock); int f2fs_do_truncate_blocks(struct inode *inode, u64 from, bool lock);
int f2fs_truncate_blocks(struct inode *inode, u64 from, bool lock); int f2fs_truncate_blocks(struct inode *inode, u64 from, bool lock);
int f2fs_truncate(struct inode *inode); int f2fs_truncate(struct inode *inode);
int f2fs_getattr(struct user_namespace *mnt_userns, const struct path *path, int f2fs_getattr(struct mnt_idmap *idmap, const struct path *path,
struct kstat *stat, u32 request_mask, unsigned int flags); struct kstat *stat, u32 request_mask, unsigned int flags);
int f2fs_setattr(struct mnt_idmap *idmap, struct dentry *dentry, int f2fs_setattr(struct mnt_idmap *idmap, struct dentry *dentry,
struct iattr *attr); struct iattr *attr);

View File

@ -837,7 +837,7 @@ static bool f2fs_force_buffered_io(struct inode *inode, int rw)
return false; return false;
} }
int f2fs_getattr(struct user_namespace *mnt_userns, const struct path *path, int f2fs_getattr(struct mnt_idmap *idmap, const struct path *path,
struct kstat *stat, u32 request_mask, unsigned int query_flags) struct kstat *stat, u32 request_mask, unsigned int query_flags)
{ {
struct inode *inode = d_inode(path->dentry); struct inode *inode = d_inode(path->dentry);
@ -892,7 +892,7 @@ int f2fs_getattr(struct user_namespace *mnt_userns, const struct path *path,
STATX_ATTR_NODUMP | STATX_ATTR_NODUMP |
STATX_ATTR_VERITY); STATX_ATTR_VERITY);
generic_fillattr(mnt_userns, inode, stat); generic_fillattr(idmap, inode, stat);
/* we need to show initial sectors used for inline_data/dentries */ /* we need to show initial sectors used for inline_data/dentries */
if ((S_ISREG(inode->i_mode) && f2fs_has_inline_data(inode)) || if ((S_ISREG(inode->i_mode) && f2fs_has_inline_data(inode)) ||

View File

@ -1342,12 +1342,12 @@ static const char *f2fs_encrypted_get_link(struct dentry *dentry,
return target; return target;
} }
static int f2fs_encrypted_symlink_getattr(struct user_namespace *mnt_userns, static int f2fs_encrypted_symlink_getattr(struct mnt_idmap *idmap,
const struct path *path, const struct path *path,
struct kstat *stat, u32 request_mask, struct kstat *stat, u32 request_mask,
unsigned int query_flags) unsigned int query_flags)
{ {
f2fs_getattr(mnt_userns, path, stat, request_mask, query_flags); f2fs_getattr(idmap, path, stat, request_mask, query_flags);
return fscrypt_symlink_getattr(path, stat); return fscrypt_symlink_getattr(path, stat);
} }

View File

@ -401,7 +401,7 @@ extern const struct inode_operations fat_file_inode_operations;
extern int fat_setattr(struct mnt_idmap *idmap, struct dentry *dentry, extern int fat_setattr(struct mnt_idmap *idmap, struct dentry *dentry,
struct iattr *attr); struct iattr *attr);
extern void fat_truncate_blocks(struct inode *inode, loff_t offset); extern void fat_truncate_blocks(struct inode *inode, loff_t offset);
extern int fat_getattr(struct user_namespace *mnt_userns, extern int fat_getattr(struct mnt_idmap *idmap,
const struct path *path, struct kstat *stat, const struct path *path, struct kstat *stat,
u32 request_mask, unsigned int flags); u32 request_mask, unsigned int flags);
extern int fat_file_fsync(struct file *file, loff_t start, loff_t end, extern int fat_file_fsync(struct file *file, loff_t start, loff_t end,

View File

@ -395,13 +395,13 @@ void fat_truncate_blocks(struct inode *inode, loff_t offset)
fat_flush_inodes(inode->i_sb, inode, NULL); fat_flush_inodes(inode->i_sb, inode, NULL);
} }
int fat_getattr(struct user_namespace *mnt_userns, const struct path *path, int fat_getattr(struct mnt_idmap *idmap, const struct path *path,
struct kstat *stat, u32 request_mask, unsigned int flags) struct kstat *stat, u32 request_mask, unsigned int flags)
{ {
struct inode *inode = d_inode(path->dentry); struct inode *inode = d_inode(path->dentry);
struct msdos_sb_info *sbi = MSDOS_SB(inode->i_sb); struct msdos_sb_info *sbi = MSDOS_SB(inode->i_sb);
generic_fillattr(mnt_userns, inode, stat); generic_fillattr(idmap, inode, stat);
stat->blksize = sbi->cluster_size; stat->blksize = sbi->cluster_size;
if (sbi->options.nfs == FAT_NFS_NOSTALE_RO) { if (sbi->options.nfs == FAT_NFS_NOSTALE_RO) {

View File

@ -1156,7 +1156,7 @@ static int fuse_update_get_attr(struct inode *inode, struct file *file,
forget_all_cached_acls(inode); forget_all_cached_acls(inode);
err = fuse_do_getattr(inode, stat, file); err = fuse_do_getattr(inode, stat, file);
} else if (stat) { } else if (stat) {
generic_fillattr(&init_user_ns, inode, stat); generic_fillattr(&nop_mnt_idmap, inode, stat);
stat->mode = fi->orig_i_mode; stat->mode = fi->orig_i_mode;
stat->ino = fi->orig_ino; stat->ino = fi->orig_ino;
} }
@ -1900,7 +1900,7 @@ static int fuse_setattr(struct mnt_idmap *idmap, struct dentry *entry,
return ret; return ret;
} }
static int fuse_getattr(struct user_namespace *mnt_userns, static int fuse_getattr(struct mnt_idmap *idmap,
const struct path *path, struct kstat *stat, const struct path *path, struct kstat *stat,
u32 request_mask, unsigned int flags) u32 request_mask, unsigned int flags)
{ {

View File

@ -2022,7 +2022,7 @@ out:
/** /**
* gfs2_getattr - Read out an inode's attributes * gfs2_getattr - Read out an inode's attributes
* @mnt_userns: user namespace of the mount the inode was found from * @idmap: idmap of the mount the inode was found from
* @path: Object to query * @path: Object to query
* @stat: The inode's stats * @stat: The inode's stats
* @request_mask: Mask of STATX_xxx flags indicating the caller's interests * @request_mask: Mask of STATX_xxx flags indicating the caller's interests
@ -2037,7 +2037,7 @@ out:
* Returns: errno * Returns: errno
*/ */
static int gfs2_getattr(struct user_namespace *mnt_userns, static int gfs2_getattr(struct mnt_idmap *idmap,
const struct path *path, struct kstat *stat, const struct path *path, struct kstat *stat,
u32 request_mask, unsigned int flags) u32 request_mask, unsigned int flags)
{ {
@ -2066,7 +2066,7 @@ static int gfs2_getattr(struct user_namespace *mnt_userns,
STATX_ATTR_IMMUTABLE | STATX_ATTR_IMMUTABLE |
STATX_ATTR_NODUMP); STATX_ATTR_NODUMP);
generic_fillattr(&init_user_ns, inode, stat); generic_fillattr(&nop_mnt_idmap, inode, stat);
if (gfs2_holder_initialized(&gh)) if (gfs2_holder_initialized(&gh))
gfs2_glock_dq_uninit(&gh); gfs2_glock_dq_uninit(&gh);

View File

@ -481,7 +481,7 @@ void hfsplus_inode_write_fork(struct inode *inode,
struct hfsplus_fork_raw *fork); struct hfsplus_fork_raw *fork);
int hfsplus_cat_read_inode(struct inode *inode, struct hfs_find_data *fd); int hfsplus_cat_read_inode(struct inode *inode, struct hfs_find_data *fd);
int hfsplus_cat_write_inode(struct inode *inode); int hfsplus_cat_write_inode(struct inode *inode);
int hfsplus_getattr(struct user_namespace *mnt_userns, const struct path *path, int hfsplus_getattr(struct mnt_idmap *idmap, const struct path *path,
struct kstat *stat, u32 request_mask, struct kstat *stat, u32 request_mask,
unsigned int query_flags); unsigned int query_flags);
int hfsplus_file_fsync(struct file *file, loff_t start, loff_t end, int hfsplus_file_fsync(struct file *file, loff_t start, loff_t end,

View File

@ -276,7 +276,7 @@ static int hfsplus_setattr(struct mnt_idmap *idmap,
return 0; return 0;
} }
int hfsplus_getattr(struct user_namespace *mnt_userns, const struct path *path, int hfsplus_getattr(struct mnt_idmap *idmap, const struct path *path,
struct kstat *stat, u32 request_mask, struct kstat *stat, u32 request_mask,
unsigned int query_flags) unsigned int query_flags)
{ {
@ -298,7 +298,7 @@ int hfsplus_getattr(struct user_namespace *mnt_userns, const struct path *path,
stat->attributes_mask |= STATX_ATTR_APPEND | STATX_ATTR_IMMUTABLE | stat->attributes_mask |= STATX_ATTR_APPEND | STATX_ATTR_IMMUTABLE |
STATX_ATTR_NODUMP; STATX_ATTR_NODUMP;
generic_fillattr(&init_user_ns, inode, stat); generic_fillattr(&nop_mnt_idmap, inode, stat);
return 0; return 0;
} }

View File

@ -181,7 +181,7 @@ static void kernfs_refresh_inode(struct kernfs_node *kn, struct inode *inode)
set_nlink(inode, kn->dir.subdirs + 2); set_nlink(inode, kn->dir.subdirs + 2);
} }
int kernfs_iop_getattr(struct user_namespace *mnt_userns, int kernfs_iop_getattr(struct mnt_idmap *idmap,
const struct path *path, struct kstat *stat, const struct path *path, struct kstat *stat,
u32 request_mask, unsigned int query_flags) u32 request_mask, unsigned int query_flags)
{ {
@ -191,7 +191,7 @@ int kernfs_iop_getattr(struct user_namespace *mnt_userns,
down_read(&root->kernfs_rwsem); down_read(&root->kernfs_rwsem);
kernfs_refresh_inode(kn, inode); kernfs_refresh_inode(kn, inode);
generic_fillattr(&init_user_ns, inode, stat); generic_fillattr(&nop_mnt_idmap, inode, stat);
up_read(&root->kernfs_rwsem); up_read(&root->kernfs_rwsem);
return 0; return 0;

View File

@ -131,7 +131,7 @@ int kernfs_iop_permission(struct user_namespace *mnt_userns,
struct inode *inode, int mask); struct inode *inode, int mask);
int kernfs_iop_setattr(struct mnt_idmap *idmap, struct dentry *dentry, int kernfs_iop_setattr(struct mnt_idmap *idmap, struct dentry *dentry,
struct iattr *iattr); struct iattr *iattr);
int kernfs_iop_getattr(struct user_namespace *mnt_userns, int kernfs_iop_getattr(struct mnt_idmap *idmap,
const struct path *path, struct kstat *stat, const struct path *path, struct kstat *stat,
u32 request_mask, unsigned int query_flags); u32 request_mask, unsigned int query_flags);
ssize_t kernfs_iop_listxattr(struct dentry *dentry, char *buf, size_t size); ssize_t kernfs_iop_listxattr(struct dentry *dentry, char *buf, size_t size);

View File

@ -3631,7 +3631,8 @@ static void unlock_dir(struct ksmbd_file *dir_fp)
static int process_query_dir_entries(struct smb2_query_dir_private *priv) static int process_query_dir_entries(struct smb2_query_dir_private *priv)
{ {
struct user_namespace *user_ns = file_mnt_user_ns(priv->dir_fp->filp); struct mnt_idmap *idmap = file_mnt_idmap(priv->dir_fp->filp);
struct user_namespace *user_ns = mnt_idmap_owner(idmap);
struct kstat kstat; struct kstat kstat;
struct ksmbd_kstat ksmbd_kstat; struct ksmbd_kstat ksmbd_kstat;
int rc; int rc;
@ -3665,7 +3666,7 @@ static int process_query_dir_entries(struct smb2_query_dir_private *priv)
ksmbd_kstat.kstat = &kstat; ksmbd_kstat.kstat = &kstat;
if (priv->info_level != FILE_NAMES_INFORMATION) if (priv->info_level != FILE_NAMES_INFORMATION)
ksmbd_vfs_fill_dentry_attrs(priv->work, ksmbd_vfs_fill_dentry_attrs(priv->work,
user_ns, idmap,
dent, dent,
&ksmbd_kstat); &ksmbd_kstat);
@ -4331,7 +4332,7 @@ static int get_file_basic_info(struct smb2_query_info_rsp *rsp,
} }
basic_info = (struct smb2_file_basic_info *)rsp->Buffer; basic_info = (struct smb2_file_basic_info *)rsp->Buffer;
generic_fillattr(file_mnt_user_ns(fp->filp), file_inode(fp->filp), generic_fillattr(file_mnt_idmap(fp->filp), file_inode(fp->filp),
&stat); &stat);
basic_info->CreationTime = cpu_to_le64(fp->create_time); basic_info->CreationTime = cpu_to_le64(fp->create_time);
time = ksmbd_UnixTimeToNT(stat.atime); time = ksmbd_UnixTimeToNT(stat.atime);
@ -4372,7 +4373,7 @@ static void get_file_standard_info(struct smb2_query_info_rsp *rsp,
struct kstat stat; struct kstat stat;
inode = file_inode(fp->filp); inode = file_inode(fp->filp);
generic_fillattr(file_mnt_user_ns(fp->filp), inode, &stat); generic_fillattr(file_mnt_idmap(fp->filp), inode, &stat);
sinfo = (struct smb2_file_standard_info *)rsp->Buffer; sinfo = (struct smb2_file_standard_info *)rsp->Buffer;
delete_pending = ksmbd_inode_pending_delete(fp); delete_pending = ksmbd_inode_pending_delete(fp);
@ -4426,7 +4427,7 @@ static int get_file_all_info(struct ksmbd_work *work,
return PTR_ERR(filename); return PTR_ERR(filename);
inode = file_inode(fp->filp); inode = file_inode(fp->filp);
generic_fillattr(file_mnt_user_ns(fp->filp), inode, &stat); generic_fillattr(file_mnt_idmap(fp->filp), inode, &stat);
ksmbd_debug(SMB, "filename = %s\n", filename); ksmbd_debug(SMB, "filename = %s\n", filename);
delete_pending = ksmbd_inode_pending_delete(fp); delete_pending = ksmbd_inode_pending_delete(fp);
@ -4503,7 +4504,7 @@ static void get_file_stream_info(struct ksmbd_work *work,
int buf_free_len; int buf_free_len;
struct smb2_query_info_req *req = ksmbd_req_buf_next(work); struct smb2_query_info_req *req = ksmbd_req_buf_next(work);
generic_fillattr(file_mnt_user_ns(fp->filp), file_inode(fp->filp), generic_fillattr(file_mnt_idmap(fp->filp), file_inode(fp->filp),
&stat); &stat);
file_info = (struct smb2_file_stream_info *)rsp->Buffer; file_info = (struct smb2_file_stream_info *)rsp->Buffer;
@ -4594,7 +4595,7 @@ static void get_file_internal_info(struct smb2_query_info_rsp *rsp,
struct smb2_file_internal_info *file_info; struct smb2_file_internal_info *file_info;
struct kstat stat; struct kstat stat;
generic_fillattr(file_mnt_user_ns(fp->filp), file_inode(fp->filp), generic_fillattr(file_mnt_idmap(fp->filp), file_inode(fp->filp),
&stat); &stat);
file_info = (struct smb2_file_internal_info *)rsp->Buffer; file_info = (struct smb2_file_internal_info *)rsp->Buffer;
file_info->IndexNumber = cpu_to_le64(stat.ino); file_info->IndexNumber = cpu_to_le64(stat.ino);
@ -4620,7 +4621,7 @@ static int get_file_network_open_info(struct smb2_query_info_rsp *rsp,
file_info = (struct smb2_file_ntwrk_info *)rsp->Buffer; file_info = (struct smb2_file_ntwrk_info *)rsp->Buffer;
inode = file_inode(fp->filp); inode = file_inode(fp->filp);
generic_fillattr(file_mnt_user_ns(fp->filp), inode, &stat); generic_fillattr(file_mnt_idmap(fp->filp), inode, &stat);
file_info->CreationTime = cpu_to_le64(fp->create_time); file_info->CreationTime = cpu_to_le64(fp->create_time);
time = ksmbd_UnixTimeToNT(stat.atime); time = ksmbd_UnixTimeToNT(stat.atime);
@ -4681,7 +4682,7 @@ static void get_file_compression_info(struct smb2_query_info_rsp *rsp,
struct smb2_file_comp_info *file_info; struct smb2_file_comp_info *file_info;
struct kstat stat; struct kstat stat;
generic_fillattr(file_mnt_user_ns(fp->filp), file_inode(fp->filp), generic_fillattr(file_mnt_idmap(fp->filp), file_inode(fp->filp),
&stat); &stat);
file_info = (struct smb2_file_comp_info *)rsp->Buffer; file_info = (struct smb2_file_comp_info *)rsp->Buffer;

View File

@ -307,7 +307,7 @@ int ksmbd_populate_dot_dotdot_entries(struct ksmbd_work *work, int info_level,
{ {
int i, rc = 0; int i, rc = 0;
struct ksmbd_conn *conn = work->conn; struct ksmbd_conn *conn = work->conn;
struct user_namespace *user_ns = file_mnt_user_ns(dir->filp); struct mnt_idmap *idmap = file_mnt_idmap(dir->filp);
for (i = 0; i < 2; i++) { for (i = 0; i < 2; i++) {
struct kstat kstat; struct kstat kstat;
@ -333,7 +333,7 @@ int ksmbd_populate_dot_dotdot_entries(struct ksmbd_work *work, int info_level,
ksmbd_kstat.kstat = &kstat; ksmbd_kstat.kstat = &kstat;
ksmbd_vfs_fill_dentry_attrs(work, ksmbd_vfs_fill_dentry_attrs(work,
user_ns, idmap,
dentry, dentry,
&ksmbd_kstat); &ksmbd_kstat);
rc = fn(conn, info_level, d_info, &ksmbd_kstat); rc = fn(conn, info_level, d_info, &ksmbd_kstat);

View File

@ -1657,14 +1657,14 @@ void *ksmbd_vfs_init_kstat(char **p, struct ksmbd_kstat *ksmbd_kstat)
} }
int ksmbd_vfs_fill_dentry_attrs(struct ksmbd_work *work, int ksmbd_vfs_fill_dentry_attrs(struct ksmbd_work *work,
struct user_namespace *user_ns, struct mnt_idmap *idmap,
struct dentry *dentry, struct dentry *dentry,
struct ksmbd_kstat *ksmbd_kstat) struct ksmbd_kstat *ksmbd_kstat)
{ {
u64 time; u64 time;
int rc; int rc;
generic_fillattr(user_ns, d_inode(dentry), ksmbd_kstat->kstat); generic_fillattr(idmap, d_inode(dentry), ksmbd_kstat->kstat);
time = ksmbd_UnixTimeToNT(ksmbd_kstat->kstat->ctime); time = ksmbd_UnixTimeToNT(ksmbd_kstat->kstat->ctime);
ksmbd_kstat->create_time = time; ksmbd_kstat->create_time = time;
@ -1682,7 +1682,7 @@ int ksmbd_vfs_fill_dentry_attrs(struct ksmbd_work *work,
KSMBD_SHARE_FLAG_STORE_DOS_ATTRS)) { KSMBD_SHARE_FLAG_STORE_DOS_ATTRS)) {
struct xattr_dos_attrib da; struct xattr_dos_attrib da;
rc = ksmbd_vfs_get_dos_attrib_xattr(user_ns, dentry, &da); rc = ksmbd_vfs_get_dos_attrib_xattr(mnt_idmap_owner(idmap), dentry, &da);
if (rc > 0) { if (rc > 0) {
ksmbd_kstat->file_attributes = cpu_to_le32(da.attr); ksmbd_kstat->file_attributes = cpu_to_le32(da.attr);
ksmbd_kstat->create_time = da.create_time; ksmbd_kstat->create_time = da.create_time;

View File

@ -135,7 +135,7 @@ int ksmbd_vfs_unlink(struct mnt_idmap *idmap, struct dentry *dir,
struct dentry *dentry); struct dentry *dentry);
void *ksmbd_vfs_init_kstat(char **p, struct ksmbd_kstat *ksmbd_kstat); void *ksmbd_vfs_init_kstat(char **p, struct ksmbd_kstat *ksmbd_kstat);
int ksmbd_vfs_fill_dentry_attrs(struct ksmbd_work *work, int ksmbd_vfs_fill_dentry_attrs(struct ksmbd_work *work,
struct user_namespace *user_ns, struct mnt_idmap *idmap,
struct dentry *dentry, struct dentry *dentry,
struct ksmbd_kstat *ksmbd_kstat); struct ksmbd_kstat *ksmbd_kstat);
void ksmbd_vfs_posix_lock_wait(struct file_lock *flock); void ksmbd_vfs_posix_lock_wait(struct file_lock *flock);

View File

@ -28,12 +28,12 @@
#include "internal.h" #include "internal.h"
int simple_getattr(struct user_namespace *mnt_userns, const struct path *path, int simple_getattr(struct mnt_idmap *idmap, const struct path *path,
struct kstat *stat, u32 request_mask, struct kstat *stat, u32 request_mask,
unsigned int query_flags) unsigned int query_flags)
{ {
struct inode *inode = d_inode(path->dentry); struct inode *inode = d_inode(path->dentry);
generic_fillattr(&init_user_ns, inode, stat); generic_fillattr(&nop_mnt_idmap, inode, stat);
stat->blocks = inode->i_mapping->nrpages << (PAGE_SHIFT - 9); stat->blocks = inode->i_mapping->nrpages << (PAGE_SHIFT - 9);
return 0; return 0;
} }
@ -1315,12 +1315,12 @@ static struct dentry *empty_dir_lookup(struct inode *dir, struct dentry *dentry,
return ERR_PTR(-ENOENT); return ERR_PTR(-ENOENT);
} }
static int empty_dir_getattr(struct user_namespace *mnt_userns, static int empty_dir_getattr(struct mnt_idmap *idmap,
const struct path *path, struct kstat *stat, const struct path *path, struct kstat *stat,
u32 request_mask, unsigned int query_flags) u32 request_mask, unsigned int query_flags)
{ {
struct inode *inode = d_inode(path->dentry); struct inode *inode = d_inode(path->dentry);
generic_fillattr(&init_user_ns, inode, stat); generic_fillattr(&nop_mnt_idmap, inode, stat);
return 0; return 0;
} }

View File

@ -654,13 +654,13 @@ static int minix_write_inode(struct inode *inode, struct writeback_control *wbc)
return err; return err;
} }
int minix_getattr(struct user_namespace *mnt_userns, const struct path *path, int minix_getattr(struct mnt_idmap *idmap, const struct path *path,
struct kstat *stat, u32 request_mask, unsigned int flags) struct kstat *stat, u32 request_mask, unsigned int flags)
{ {
struct super_block *sb = path->dentry->d_sb; struct super_block *sb = path->dentry->d_sb;
struct inode *inode = d_inode(path->dentry); struct inode *inode = d_inode(path->dentry);
generic_fillattr(&init_user_ns, inode, stat); generic_fillattr(&nop_mnt_idmap, inode, stat);
if (INODE_VERSION(inode) == MINIX_V1) if (INODE_VERSION(inode) == MINIX_V1)
stat->blocks = (BLOCK_SIZE / 512) * V1_minix_blocks(stat->size, sb); stat->blocks = (BLOCK_SIZE / 512) * V1_minix_blocks(stat->size, sb);
else else

View File

@ -51,7 +51,7 @@ extern unsigned long minix_count_free_inodes(struct super_block *sb);
extern int minix_new_block(struct inode * inode); extern int minix_new_block(struct inode * inode);
extern void minix_free_block(struct inode *inode, unsigned long block); extern void minix_free_block(struct inode *inode, unsigned long block);
extern unsigned long minix_count_free_blocks(struct super_block *sb); extern unsigned long minix_count_free_blocks(struct super_block *sb);
extern int minix_getattr(struct user_namespace *, const struct path *, extern int minix_getattr(struct mnt_idmap *, const struct path *,
struct kstat *, u32, unsigned int); struct kstat *, u32, unsigned int);
extern int minix_prepare_chunk(struct page *page, loff_t pos, unsigned len); extern int minix_prepare_chunk(struct page *page, loff_t pos, unsigned len);

View File

@ -828,7 +828,7 @@ static u32 nfs_get_valid_attrmask(struct inode *inode)
return reply_mask; return reply_mask;
} }
int nfs_getattr(struct user_namespace *mnt_userns, const struct path *path, int nfs_getattr(struct mnt_idmap *idmap, const struct path *path,
struct kstat *stat, u32 request_mask, unsigned int query_flags) struct kstat *stat, u32 request_mask, unsigned int query_flags)
{ {
struct inode *inode = d_inode(path->dentry); struct inode *inode = d_inode(path->dentry);
@ -908,7 +908,7 @@ out_no_revalidate:
/* Only return attributes that were revalidated. */ /* Only return attributes that were revalidated. */
stat->result_mask = nfs_get_valid_attrmask(inode) | request_mask; stat->result_mask = nfs_get_valid_attrmask(inode) | request_mask;
generic_fillattr(&init_user_ns, inode, stat); generic_fillattr(&nop_mnt_idmap, inode, stat);
stat->ino = nfs_compat_user_ino64(NFS_FILEID(inode)); stat->ino = nfs_compat_user_ino64(NFS_FILEID(inode));
if (S_ISDIR(inode->i_mode)) if (S_ISDIR(inode->i_mode))
stat->blksize = NFS_SERVER(inode)->dtsize; stat->blksize = NFS_SERVER(inode)->dtsize;

View File

@ -208,14 +208,14 @@ out_fc:
} }
static int static int
nfs_namespace_getattr(struct user_namespace *mnt_userns, nfs_namespace_getattr(struct mnt_idmap *idmap,
const struct path *path, struct kstat *stat, const struct path *path, struct kstat *stat,
u32 request_mask, unsigned int query_flags) u32 request_mask, unsigned int query_flags)
{ {
if (NFS_FH(d_inode(path->dentry))->size != 0) if (NFS_FH(d_inode(path->dentry))->size != 0)
return nfs_getattr(mnt_userns, path, stat, request_mask, return nfs_getattr(idmap, path, stat, request_mask,
query_flags); query_flags);
generic_fillattr(&init_user_ns, d_inode(path->dentry), stat); generic_fillattr(&nop_mnt_idmap, d_inode(path->dentry), stat);
return 0; return 0;
} }

View File

@ -70,7 +70,7 @@ static long ntfs_compat_ioctl(struct file *filp, u32 cmd, unsigned long arg)
/* /*
* ntfs_getattr - inode_operations::getattr * ntfs_getattr - inode_operations::getattr
*/ */
int ntfs_getattr(struct user_namespace *mnt_userns, const struct path *path, int ntfs_getattr(struct mnt_idmap *idmap, const struct path *path,
struct kstat *stat, u32 request_mask, u32 flags) struct kstat *stat, u32 request_mask, u32 flags)
{ {
struct inode *inode = d_inode(path->dentry); struct inode *inode = d_inode(path->dentry);
@ -84,7 +84,7 @@ int ntfs_getattr(struct user_namespace *mnt_userns, const struct path *path,
stat->attributes_mask |= STATX_ATTR_COMPRESSED | STATX_ATTR_ENCRYPTED; stat->attributes_mask |= STATX_ATTR_COMPRESSED | STATX_ATTR_ENCRYPTED;
generic_fillattr(mnt_userns, inode, stat); generic_fillattr(idmap, inode, stat);
stat->result_mask |= STATX_BTIME; stat->result_mask |= STATX_BTIME;
stat->btime = ni->i_crtime; stat->btime = ni->i_crtime;

View File

@ -492,7 +492,7 @@ bool dir_is_empty(struct inode *dir);
extern const struct file_operations ntfs_dir_operations; extern const struct file_operations ntfs_dir_operations;
/* Globals from file.c */ /* Globals from file.c */
int ntfs_getattr(struct user_namespace *mnt_userns, const struct path *path, int ntfs_getattr(struct mnt_idmap *idmap, const struct path *path,
struct kstat *stat, u32 request_mask, u32 flags); struct kstat *stat, u32 request_mask, u32 flags);
int ntfs3_setattr(struct mnt_idmap *idmap, struct dentry *dentry, int ntfs3_setattr(struct mnt_idmap *idmap, struct dentry *dentry,
struct iattr *attr); struct iattr *attr);

View File

@ -1303,7 +1303,7 @@ bail:
return status; return status;
} }
int ocfs2_getattr(struct user_namespace *mnt_userns, const struct path *path, int ocfs2_getattr(struct mnt_idmap *idmap, const struct path *path,
struct kstat *stat, u32 request_mask, unsigned int flags) struct kstat *stat, u32 request_mask, unsigned int flags)
{ {
struct inode *inode = d_inode(path->dentry); struct inode *inode = d_inode(path->dentry);
@ -1318,7 +1318,7 @@ int ocfs2_getattr(struct user_namespace *mnt_userns, const struct path *path,
goto bail; goto bail;
} }
generic_fillattr(&init_user_ns, inode, stat); generic_fillattr(&nop_mnt_idmap, inode, stat);
/* /*
* If there is inline data in the inode, the inode will normally not * If there is inline data in the inode, the inode will normally not
* have data blocks allocated (it may have an external xattr block). * have data blocks allocated (it may have an external xattr block).

View File

@ -51,7 +51,7 @@ int ocfs2_zero_extend(struct inode *inode, struct buffer_head *di_bh,
loff_t zero_to); loff_t zero_to);
int ocfs2_setattr(struct mnt_idmap *idmap, struct dentry *dentry, int ocfs2_setattr(struct mnt_idmap *idmap, struct dentry *dentry,
struct iattr *attr); struct iattr *attr);
int ocfs2_getattr(struct user_namespace *mnt_userns, const struct path *path, int ocfs2_getattr(struct mnt_idmap *idmap, const struct path *path,
struct kstat *stat, u32 request_mask, unsigned int flags); struct kstat *stat, u32 request_mask, unsigned int flags);
int ocfs2_permission(struct user_namespace *mnt_userns, int ocfs2_permission(struct user_namespace *mnt_userns,
struct inode *inode, struct inode *inode,

View File

@ -866,7 +866,7 @@ out:
/* /*
* Obtain attributes of an object given a dentry * Obtain attributes of an object given a dentry
*/ */
int orangefs_getattr(struct user_namespace *mnt_userns, const struct path *path, int orangefs_getattr(struct mnt_idmap *idmap, const struct path *path,
struct kstat *stat, u32 request_mask, unsigned int flags) struct kstat *stat, u32 request_mask, unsigned int flags)
{ {
int ret; int ret;
@ -879,7 +879,7 @@ int orangefs_getattr(struct user_namespace *mnt_userns, const struct path *path,
ret = orangefs_inode_getattr(inode, ret = orangefs_inode_getattr(inode,
request_mask & STATX_SIZE ? ORANGEFS_GETATTR_SIZE : 0); request_mask & STATX_SIZE ? ORANGEFS_GETATTR_SIZE : 0);
if (ret == 0) { if (ret == 0) {
generic_fillattr(&init_user_ns, inode, stat); generic_fillattr(&nop_mnt_idmap, inode, stat);
/* override block size reported to stat */ /* override block size reported to stat */
if (!(request_mask & STATX_SIZE)) if (!(request_mask & STATX_SIZE))

View File

@ -364,7 +364,7 @@ int __orangefs_setattr(struct inode *, struct iattr *);
int __orangefs_setattr_mode(struct dentry *dentry, struct iattr *iattr); int __orangefs_setattr_mode(struct dentry *dentry, struct iattr *iattr);
int orangefs_setattr(struct mnt_idmap *, struct dentry *, struct iattr *); int orangefs_setattr(struct mnt_idmap *, struct dentry *, struct iattr *);
int orangefs_getattr(struct user_namespace *mnt_userns, const struct path *path, int orangefs_getattr(struct mnt_idmap *idmap, const struct path *path,
struct kstat *stat, u32 request_mask, unsigned int flags); struct kstat *stat, u32 request_mask, unsigned int flags);
int orangefs_permission(struct user_namespace *mnt_userns, int orangefs_permission(struct user_namespace *mnt_userns,

View File

@ -153,7 +153,7 @@ static void ovl_map_dev_ino(struct dentry *dentry, struct kstat *stat, int fsid)
} }
} }
int ovl_getattr(struct user_namespace *mnt_userns, const struct path *path, int ovl_getattr(struct mnt_idmap *idmap, const struct path *path,
struct kstat *stat, u32 request_mask, unsigned int flags) struct kstat *stat, u32 request_mask, unsigned int flags)
{ {
struct dentry *dentry = path->dentry; struct dentry *dentry = path->dentry;

View File

@ -599,7 +599,7 @@ unsigned int ovl_get_nlink(struct ovl_fs *ofs, struct dentry *lowerdentry,
unsigned int fallback); unsigned int fallback);
int ovl_setattr(struct mnt_idmap *idmap, struct dentry *dentry, int ovl_setattr(struct mnt_idmap *idmap, struct dentry *dentry,
struct iattr *attr); struct iattr *attr);
int ovl_getattr(struct user_namespace *mnt_userns, const struct path *path, int ovl_getattr(struct mnt_idmap *idmap, const struct path *path,
struct kstat *stat, u32 request_mask, unsigned int flags); struct kstat *stat, u32 request_mask, unsigned int flags);
int ovl_permission(struct user_namespace *mnt_userns, struct inode *inode, int ovl_permission(struct user_namespace *mnt_userns, struct inode *inode,
int mask); int mask);

View File

@ -1959,14 +1959,14 @@ static struct inode *proc_pid_make_base_inode(struct super_block *sb,
return inode; return inode;
} }
int pid_getattr(struct user_namespace *mnt_userns, const struct path *path, int pid_getattr(struct mnt_idmap *idmap, const struct path *path,
struct kstat *stat, u32 request_mask, unsigned int query_flags) struct kstat *stat, u32 request_mask, unsigned int query_flags)
{ {
struct inode *inode = d_inode(path->dentry); struct inode *inode = d_inode(path->dentry);
struct proc_fs_info *fs_info = proc_sb_info(inode->i_sb); struct proc_fs_info *fs_info = proc_sb_info(inode->i_sb);
struct task_struct *task; struct task_struct *task;
generic_fillattr(&init_user_ns, inode, stat); generic_fillattr(&nop_mnt_idmap, inode, stat);
stat->uid = GLOBAL_ROOT_UID; stat->uid = GLOBAL_ROOT_UID;
stat->gid = GLOBAL_ROOT_GID; stat->gid = GLOBAL_ROOT_GID;
@ -3891,13 +3891,13 @@ static int proc_task_readdir(struct file *file, struct dir_context *ctx)
return 0; return 0;
} }
static int proc_task_getattr(struct user_namespace *mnt_userns, static int proc_task_getattr(struct mnt_idmap *idmap,
const struct path *path, struct kstat *stat, const struct path *path, struct kstat *stat,
u32 request_mask, unsigned int query_flags) u32 request_mask, unsigned int query_flags)
{ {
struct inode *inode = d_inode(path->dentry); struct inode *inode = d_inode(path->dentry);
struct task_struct *p = get_proc_task(inode); struct task_struct *p = get_proc_task(inode);
generic_fillattr(&init_user_ns, inode, stat); generic_fillattr(&nop_mnt_idmap, inode, stat);
if (p) { if (p) {
stat->nlink += get_nr_threads(p); stat->nlink += get_nr_threads(p);

View File

@ -344,14 +344,14 @@ int proc_fd_permission(struct user_namespace *mnt_userns,
return rv; return rv;
} }
static int proc_fd_getattr(struct user_namespace *mnt_userns, static int proc_fd_getattr(struct mnt_idmap *idmap,
const struct path *path, struct kstat *stat, const struct path *path, struct kstat *stat,
u32 request_mask, unsigned int query_flags) u32 request_mask, unsigned int query_flags)
{ {
struct inode *inode = d_inode(path->dentry); struct inode *inode = d_inode(path->dentry);
int rv = 0; int rv = 0;
generic_fillattr(&init_user_ns, inode, stat); generic_fillattr(&nop_mnt_idmap, inode, stat);
/* If it's a directory, put the number of open fds there */ /* If it's a directory, put the number of open fds there */
if (S_ISDIR(inode->i_mode)) { if (S_ISDIR(inode->i_mode)) {

View File

@ -134,7 +134,7 @@ static int proc_notify_change(struct mnt_idmap *idmap,
return 0; return 0;
} }
static int proc_getattr(struct user_namespace *mnt_userns, static int proc_getattr(struct mnt_idmap *idmap,
const struct path *path, struct kstat *stat, const struct path *path, struct kstat *stat,
u32 request_mask, unsigned int query_flags) u32 request_mask, unsigned int query_flags)
{ {
@ -147,7 +147,7 @@ static int proc_getattr(struct user_namespace *mnt_userns,
} }
} }
generic_fillattr(&init_user_ns, inode, stat); generic_fillattr(&nop_mnt_idmap, inode, stat);
return 0; return 0;
} }

View File

@ -162,7 +162,7 @@ extern int proc_pid_statm(struct seq_file *, struct pid_namespace *,
* base.c * base.c
*/ */
extern const struct dentry_operations pid_dentry_operations; extern const struct dentry_operations pid_dentry_operations;
extern int pid_getattr(struct user_namespace *, const struct path *, extern int pid_getattr(struct mnt_idmap *, const struct path *,
struct kstat *, u32, unsigned int); struct kstat *, u32, unsigned int);
extern int proc_setattr(struct mnt_idmap *, struct dentry *, extern int proc_setattr(struct mnt_idmap *, struct dentry *,
struct iattr *); struct iattr *);

View File

@ -299,7 +299,7 @@ static struct dentry *proc_tgid_net_lookup(struct inode *dir,
return de; return de;
} }
static int proc_tgid_net_getattr(struct user_namespace *mnt_userns, static int proc_tgid_net_getattr(struct mnt_idmap *idmap,
const struct path *path, struct kstat *stat, const struct path *path, struct kstat *stat,
u32 request_mask, unsigned int query_flags) u32 request_mask, unsigned int query_flags)
{ {
@ -308,7 +308,7 @@ static int proc_tgid_net_getattr(struct user_namespace *mnt_userns,
net = get_proc_task_net(inode); net = get_proc_task_net(inode);
generic_fillattr(&init_user_ns, inode, stat); generic_fillattr(&nop_mnt_idmap, inode, stat);
if (net != NULL) { if (net != NULL) {
stat->nlink = net->proc_net->nlink; stat->nlink = net->proc_net->nlink;

View File

@ -845,7 +845,7 @@ static int proc_sys_setattr(struct mnt_idmap *idmap,
return 0; return 0;
} }
static int proc_sys_getattr(struct user_namespace *mnt_userns, static int proc_sys_getattr(struct mnt_idmap *idmap,
const struct path *path, struct kstat *stat, const struct path *path, struct kstat *stat,
u32 request_mask, unsigned int query_flags) u32 request_mask, unsigned int query_flags)
{ {
@ -856,7 +856,7 @@ static int proc_sys_getattr(struct user_namespace *mnt_userns,
if (IS_ERR(head)) if (IS_ERR(head))
return PTR_ERR(head); return PTR_ERR(head);
generic_fillattr(&init_user_ns, inode, stat); generic_fillattr(&nop_mnt_idmap, inode, stat);
if (table) if (table)
stat->mode = (stat->mode & S_IFMT) | table->mode; stat->mode = (stat->mode & S_IFMT) | table->mode;

View File

@ -310,11 +310,11 @@ void __init proc_root_init(void)
register_filesystem(&proc_fs_type); register_filesystem(&proc_fs_type);
} }
static int proc_root_getattr(struct user_namespace *mnt_userns, static int proc_root_getattr(struct mnt_idmap *idmap,
const struct path *path, struct kstat *stat, const struct path *path, struct kstat *stat,
u32 request_mask, unsigned int query_flags) u32 request_mask, unsigned int query_flags)
{ {
generic_fillattr(&init_user_ns, d_inode(path->dentry), stat); generic_fillattr(&nop_mnt_idmap, d_inode(path->dentry), stat);
stat->nlink = proc_root.nlink + nr_processes(); stat->nlink = proc_root.nlink + nr_processes();
return 0; return 0;
} }

View File

@ -27,7 +27,7 @@
/** /**
* generic_fillattr - Fill in the basic attributes from the inode struct * generic_fillattr - Fill in the basic attributes from the inode struct
* @mnt_userns: user namespace of the mount the inode was found from * @idmap: idmap of the mount the inode was found from
* @inode: Inode to use as the source * @inode: Inode to use as the source
* @stat: Where to fill in the attributes * @stat: Where to fill in the attributes
* *
@ -35,15 +35,17 @@
* found on the VFS inode structure. This is the default if no getattr inode * found on the VFS inode structure. This is the default if no getattr inode
* operation is supplied. * operation is supplied.
* *
* If the inode has been found through an idmapped mount the user namespace of * If the inode has been found through an idmapped mount the idmap of
* the vfsmount must be passed through @mnt_userns. This function will then * the vfsmount must be passed through @idmap. This function will then
* take care to map the inode according to @mnt_userns before filling in the * take care to map the inode according to @idmap before filling in the
* uid and gid filds. On non-idmapped mounts or if permission checking is to be * uid and gid filds. On non-idmapped mounts or if permission checking is to be
* performed on the raw inode simply passs init_user_ns. * performed on the raw inode simply passs @nop_mnt_idmap.
*/ */
void generic_fillattr(struct user_namespace *mnt_userns, struct inode *inode, void generic_fillattr(struct mnt_idmap *idmap, struct inode *inode,
struct kstat *stat) struct kstat *stat)
{ {
struct user_namespace *mnt_userns = mnt_idmap_owner(idmap);
vfsuid_t vfsuid = i_uid_into_vfsuid(mnt_userns, inode); vfsuid_t vfsuid = i_uid_into_vfsuid(mnt_userns, inode);
vfsgid_t vfsgid = i_gid_into_vfsgid(mnt_userns, inode); vfsgid_t vfsgid = i_gid_into_vfsgid(mnt_userns, inode);
@ -97,7 +99,7 @@ EXPORT_SYMBOL(generic_fill_statx_attr);
int vfs_getattr_nosec(const struct path *path, struct kstat *stat, int vfs_getattr_nosec(const struct path *path, struct kstat *stat,
u32 request_mask, unsigned int query_flags) u32 request_mask, unsigned int query_flags)
{ {
struct user_namespace *mnt_userns; struct mnt_idmap *idmap;
struct inode *inode = d_backing_inode(path->dentry); struct inode *inode = d_backing_inode(path->dentry);
memset(stat, 0, sizeof(*stat)); memset(stat, 0, sizeof(*stat));
@ -122,12 +124,12 @@ int vfs_getattr_nosec(const struct path *path, struct kstat *stat,
stat->attributes_mask |= (STATX_ATTR_AUTOMOUNT | stat->attributes_mask |= (STATX_ATTR_AUTOMOUNT |
STATX_ATTR_DAX); STATX_ATTR_DAX);
mnt_userns = mnt_user_ns(path->mnt); idmap = mnt_idmap(path->mnt);
if (inode->i_op->getattr) if (inode->i_op->getattr)
return inode->i_op->getattr(mnt_userns, path, stat, return inode->i_op->getattr(idmap, path, stat,
request_mask, query_flags); request_mask, query_flags);
generic_fillattr(mnt_userns, inode, stat); generic_fillattr(idmap, inode, stat);
return 0; return 0;
} }
EXPORT_SYMBOL(vfs_getattr_nosec); EXPORT_SYMBOL(vfs_getattr_nosec);

View File

@ -441,11 +441,11 @@ static unsigned sysv_nblocks(struct super_block *s, loff_t size)
return res; return res;
} }
int sysv_getattr(struct user_namespace *mnt_userns, const struct path *path, int sysv_getattr(struct mnt_idmap *idmap, const struct path *path,
struct kstat *stat, u32 request_mask, unsigned int flags) struct kstat *stat, u32 request_mask, unsigned int flags)
{ {
struct super_block *s = path->dentry->d_sb; struct super_block *s = path->dentry->d_sb;
generic_fillattr(&init_user_ns, d_inode(path->dentry), stat); generic_fillattr(&nop_mnt_idmap, d_inode(path->dentry), stat);
stat->blocks = (s->s_blocksize / 512) * sysv_nblocks(s, stat->size); stat->blocks = (s->s_blocksize / 512) * sysv_nblocks(s, stat->size);
stat->blksize = s->s_blocksize; stat->blksize = s->s_blocksize;
return 0; return 0;

View File

@ -141,7 +141,7 @@ extern struct inode *sysv_iget(struct super_block *, unsigned int);
extern int sysv_write_inode(struct inode *, struct writeback_control *wbc); extern int sysv_write_inode(struct inode *, struct writeback_control *wbc);
extern int sysv_sync_inode(struct inode *); extern int sysv_sync_inode(struct inode *);
extern void sysv_set_inode(struct inode *, dev_t); extern void sysv_set_inode(struct inode *, dev_t);
extern int sysv_getattr(struct user_namespace *, const struct path *, extern int sysv_getattr(struct mnt_idmap *, const struct path *,
struct kstat *, u32, unsigned int); struct kstat *, u32, unsigned int);
extern int sysv_init_icache(void); extern int sysv_init_icache(void);
extern void sysv_destroy_icache(void); extern void sysv_destroy_icache(void);

View File

@ -1631,7 +1631,7 @@ static int ubifs_rename(struct user_namespace *mnt_userns,
return do_rename(old_dir, old_dentry, new_dir, new_dentry, flags); return do_rename(old_dir, old_dentry, new_dir, new_dentry, flags);
} }
int ubifs_getattr(struct user_namespace *mnt_userns, const struct path *path, int ubifs_getattr(struct mnt_idmap *idmap, const struct path *path,
struct kstat *stat, u32 request_mask, unsigned int flags) struct kstat *stat, u32 request_mask, unsigned int flags)
{ {
loff_t size; loff_t size;
@ -1654,7 +1654,7 @@ int ubifs_getattr(struct user_namespace *mnt_userns, const struct path *path,
STATX_ATTR_ENCRYPTED | STATX_ATTR_ENCRYPTED |
STATX_ATTR_IMMUTABLE); STATX_ATTR_IMMUTABLE);
generic_fillattr(&init_user_ns, inode, stat); generic_fillattr(&nop_mnt_idmap, inode, stat);
stat->blksize = UBIFS_BLOCK_SIZE; stat->blksize = UBIFS_BLOCK_SIZE;
stat->size = ui->ui_size; stat->size = ui->ui_size;

View File

@ -1608,11 +1608,11 @@ static const char *ubifs_get_link(struct dentry *dentry,
return fscrypt_get_symlink(inode, ui->data, ui->data_len, done); return fscrypt_get_symlink(inode, ui->data, ui->data_len, done);
} }
static int ubifs_symlink_getattr(struct user_namespace *mnt_userns, static int ubifs_symlink_getattr(struct mnt_idmap *idmap,
const struct path *path, struct kstat *stat, const struct path *path, struct kstat *stat,
u32 request_mask, unsigned int query_flags) u32 request_mask, unsigned int query_flags)
{ {
ubifs_getattr(mnt_userns, path, stat, request_mask, query_flags); ubifs_getattr(idmap, path, stat, request_mask, query_flags);
if (IS_ENCRYPTED(d_inode(path->dentry))) if (IS_ENCRYPTED(d_inode(path->dentry)))
return fscrypt_symlink_getattr(path, stat); return fscrypt_symlink_getattr(path, stat);

View File

@ -2027,8 +2027,8 @@ int ubifs_update_time(struct inode *inode, struct timespec64 *time, int flags);
/* dir.c */ /* dir.c */
struct inode *ubifs_new_inode(struct ubifs_info *c, struct inode *dir, struct inode *ubifs_new_inode(struct ubifs_info *c, struct inode *dir,
umode_t mode, bool is_xattr); umode_t mode, bool is_xattr);
int ubifs_getattr(struct user_namespace *mnt_userns, const struct path *path, struct kstat *stat, int ubifs_getattr(struct mnt_idmap *idmap, const struct path *path,
u32 request_mask, unsigned int flags); struct kstat *stat, u32 request_mask, unsigned int flags);
int ubifs_check_dir_empty(struct inode *dir); int ubifs_check_dir_empty(struct inode *dir);
/* xattr.c */ /* xattr.c */

View File

@ -153,7 +153,7 @@ out_unmap:
return err; return err;
} }
static int udf_symlink_getattr(struct user_namespace *mnt_userns, static int udf_symlink_getattr(struct mnt_idmap *idmap,
const struct path *path, struct kstat *stat, const struct path *path, struct kstat *stat,
u32 request_mask, unsigned int flags) u32 request_mask, unsigned int flags)
{ {
@ -161,7 +161,7 @@ static int udf_symlink_getattr(struct user_namespace *mnt_userns,
struct inode *inode = d_backing_inode(dentry); struct inode *inode = d_backing_inode(dentry);
struct page *page; struct page *page;
generic_fillattr(&init_user_ns, inode, stat); generic_fillattr(&nop_mnt_idmap, inode, stat);
page = read_mapping_page(inode->i_mapping, 0, NULL); page = read_mapping_page(inode->i_mapping, 0, NULL);
if (IS_ERR(page)) if (IS_ERR(page))
return PTR_ERR(page); return PTR_ERR(page);

View File

@ -231,7 +231,7 @@ int vboxsf_inode_revalidate(struct dentry *dentry)
return 0; return 0;
} }
int vboxsf_getattr(struct user_namespace *mnt_userns, const struct path *path, int vboxsf_getattr(struct mnt_idmap *idmap, const struct path *path,
struct kstat *kstat, u32 request_mask, unsigned int flags) struct kstat *kstat, u32 request_mask, unsigned int flags)
{ {
int err; int err;
@ -252,7 +252,7 @@ int vboxsf_getattr(struct user_namespace *mnt_userns, const struct path *path,
if (err) if (err)
return err; return err;
generic_fillattr(&init_user_ns, d_inode(dentry), kstat); generic_fillattr(&nop_mnt_idmap, d_inode(dentry), kstat);
return 0; return 0;
} }

View File

@ -97,7 +97,7 @@ int vboxsf_stat(struct vboxsf_sbi *sbi, struct shfl_string *path,
struct shfl_fsobjinfo *info); struct shfl_fsobjinfo *info);
int vboxsf_stat_dentry(struct dentry *dentry, struct shfl_fsobjinfo *info); int vboxsf_stat_dentry(struct dentry *dentry, struct shfl_fsobjinfo *info);
int vboxsf_inode_revalidate(struct dentry *dentry); int vboxsf_inode_revalidate(struct dentry *dentry);
int vboxsf_getattr(struct user_namespace *mnt_userns, const struct path *path, int vboxsf_getattr(struct mnt_idmap *idmap, const struct path *path,
struct kstat *kstat, u32 request_mask, struct kstat *kstat, u32 request_mask,
unsigned int query_flags); unsigned int query_flags);
int vboxsf_setattr(struct mnt_idmap *idmap, struct dentry *dentry, int vboxsf_setattr(struct mnt_idmap *idmap, struct dentry *dentry,

View File

@ -549,12 +549,13 @@ xfs_stat_blksize(
STATIC int STATIC int
xfs_vn_getattr( xfs_vn_getattr(
struct user_namespace *mnt_userns, struct mnt_idmap *idmap,
const struct path *path, const struct path *path,
struct kstat *stat, struct kstat *stat,
u32 request_mask, u32 request_mask,
unsigned int query_flags) unsigned int query_flags)
{ {
struct user_namespace *mnt_userns = mnt_idmap_owner(idmap);
struct inode *inode = d_inode(path->dentry); struct inode *inode = d_inode(path->dentry);
struct xfs_inode *ip = XFS_I(inode); struct xfs_inode *ip = XFS_I(inode);
struct xfs_mount *mp = ip->i_mount; struct xfs_mount *mp = ip->i_mount;

View File

@ -2153,7 +2153,7 @@ struct inode_operations {
int (*rename) (struct user_namespace *, struct inode *, struct dentry *, int (*rename) (struct user_namespace *, struct inode *, struct dentry *,
struct inode *, struct dentry *, unsigned int); struct inode *, struct dentry *, unsigned int);
int (*setattr) (struct mnt_idmap *, struct dentry *, struct iattr *); int (*setattr) (struct mnt_idmap *, struct dentry *, struct iattr *);
int (*getattr) (struct user_namespace *, const struct path *, int (*getattr) (struct mnt_idmap *, const struct path *,
struct kstat *, u32, unsigned int); struct kstat *, u32, unsigned int);
ssize_t (*listxattr) (struct dentry *, char *, size_t); ssize_t (*listxattr) (struct dentry *, char *, size_t);
int (*fiemap)(struct inode *, struct fiemap_extent_info *, u64 start, int (*fiemap)(struct inode *, struct fiemap_extent_info *, u64 start,
@ -3261,7 +3261,7 @@ extern void page_put_link(void *);
extern int page_symlink(struct inode *inode, const char *symname, int len); extern int page_symlink(struct inode *inode, const char *symname, int len);
extern const struct inode_operations page_symlink_inode_operations; extern const struct inode_operations page_symlink_inode_operations;
extern void kfree_link(void *); extern void kfree_link(void *);
void generic_fillattr(struct user_namespace *, struct inode *, struct kstat *); void generic_fillattr(struct mnt_idmap *, struct inode *, struct kstat *);
void generic_fill_statx_attr(struct inode *inode, struct kstat *stat); void generic_fill_statx_attr(struct inode *inode, struct kstat *stat);
extern int vfs_getattr_nosec(const struct path *, struct kstat *, u32, unsigned int); extern int vfs_getattr_nosec(const struct path *, struct kstat *, u32, unsigned int);
extern int vfs_getattr(const struct path *, struct kstat *, u32, unsigned int); extern int vfs_getattr(const struct path *, struct kstat *, u32, unsigned int);
@ -3314,7 +3314,7 @@ extern loff_t dcache_dir_lseek(struct file *, loff_t, int);
extern int dcache_readdir(struct file *, struct dir_context *); extern int dcache_readdir(struct file *, struct dir_context *);
extern int simple_setattr(struct mnt_idmap *, struct dentry *, extern int simple_setattr(struct mnt_idmap *, struct dentry *,
struct iattr *); struct iattr *);
extern int simple_getattr(struct user_namespace *, const struct path *, extern int simple_getattr(struct mnt_idmap *, const struct path *,
struct kstat *, u32, unsigned int); struct kstat *, u32, unsigned int);
extern int simple_statfs(struct dentry *, struct kstatfs *); extern int simple_statfs(struct dentry *, struct kstatfs *);
extern int simple_open(struct inode *inode, struct file *file); extern int simple_open(struct inode *inode, struct file *file);

View File

@ -392,7 +392,7 @@ extern int nfs_refresh_inode(struct inode *, struct nfs_fattr *);
extern int nfs_post_op_update_inode(struct inode *inode, struct nfs_fattr *fattr); extern int nfs_post_op_update_inode(struct inode *inode, struct nfs_fattr *fattr);
extern int nfs_post_op_update_inode_force_wcc(struct inode *inode, struct nfs_fattr *fattr); extern int nfs_post_op_update_inode_force_wcc(struct inode *inode, struct nfs_fattr *fattr);
extern int nfs_post_op_update_inode_force_wcc_locked(struct inode *inode, struct nfs_fattr *fattr); extern int nfs_post_op_update_inode_force_wcc_locked(struct inode *inode, struct nfs_fattr *fattr);
extern int nfs_getattr(struct user_namespace *, const struct path *, extern int nfs_getattr(struct mnt_idmap *, const struct path *,
struct kstat *, u32, unsigned int); struct kstat *, u32, unsigned int);
extern void nfs_access_add_cache(struct inode *, struct nfs_access_entry *, const struct cred *); extern void nfs_access_add_cache(struct inode *, struct nfs_access_entry *, const struct cred *);
extern void nfs_access_set_mask(struct nfs_access_entry *, u32); extern void nfs_access_set_mask(struct nfs_access_entry *, u32);

View File

@ -1047,7 +1047,7 @@ void shmem_truncate_range(struct inode *inode, loff_t lstart, loff_t lend)
} }
EXPORT_SYMBOL_GPL(shmem_truncate_range); EXPORT_SYMBOL_GPL(shmem_truncate_range);
static int shmem_getattr(struct user_namespace *mnt_userns, static int shmem_getattr(struct mnt_idmap *idmap,
const struct path *path, struct kstat *stat, const struct path *path, struct kstat *stat,
u32 request_mask, unsigned int query_flags) u32 request_mask, unsigned int query_flags)
{ {
@ -1068,7 +1068,7 @@ static int shmem_getattr(struct user_namespace *mnt_userns,
stat->attributes_mask |= (STATX_ATTR_APPEND | stat->attributes_mask |= (STATX_ATTR_APPEND |
STATX_ATTR_IMMUTABLE | STATX_ATTR_IMMUTABLE |
STATX_ATTR_NODUMP); STATX_ATTR_NODUMP);
generic_fillattr(&init_user_ns, inode, stat); generic_fillattr(&nop_mnt_idmap, inode, stat);
if (shmem_is_huge(NULL, inode, 0, false)) if (shmem_is_huge(NULL, inode, 0, false))
stat->blksize = HPAGE_PMD_SIZE; stat->blksize = HPAGE_PMD_SIZE;