mirror of
https://github.com/torvalds/linux.git
synced 2026-11-09 13:44:03 +01:00
fs: port mnt_idmap_{get,put}() to const mnt_idmap
struct mnt_idmap is immutable once alloc_mnt_idmap() has set it up. The
only thing that changes afterwards is the reference count. Model
mnt_idmap_{get,put}() after struct cred's reference count handling and
take a const pointer.
This model is forced upon us because ceph stores the idmapping in mds
requests and need to be able to take and put references.
mnt_idmap_get() keeps returning a non-const pointer for now because
struct vfsmount still stores a non-const pointer. We can only change
that at the end of the series once every user of mnt_idmap() has been
ported.
Link: https://patch.msgid.link/20260901-work-idmap-const-v1-2-54ccd48e100b@kernel.org
Reviewed-by: Jan Kara <jack@suse.cz>
Reviewed-by: Seth Forshee <sforshee@kernel.org>
Signed-off-by: Christian Brauner (Amutable) <brauner@kernel.org>
This commit is contained in:
parent
2163b6a8f2
commit
c0d8c08327
|
|
@ -327,8 +327,8 @@ ssize_t __kernel_write_iter(struct file *file, struct iov_iter *from, loff_t *po
|
|||
* fs/attr.c
|
||||
*/
|
||||
struct mnt_idmap *alloc_mnt_idmap(struct user_namespace *mnt_userns);
|
||||
struct mnt_idmap *mnt_idmap_get(struct mnt_idmap *idmap);
|
||||
void mnt_idmap_put(struct mnt_idmap *idmap);
|
||||
struct mnt_idmap *mnt_idmap_get(const struct mnt_idmap *idmap);
|
||||
void mnt_idmap_put(const struct mnt_idmap *idmap);
|
||||
struct stashed_operations {
|
||||
struct dentry *(*stash_dentry)(struct dentry **stashed,
|
||||
struct dentry *dentry);
|
||||
|
|
|
|||
|
|
@ -312,12 +312,14 @@ struct mnt_idmap *alloc_mnt_idmap(struct user_namespace *mnt_userns)
|
|||
*
|
||||
* Return: @idmap with reference count bumped if @not_mnt_idmap isn't passed.
|
||||
*/
|
||||
struct mnt_idmap *mnt_idmap_get(struct mnt_idmap *idmap)
|
||||
struct mnt_idmap *mnt_idmap_get(const struct mnt_idmap *idmap)
|
||||
{
|
||||
if (idmap != &nop_mnt_idmap && idmap != &invalid_mnt_idmap)
|
||||
refcount_inc(&idmap->count);
|
||||
struct mnt_idmap *nonconst_idmap = (struct mnt_idmap *)idmap;
|
||||
|
||||
return idmap;
|
||||
if (idmap != &nop_mnt_idmap && idmap != &invalid_mnt_idmap)
|
||||
refcount_inc(&nonconst_idmap->count);
|
||||
|
||||
return nonconst_idmap;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(mnt_idmap_get);
|
||||
|
||||
|
|
@ -328,11 +330,13 @@ EXPORT_SYMBOL_GPL(mnt_idmap_get);
|
|||
* If this is a non-initial idmapping, put the reference count when a mount is
|
||||
* released and free it if we're the last user.
|
||||
*/
|
||||
void mnt_idmap_put(struct mnt_idmap *idmap)
|
||||
void mnt_idmap_put(const struct mnt_idmap *idmap)
|
||||
{
|
||||
struct mnt_idmap *nonconst_idmap = (struct mnt_idmap *)idmap;
|
||||
|
||||
if (idmap != &nop_mnt_idmap && idmap != &invalid_mnt_idmap &&
|
||||
refcount_dec_and_test(&idmap->count))
|
||||
free_mnt_idmap(idmap);
|
||||
refcount_dec_and_test(&nonconst_idmap->count))
|
||||
free_mnt_idmap(nonconst_idmap);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(mnt_idmap_put);
|
||||
|
||||
|
|
|
|||
|
|
@ -121,8 +121,8 @@ static inline bool vfsgid_eq_kgid(vfsgid_t vfsgid, kgid_t kgid)
|
|||
|
||||
int vfsgid_in_group_p(vfsgid_t vfsgid);
|
||||
|
||||
struct mnt_idmap *mnt_idmap_get(struct mnt_idmap *idmap);
|
||||
void mnt_idmap_put(struct mnt_idmap *idmap);
|
||||
struct mnt_idmap *mnt_idmap_get(const struct mnt_idmap *idmap);
|
||||
void mnt_idmap_put(const struct mnt_idmap *idmap);
|
||||
|
||||
vfsuid_t make_vfsuid(struct mnt_idmap *idmap,
|
||||
struct user_namespace *fs_userns, kuid_t kuid);
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user