]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
fs: export may_delete() as may_delete_dentry()
authorFilipe Manana <fdmanana@suse.com>
Tue, 13 Jan 2026 12:39:50 +0000 (12:39 +0000)
committerChristian Brauner <brauner@kernel.org>
Wed, 14 Jan 2026 16:17:47 +0000 (17:17 +0100)
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>
fs/namei.c
include/linux/fs.h

index bf0f66f0e9b92c106fc92759d22f8158187c29d1..28aebc786e8f44904f63479842a507adb3b3097c 100644 (file)
@@ -3604,7 +3604,7 @@ EXPORT_SYMBOL(__check_sticky);
  * 11. We don't allow removal of NFS sillyrenamed files; it's handled by
  *     nfs_async_unlink().
  */
-static int may_delete(struct mnt_idmap *idmap, struct inode *dir,
+int may_delete_dentry(struct mnt_idmap *idmap, struct inode *dir,
                      struct dentry *victim, bool isdir)
 {
        struct inode *inode = d_backing_inode(victim);
@@ -3646,6 +3646,7 @@ static int may_delete(struct mnt_idmap *idmap, struct inode *dir,
                return -EBUSY;
        return 0;
 }
+EXPORT_SYMBOL(may_delete_dentry);
 
 /*     Check whether we can create an object with dentry child in directory
  *  dir.
@@ -5209,7 +5210,7 @@ SYSCALL_DEFINE2(mkdir, const char __user *, pathname, umode_t, mode)
 int vfs_rmdir(struct mnt_idmap *idmap, struct inode *dir,
              struct dentry *dentry, struct delegated_inode *delegated_inode)
 {
-       int error = may_delete(idmap, dir, dentry, 1);
+       int error = may_delete_dentry(idmap, dir, dentry, true);
 
        if (error)
                return error;
@@ -5344,7 +5345,7 @@ int vfs_unlink(struct mnt_idmap *idmap, struct inode *dir,
               struct dentry *dentry, struct delegated_inode *delegated_inode)
 {
        struct inode *target = dentry->d_inode;
-       int error = may_delete(idmap, dir, dentry, 0);
+       int error = may_delete_dentry(idmap, dir, dentry, false);
 
        if (error)
                return error;
@@ -5816,7 +5817,7 @@ int vfs_rename(struct renamedata *rd)
        if (source == target)
                return 0;
 
-       error = may_delete(rd->mnt_idmap, old_dir, old_dentry, is_dir);
+       error = may_delete_dentry(rd->mnt_idmap, old_dir, old_dentry, is_dir);
        if (error)
                return error;
 
@@ -5826,11 +5827,11 @@ int vfs_rename(struct renamedata *rd)
                new_is_dir = d_is_dir(new_dentry);
 
                if (!(flags & RENAME_EXCHANGE))
-                       error = may_delete(rd->mnt_idmap, new_dir,
-                                          new_dentry, is_dir);
+                       error = may_delete_dentry(rd->mnt_idmap, new_dir,
+                                                 new_dentry, is_dir);
                else
-                       error = may_delete(rd->mnt_idmap, new_dir,
-                                          new_dentry, new_is_dir);
+                       error = may_delete_dentry(rd->mnt_idmap, new_dir,
+                                                 new_dentry, new_is_dir);
        }
        if (error)
                return error;
index 04ceeca12a0d5caadb68643bf68b7a78e17c08d4..06632783a76c13075ba92c283371dac48a2ca356 100644 (file)
@@ -2657,6 +2657,9 @@ static inline int path_permission(const struct path *path, int mask)
 int __check_sticky(struct mnt_idmap *idmap, struct inode *dir,
                   struct inode *inode);
 
+int may_delete_dentry(struct mnt_idmap *idmap, struct inode *dir,
+                     struct dentry *victim, bool isdir);
+
 static inline bool execute_ok(struct inode *inode)
 {
        return (inode->i_mode & S_IXUGO) || S_ISDIR(inode->i_mode);