mirror of
https://github.com/torvalds/linux.git
synced 2026-05-27 00:22:00 +02:00
fs: export may_create() as may_create_dentry()
For many years btrfs as been using a copy of may_create() in fs/btrfs/ioctl.c:btrfs_may_create(). Everytime may_create() is updated we need to update the btrfs copy, and this is a maintenance burden. Currently there are minor differences between both because the btrfs side lacks updates done in may_create(). Export may_create() so that btrfs can use it and with the less generic name may_create_dentry(). Signed-off-by: Filipe Manana <fdmanana@suse.com> Link: https://patch.msgid.link/ce5174bca079f4cdcbb8dd145f0924feb1f227cd.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:
parent
173e937552
commit
26aab3a485
19
fs/namei.c
19
fs/namei.c
|
|
@ -3657,8 +3657,8 @@ 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())
|
||||
*/
|
||||
static inline int may_create(struct mnt_idmap *idmap,
|
||||
struct inode *dir, struct dentry *child)
|
||||
int may_create_dentry(struct mnt_idmap *idmap,
|
||||
struct inode *dir, struct dentry *child)
|
||||
{
|
||||
audit_inode_child(dir, child, AUDIT_TYPE_CHILD_CREATE);
|
||||
if (child->d_inode)
|
||||
|
|
@ -3670,6 +3670,7 @@ static inline int may_create(struct mnt_idmap *idmap,
|
|||
|
||||
return inode_permission(idmap, dir, MAY_WRITE | MAY_EXEC);
|
||||
}
|
||||
EXPORT_SYMBOL(may_create_dentry);
|
||||
|
||||
// p1 != p2, both are on the same filesystem, ->s_vfs_rename_mutex is held
|
||||
static struct dentry *lock_two_directories(struct dentry *p1, struct dentry *p2)
|
||||
|
|
@ -4116,7 +4117,7 @@ int vfs_create(struct mnt_idmap *idmap, struct dentry *dentry, umode_t mode,
|
|||
struct inode *dir = d_inode(dentry->d_parent);
|
||||
int error;
|
||||
|
||||
error = may_create(idmap, dir, dentry);
|
||||
error = may_create_dentry(idmap, dir, dentry);
|
||||
if (error)
|
||||
return error;
|
||||
|
||||
|
|
@ -4142,7 +4143,7 @@ int vfs_mkobj(struct dentry *dentry, umode_t mode,
|
|||
void *arg)
|
||||
{
|
||||
struct inode *dir = dentry->d_parent->d_inode;
|
||||
int error = may_create(&nop_mnt_idmap, dir, dentry);
|
||||
int error = may_create_dentry(&nop_mnt_idmap, dir, dentry);
|
||||
if (error)
|
||||
return error;
|
||||
|
||||
|
|
@ -4961,7 +4962,7 @@ int vfs_mknod(struct mnt_idmap *idmap, struct inode *dir,
|
|||
struct delegated_inode *delegated_inode)
|
||||
{
|
||||
bool is_whiteout = S_ISCHR(mode) && dev == WHITEOUT_DEV;
|
||||
int error = may_create(idmap, dir, dentry);
|
||||
int error = may_create_dentry(idmap, dir, dentry);
|
||||
|
||||
if (error)
|
||||
return error;
|
||||
|
|
@ -5107,7 +5108,7 @@ struct dentry *vfs_mkdir(struct mnt_idmap *idmap, struct inode *dir,
|
|||
unsigned max_links = dir->i_sb->s_max_links;
|
||||
struct dentry *de;
|
||||
|
||||
error = may_create(idmap, dir, dentry);
|
||||
error = may_create_dentry(idmap, dir, dentry);
|
||||
if (error)
|
||||
goto err;
|
||||
|
||||
|
|
@ -5497,7 +5498,7 @@ int vfs_symlink(struct mnt_idmap *idmap, struct inode *dir,
|
|||
{
|
||||
int error;
|
||||
|
||||
error = may_create(idmap, dir, dentry);
|
||||
error = may_create_dentry(idmap, dir, dentry);
|
||||
if (error)
|
||||
return error;
|
||||
|
||||
|
|
@ -5605,7 +5606,7 @@ int vfs_link(struct dentry *old_dentry, struct mnt_idmap *idmap,
|
|||
if (!inode)
|
||||
return -ENOENT;
|
||||
|
||||
error = may_create(idmap, dir, new_dentry);
|
||||
error = may_create_dentry(idmap, dir, new_dentry);
|
||||
if (error)
|
||||
return error;
|
||||
|
||||
|
|
@ -5822,7 +5823,7 @@ int vfs_rename(struct renamedata *rd)
|
|||
return error;
|
||||
|
||||
if (!target) {
|
||||
error = may_create(rd->mnt_idmap, new_dir, new_dentry);
|
||||
error = may_create_dentry(rd->mnt_idmap, new_dir, new_dentry);
|
||||
} else {
|
||||
new_is_dir = d_is_dir(new_dentry);
|
||||
|
||||
|
|
|
|||
|
|
@ -2659,6 +2659,8 @@ int __check_sticky(struct mnt_idmap *idmap, struct inode *dir,
|
|||
|
||||
int may_delete_dentry(struct mnt_idmap *idmap, struct inode *dir,
|
||||
struct dentry *victim, bool isdir);
|
||||
int may_create_dentry(struct mnt_idmap *idmap,
|
||||
struct inode *dir, struct dentry *child);
|
||||
|
||||
static inline bool execute_ok(struct inode *inode)
|
||||
{
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user