Skip to content

Commit 173e937

Browse files
fdmananabrauner
authored andcommitted
fs: export may_delete() as may_delete_dentry()
For many years btrfs as been using a copy of may_delete() in fs/btrfs/ioctl.c:btrfs_may_delete(). Everytime may_delete() 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_delete(). Export may_delete() so that btrfs can use it and with the less generic name may_delete_dentry(). While at it change the calls in vfs_rmdir() to pass a boolean literal instead of 1 and 0 as the last argument since the argument has a bool type. Signed-off-by: Filipe Manana <fdmanana@suse.com> Link: https://patch.msgid.link/e09128fd53f01b19d0a58f0e7d24739f79f47f6d.1768307858.git.fdmanana@suse.com Reviewed-by: David Sterba <dsterba@suse.com> Signed-off-by: Christian Brauner <brauner@kernel.org>
1 parent 8f0b4cc commit 173e937

2 files changed

Lines changed: 12 additions & 8 deletions

File tree

fs/namei.c

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3604,7 +3604,7 @@ EXPORT_SYMBOL(__check_sticky);
36043604
* 11. We don't allow removal of NFS sillyrenamed files; it's handled by
36053605
* nfs_async_unlink().
36063606
*/
3607-
static int may_delete(struct mnt_idmap *idmap, struct inode *dir,
3607+
int may_delete_dentry(struct mnt_idmap *idmap, struct inode *dir,
36083608
struct dentry *victim, bool isdir)
36093609
{
36103610
struct inode *inode = d_backing_inode(victim);
@@ -3646,6 +3646,7 @@ static int may_delete(struct mnt_idmap *idmap, struct inode *dir,
36463646
return -EBUSY;
36473647
return 0;
36483648
}
3649+
EXPORT_SYMBOL(may_delete_dentry);
36493650

36503651
/* Check whether we can create an object with dentry child in directory
36513652
* dir.
@@ -5209,7 +5210,7 @@ SYSCALL_DEFINE2(mkdir, const char __user *, pathname, umode_t, mode)
52095210
int vfs_rmdir(struct mnt_idmap *idmap, struct inode *dir,
52105211
struct dentry *dentry, struct delegated_inode *delegated_inode)
52115212
{
5212-
int error = may_delete(idmap, dir, dentry, 1);
5213+
int error = may_delete_dentry(idmap, dir, dentry, true);
52135214

52145215
if (error)
52155216
return error;
@@ -5344,7 +5345,7 @@ int vfs_unlink(struct mnt_idmap *idmap, struct inode *dir,
53445345
struct dentry *dentry, struct delegated_inode *delegated_inode)
53455346
{
53465347
struct inode *target = dentry->d_inode;
5347-
int error = may_delete(idmap, dir, dentry, 0);
5348+
int error = may_delete_dentry(idmap, dir, dentry, false);
53485349

53495350
if (error)
53505351
return error;
@@ -5816,7 +5817,7 @@ int vfs_rename(struct renamedata *rd)
58165817
if (source == target)
58175818
return 0;
58185819

5819-
error = may_delete(rd->mnt_idmap, old_dir, old_dentry, is_dir);
5820+
error = may_delete_dentry(rd->mnt_idmap, old_dir, old_dentry, is_dir);
58205821
if (error)
58215822
return error;
58225823

@@ -5826,11 +5827,11 @@ int vfs_rename(struct renamedata *rd)
58265827
new_is_dir = d_is_dir(new_dentry);
58275828

58285829
if (!(flags & RENAME_EXCHANGE))
5829-
error = may_delete(rd->mnt_idmap, new_dir,
5830-
new_dentry, is_dir);
5830+
error = may_delete_dentry(rd->mnt_idmap, new_dir,
5831+
new_dentry, is_dir);
58315832
else
5832-
error = may_delete(rd->mnt_idmap, new_dir,
5833-
new_dentry, new_is_dir);
5833+
error = may_delete_dentry(rd->mnt_idmap, new_dir,
5834+
new_dentry, new_is_dir);
58345835
}
58355836
if (error)
58365837
return error;

include/linux/fs.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2657,6 +2657,9 @@ static inline int path_permission(const struct path *path, int mask)
26572657
int __check_sticky(struct mnt_idmap *idmap, struct inode *dir,
26582658
struct inode *inode);
26592659

2660+
int may_delete_dentry(struct mnt_idmap *idmap, struct inode *dir,
2661+
struct dentry *victim, bool isdir);
2662+
26602663
static inline bool execute_ok(struct inode *inode)
26612664
{
26622665
return (inode->i_mode & S_IXUGO) || S_ISDIR(inode->i_mode);

0 commit comments

Comments
 (0)