btrfs: use may_create_dentry() in btrfs_mksubvol()

There is no longer the need to use btrfs_may_create(), which was a copy
of the VFS private function may_create(), since now that functionality
is exported by the VFS as a function named may_create_dentry(). So change
btrfs_mksubvol() to use the VFS function and remove btrfs_may_create().

Note that the btrfs copy was missing an audit_inode_child() call that we
have in the VFS function. This only reinforces the need to use a common
function, as it's very easy for the btrfs copy to get out of sync and
therefore a maintenance burden.

Signed-off-by: Filipe Manana <fdmanana@suse.com>
Link: https://patch.msgid.link/adf8c802c77ec1c855ea9fe12491120ccc29a294.1768307858.git.fdmanana@suse.com
Reviewed-by: David Sterba <dsterba@suse.com>
Signed-off-by: Christian Brauner <brauner@kernel.org>
This commit is contained in:
Filipe Manana 2026-01-13 12:39:53 +00:00 committed by Christian Brauner
parent 5f84a1092d
commit 6c91c776a9
No known key found for this signature in database
GPG Key ID: 91C61BC06578DCA2

View File

@ -815,19 +815,6 @@ static int create_snapshot(struct btrfs_root *root, struct inode *dir,
return ret;
}
/* copy of may_create in fs/namei.c() */
static inline int btrfs_may_create(struct mnt_idmap *idmap,
struct inode *dir, const struct dentry *child)
{
if (d_really_is_positive(child))
return -EEXIST;
if (IS_DEADDIR(dir))
return -ENOENT;
if (!fsuidgid_has_mapping(dir->i_sb, idmap))
return -EOVERFLOW;
return inode_permission(idmap, dir, MAY_WRITE | MAY_EXEC);
}
/*
* Create a new subvolume below @parent. This is largely modeled after
* sys_mkdirat and vfs_mkdir, but we only do a single component lookup
@ -849,7 +836,7 @@ static noinline int btrfs_mksubvol(struct dentry *parent,
if (IS_ERR(dentry))
return PTR_ERR(dentry);
ret = btrfs_may_create(idmap, dir, dentry);
ret = may_create_dentry(idmap, dir, dentry);
if (ret)
goto out_dput;