On Tue 01-09-26 14:14:50, Christian Brauner wrote: > Convert to const struct mnt_idmap. > > A mount's idmapping is immutable. The only thing that is allowed to be > modified afterwards is the reference count and that is hidden behind > mnt_idmap_get() and mnt_idmap_put(). Everything else only ever reads > from the idmapping. This is the same model that struct cred uses and the > idmapping is also rather sensitive. > > So make the idmap argument const wherever we can. The conversion is done > from the bottom up so callers can continue to pass a non-const pointer > to a const parameter until the conversion is finished. > > No functional changes. > > Signed-off-by: Christian Brauner (Amutable) <[email protected]>
Looks good. Feel free to add: Reviewed-by: Jan Kara <[email protected]> Honza > --- > fs/btrfs/ioctl.c | 4 ++-- > fs/internal.h | 2 +- > fs/namei.c | 44 ++++++++++++++++++++++---------------------- > fs/open.c | 2 +- > include/linux/fs.h | 30 +++++++++++++++--------------- > include/linux/namei.h | 16 ++++++++-------- > 6 files changed, 49 insertions(+), 49 deletions(-) > > diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c > index 94c98801800f..e20e66c0fead 100644 > --- a/fs/btrfs/ioctl.c > +++ b/fs/btrfs/ioctl.c > @@ -864,7 +864,7 @@ static int create_snapshot(struct btrfs_root *root, > struct inode *dir, > * inside this filesystem so it's quite a bit simpler. > */ > static noinline int btrfs_mksubvol(struct dentry *parent, > - struct mnt_idmap *idmap, > + const struct mnt_idmap *idmap, > struct qstr *qname, struct btrfs_root > *snap_src, > bool readonly, > struct btrfs_qgroup_inherit *inherit) > @@ -911,7 +911,7 @@ static noinline int btrfs_mksubvol(struct dentry *parent, > } > > static noinline int btrfs_mksnapshot(struct dentry *parent, > - struct mnt_idmap *idmap, > + const struct mnt_idmap *idmap, > struct qstr *qname, > struct btrfs_root *root, > bool readonly, > diff --git a/fs/internal.h b/fs/internal.h > index 2b8cffc22fb3..973436f44770 100644 > --- a/fs/internal.h > +++ b/fs/internal.h > @@ -63,7 +63,7 @@ int filename_mknodat(int dfd, struct filename *name, > umode_t mode, unsigned int > int filename_symlinkat(struct filename *from, int newdfd, struct filename > *to); > int filename_linkat(int olddfd, struct filename *old, int newdfd, > struct filename *new, int flags); > -int vfs_tmpfile(struct mnt_idmap *idmap, > +int vfs_tmpfile(const struct mnt_idmap *idmap, > const struct path *parentpath, > struct file *file, umode_t mode); > struct dentry *d_hash_and_lookup(struct dentry *, struct qstr *); > diff --git a/fs/namei.c b/fs/namei.c > index f5e00ae41ed4..14970fe08387 100644 > --- a/fs/namei.c > +++ b/fs/namei.c > @@ -3111,7 +3111,7 @@ int lookup_noperm_common(struct qstr *qname, struct > dentry *base) > return 0; > } > > -static int lookup_one_common(struct mnt_idmap *idmap, > +static int lookup_one_common(const struct mnt_idmap *idmap, > struct qstr *qname, struct dentry *base) > { > int err; > @@ -3190,7 +3190,7 @@ EXPORT_SYMBOL(lookup_noperm); > * > * The caller must hold base->i_rwsem. > */ > -struct dentry *lookup_one(struct mnt_idmap *idmap, struct qstr *name, > +struct dentry *lookup_one(const struct mnt_idmap *idmap, struct qstr *name, > struct dentry *base) > { > struct dentry *dentry; > @@ -3223,7 +3223,7 @@ EXPORT_SYMBOL(lookup_one); > * - ERR_PTR(-ENOENT) if parent has been removed, or > * - ERR_PTR(-EACCES) if parent directory is not searchable. > */ > -struct dentry *lookup_one_unlocked(struct mnt_idmap *idmap, struct qstr > *name, > +struct dentry *lookup_one_unlocked(const struct mnt_idmap *idmap, struct > qstr *name, > struct dentry *base) > { > int err; > @@ -3263,7 +3263,7 @@ EXPORT_SYMBOL(lookup_one_unlocked); > * - same errors as lookup_one_unlocked() or > * - ERR_PTR(-EINTR) if a fatal signal is pending. > */ > -struct dentry *lookup_one_positive_killable(struct mnt_idmap *idmap, > +struct dentry *lookup_one_positive_killable(const struct mnt_idmap *idmap, > struct qstr *name, > struct dentry *base) > { > @@ -3306,7 +3306,7 @@ EXPORT_SYMBOL(lookup_one_positive_killable); > * - ERR_PTR(-ENOENT) if the name could not be found, or > * - same errors as lookup_one_unlocked(). > */ > -struct dentry *lookup_one_positive_unlocked(struct mnt_idmap *idmap, > +struct dentry *lookup_one_positive_unlocked(const struct mnt_idmap *idmap, > struct qstr *name, > struct dentry *base) > { > @@ -3396,7 +3396,7 @@ EXPORT_SYMBOL(lookup_noperm_positive_unlocked); > * > * Returns: a negative or positive dentry, or an error. > */ > -struct dentry *start_creating(struct mnt_idmap *idmap, struct dentry *parent, > +struct dentry *start_creating(const struct mnt_idmap *idmap, struct dentry > *parent, > struct qstr *name) > { > int err = lookup_one_common(idmap, name, parent); > @@ -3423,7 +3423,7 @@ EXPORT_SYMBOL(start_creating); > * > * Returns: a positive dentry, or an error. > */ > -struct dentry *start_removing(struct mnt_idmap *idmap, struct dentry *parent, > +struct dentry *start_removing(const struct mnt_idmap *idmap, struct dentry > *parent, > struct qstr *name) > { > int err = lookup_one_common(idmap, name, parent); > @@ -3451,7 +3451,7 @@ EXPORT_SYMBOL(start_removing); > * > * Returns: a negative or positive dentry, or an error. > */ > -struct dentry *start_creating_killable(struct mnt_idmap *idmap, > +struct dentry *start_creating_killable(const struct mnt_idmap *idmap, > struct dentry *parent, > struct qstr *name) > { > @@ -3482,7 +3482,7 @@ EXPORT_SYMBOL(start_creating_killable); > * > * Returns: a positive dentry, or an error. > */ > -struct dentry *start_removing_killable(struct mnt_idmap *idmap, > +struct dentry *start_removing_killable(const struct mnt_idmap *idmap, > struct dentry *parent, > struct qstr *name) > { > @@ -3642,7 +3642,7 @@ int user_path_at(int dfd, const char __user *name, > unsigned flags, > } > EXPORT_SYMBOL(user_path_at); > > -int __check_sticky(struct mnt_idmap *idmap, struct inode *dir, > +int __check_sticky(const struct mnt_idmap *idmap, struct inode *dir, > struct inode *inode) > { > kuid_t fsuid = current_fsuid(); > @@ -3675,7 +3675,7 @@ EXPORT_SYMBOL(__check_sticky); > * 11. We don't allow removal of NFS sillyrenamed files; it's handled by > * nfs_async_unlink(). > */ > -int may_delete_dentry(struct mnt_idmap *idmap, struct inode *dir, > +int may_delete_dentry(const struct mnt_idmap *idmap, struct inode *dir, > struct dentry *victim, bool isdir) > { > struct inode *inode = d_backing_inode(victim); > @@ -3728,7 +3728,7 @@ EXPORT_SYMBOL(may_delete_dentry); > * 4. We should have write and exec permissions on dir > * 5. We can't do it if dir is immutable (done in permission()) > */ > -int may_create_dentry(struct mnt_idmap *idmap, > +int may_create_dentry(const struct mnt_idmap *idmap, > struct inode *dir, struct dentry *child) > { > audit_inode_child(dir, child, AUDIT_TYPE_CHILD_CREATE); > @@ -4174,7 +4174,7 @@ static inline umode_t vfs_prepare_mode(const struct > mnt_idmap *idmap, > * On non-idmapped mounts or if permission checking is to be performed on the > * raw inode simply pass @nop_mnt_idmap. > */ > -int vfs_create(struct mnt_idmap *idmap, struct dentry *dentry, umode_t mode, > +int vfs_create(const struct mnt_idmap *idmap, struct dentry *dentry, umode_t > mode, > struct delegated_inode *di) > { > struct inode *dir = d_inode(dentry->d_parent); > @@ -4287,7 +4287,7 @@ static int may_open(const struct mnt_idmap *idmap, > const struct path *path, > return 0; > } > > -static int handle_truncate(struct mnt_idmap *idmap, struct file *filp) > +static int handle_truncate(const struct mnt_idmap *idmap, struct file *filp) > { > const struct path *path = &filp->f_path; > struct inode *inode = path->dentry->d_inode; > @@ -4863,7 +4863,7 @@ static int do_open(struct nameidata *nd, > * On non-idmapped mounts or if permission checking is to be performed on the > * raw inode simply pass @nop_mnt_idmap. > */ > -int vfs_tmpfile(struct mnt_idmap *idmap, > +int vfs_tmpfile(const struct mnt_idmap *idmap, > const struct path *parentpath, > struct file *file, umode_t mode) > { > @@ -4921,7 +4921,7 @@ int vfs_tmpfile(struct mnt_idmap *idmap, > * hence this is only for kernel internal use, and must not be installed into > * file tables or such. > */ > -struct file *kernel_tmpfile_open(struct mnt_idmap *idmap, > +struct file *kernel_tmpfile_open(const struct mnt_idmap *idmap, > const struct path *parentpath, > umode_t mode, int open_flag, > const struct cred *cred) > @@ -5236,7 +5236,7 @@ EXPORT_SYMBOL(dentry_create); > * On non-idmapped mounts or if permission checking is to be performed on the > * raw inode simply pass @nop_mnt_idmap. > */ > -int vfs_mknod(struct mnt_idmap *idmap, struct inode *dir, > +int vfs_mknod(const struct mnt_idmap *idmap, struct inode *dir, > struct dentry *dentry, umode_t mode, dev_t dev, > struct delegated_inode *delegated_inode) > { > @@ -5378,7 +5378,7 @@ SYSCALL_DEFINE3(mknod, const char __user *, filename, > umode_t, mode, unsigned, d > * > * In case of an error the dentry is dput() and an ERR_PTR() is returned. > */ > -struct dentry *vfs_mkdir(struct mnt_idmap *idmap, struct inode *dir, > +struct dentry *vfs_mkdir(const struct mnt_idmap *idmap, struct inode *dir, > struct dentry *dentry, umode_t mode, > struct delegated_inode *delegated_inode) > { > @@ -5485,7 +5485,7 @@ SYSCALL_DEFINE2(mkdir, const char __user *, pathname, > umode_t, mode) > * On non-idmapped mounts or if permission checking is to be performed on the > * raw inode simply pass @nop_mnt_idmap. > */ > -int vfs_rmdir(struct mnt_idmap *idmap, struct inode *dir, > +int vfs_rmdir(const struct mnt_idmap *idmap, struct inode *dir, > struct dentry *dentry, struct delegated_inode *delegated_inode) > { > int error = may_delete_dentry(idmap, dir, dentry, true); > @@ -5620,7 +5620,7 @@ SYSCALL_DEFINE1(rmdir, const char __user *, pathname) > * On non-idmapped mounts or if permission checking is to be performed on the > * raw inode simply pass @nop_mnt_idmap. > */ > -int vfs_unlink(struct mnt_idmap *idmap, struct inode *dir, > +int vfs_unlink(const struct mnt_idmap *idmap, struct inode *dir, > struct dentry *dentry, struct delegated_inode *delegated_inode) > { > struct inode *target = dentry->d_inode; > @@ -5770,7 +5770,7 @@ SYSCALL_DEFINE1(unlink, const char __user *, pathname) > * On non-idmapped mounts or if permission checking is to be performed on the > * raw inode simply pass @nop_mnt_idmap. > */ > -int vfs_symlink(struct mnt_idmap *idmap, struct inode *dir, > +int vfs_symlink(const struct mnt_idmap *idmap, struct inode *dir, > struct dentry *dentry, const char *oldname, > struct delegated_inode *delegated_inode) > { > @@ -5872,7 +5872,7 @@ SYSCALL_DEFINE2(symlink, const char __user *, oldname, > const char __user *, newn > * On non-idmapped mounts or if permission checking is to be performed on the > * raw inode simply pass @nop_mnt_idmap. > */ > -int vfs_link(struct dentry *old_dentry, struct mnt_idmap *idmap, > +int vfs_link(struct dentry *old_dentry, const struct mnt_idmap *idmap, > struct inode *dir, struct dentry *new_dentry, > struct delegated_inode *delegated_inode) > { > diff --git a/fs/open.c b/fs/open.c > index 6b1c14e684a9..971e51008e67 100644 > --- a/fs/open.c > +++ b/fs/open.c > @@ -36,7 +36,7 @@ > > #include "internal.h" > > -int do_truncate(struct mnt_idmap *idmap, struct dentry *dentry, > +int do_truncate(const struct mnt_idmap *idmap, struct dentry *dentry, > loff_t length, unsigned int time_attrs, struct file *filp) > { > int ret; > diff --git a/include/linux/fs.h b/include/linux/fs.h > index 55d8e7e473ff..935b0f92786f 100644 > --- a/include/linux/fs.h > +++ b/include/linux/fs.h > @@ -1761,19 +1761,19 @@ bool inode_owner_or_capable(const struct mnt_idmap > *idmap, > /* > * VFS helper functions.. > */ > -int vfs_create(struct mnt_idmap *, struct dentry *, umode_t, > +int vfs_create(const struct mnt_idmap *, struct dentry *, umode_t, > struct delegated_inode *); > -struct dentry *vfs_mkdir(struct mnt_idmap *, struct inode *, > +struct dentry *vfs_mkdir(const struct mnt_idmap *, struct inode *, > struct dentry *, umode_t, struct delegated_inode *); > -int vfs_mknod(struct mnt_idmap *, struct inode *, struct dentry *, > +int vfs_mknod(const struct mnt_idmap *, struct inode *, struct dentry *, > umode_t, dev_t, struct delegated_inode *); > -int vfs_symlink(struct mnt_idmap *, struct inode *, > +int vfs_symlink(const struct mnt_idmap *, struct inode *, > struct dentry *, const char *, struct delegated_inode *); > -int vfs_link(struct dentry *, struct mnt_idmap *, struct inode *, > +int vfs_link(struct dentry *, const struct mnt_idmap *, struct inode *, > struct dentry *, struct delegated_inode *); > -int vfs_rmdir(struct mnt_idmap *, struct inode *, struct dentry *, > +int vfs_rmdir(const struct mnt_idmap *, struct inode *, struct dentry *, > struct delegated_inode *); > -int vfs_unlink(struct mnt_idmap *, struct inode *, struct dentry *, > +int vfs_unlink(const struct mnt_idmap *, struct inode *, struct dentry *, > struct delegated_inode *); > > /** > @@ -1787,7 +1787,7 @@ int vfs_unlink(struct mnt_idmap *, struct inode *, > struct dentry *, > * @flags: rename flags > */ > struct renamedata { > - struct mnt_idmap *mnt_idmap; > + const struct mnt_idmap *mnt_idmap; > struct dentry *old_parent; > struct dentry *old_dentry; > struct dentry *new_parent; > @@ -1798,14 +1798,14 @@ struct renamedata { > > int vfs_rename(struct renamedata *); > > -static inline int vfs_whiteout(struct mnt_idmap *idmap, > +static inline int vfs_whiteout(const struct mnt_idmap *idmap, > struct inode *dir, struct dentry *dentry) > { > return vfs_mknod(idmap, dir, dentry, S_IFCHR | WHITEOUT_MODE, > WHITEOUT_DEV, NULL); > } > > -struct file *kernel_tmpfile_open(struct mnt_idmap *idmap, > +struct file *kernel_tmpfile_open(const struct mnt_idmap *idmap, > const struct path *parentpath, > umode_t mode, int open_flag, > const struct cred *cred); > @@ -2483,7 +2483,7 @@ static inline bool is_idmapped_mnt(const struct > vfsmount *mnt) > } > > int vfs_truncate(const struct path *, loff_t); > -int do_truncate(struct mnt_idmap *, struct dentry *, loff_t start, > +int do_truncate(const struct mnt_idmap *, struct dentry *, loff_t start, > unsigned int time_attrs, struct file *filp); > extern int vfs_fallocate(struct file *file, int mode, loff_t offset, > loff_t len); > @@ -2721,12 +2721,12 @@ static inline int path_permission(const struct path > *path, int mask) > return inode_permission(mnt_idmap(path->mnt), > d_inode(path->dentry), mask); > } > -int __check_sticky(struct mnt_idmap *idmap, struct inode *dir, > +int __check_sticky(const struct mnt_idmap *idmap, struct inode *dir, > struct inode *inode); > > -int may_delete_dentry(struct mnt_idmap *idmap, struct inode *dir, > +int may_delete_dentry(const struct mnt_idmap *idmap, struct inode *dir, > struct dentry *victim, bool isdir); > -int may_create_dentry(struct mnt_idmap *idmap, > +int may_create_dentry(const struct mnt_idmap *idmap, > struct inode *dir, struct dentry *child); > > static inline bool execute_ok(struct inode *inode) > @@ -3578,7 +3578,7 @@ static inline bool is_sxid(umode_t mode) > return mode & (S_ISUID | S_ISGID); > } > > -static inline int check_sticky(struct mnt_idmap *idmap, > +static inline int check_sticky(const struct mnt_idmap *idmap, > struct inode *dir, struct inode *inode) > { > if (!(dir->i_mode & S_ISVTX)) > diff --git a/include/linux/namei.h b/include/linux/namei.h > index 86d657b24fc6..da5b4ccca1b5 100644 > --- a/include/linux/namei.h > +++ b/include/linux/namei.h > @@ -70,24 +70,24 @@ extern struct dentry *try_lookup_noperm(struct qstr *, > struct dentry *); > extern struct dentry *lookup_noperm(struct qstr *, struct dentry *); > extern struct dentry *lookup_noperm_unlocked(struct qstr *, struct dentry *); > extern struct dentry *lookup_noperm_positive_unlocked(struct qstr *, struct > dentry *); > -struct dentry *lookup_one(struct mnt_idmap *, struct qstr *, struct dentry > *); > -struct dentry *lookup_one_unlocked(struct mnt_idmap *idmap, > +struct dentry *lookup_one(const struct mnt_idmap *, struct qstr *, struct > dentry *); > +struct dentry *lookup_one_unlocked(const struct mnt_idmap *idmap, > struct qstr *name, struct dentry *base); > -struct dentry *lookup_one_positive_unlocked(struct mnt_idmap *idmap, > +struct dentry *lookup_one_positive_unlocked(const struct mnt_idmap *idmap, > struct qstr *name, > struct dentry *base); > -struct dentry *lookup_one_positive_killable(struct mnt_idmap *idmap, > +struct dentry *lookup_one_positive_killable(const struct mnt_idmap *idmap, > struct qstr *name, > struct dentry *base); > > -struct dentry *start_creating(struct mnt_idmap *idmap, struct dentry *parent, > +struct dentry *start_creating(const struct mnt_idmap *idmap, struct dentry > *parent, > struct qstr *name); > -struct dentry *start_removing(struct mnt_idmap *idmap, struct dentry *parent, > +struct dentry *start_removing(const struct mnt_idmap *idmap, struct dentry > *parent, > struct qstr *name); > -struct dentry *start_creating_killable(struct mnt_idmap *idmap, > +struct dentry *start_creating_killable(const struct mnt_idmap *idmap, > struct dentry *parent, > struct qstr *name); > -struct dentry *start_removing_killable(struct mnt_idmap *idmap, > +struct dentry *start_removing_killable(const struct mnt_idmap *idmap, > struct dentry *parent, > struct qstr *name); > struct dentry *start_creating_noperm(struct dentry *parent, struct qstr > *name); > > -- > 2.53.0 > -- Jan Kara <[email protected]> SUSE Labs, CR

