[v5,3/3] btrfs: Allow rmdir(2) to delete an empty subvolume
diff mbox

Message ID afaab1c3-4f17-2d39-4de7-d4ab50e93b33@jp.fujitsu.com
State New
Headers show

Commit Message

Misono Tomohiro April 18, 2018, 2:35 a.m. UTC
Change the behavior of rmdir(2) and allow it to delete an empty subvolume
by using btrfs_delete_subvolume() which is used by
btrfs_ioctl_snap_destroy(). The required lock for @dir and inode of
@dentry is already acquired in vfs layer.

We need some check before deleting a subvolume. Permission check is done
in vfs layer, emptiness check is in btrfs_rmdir() and additional check
(i.e. neither the subvolume is a default subvolume nor send is in progress)
is in btrfs_delete_subvolume().

Note that in btrfs_ioctl_snap_destroy(), d_delete() is called after
btrfs_delete_subvolume(). For rmdir(2), d_delete() is called in vfs
layer later.

Tested-by: Goffredo Baroncelli <kreijack@inwind.it>
Signed-off-by: Tomohiro Misono <misono.tomohiro@jp.fujitsu.com>
 fs/btrfs/inode.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff mbox

diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c
index b421aa8dd1a4..231e4c2ea1b4 100644
--- a/fs/btrfs/inode.c
+++ b/fs/btrfs/inode.c
@@ -4522,7 +4522,7 @@  static int btrfs_rmdir(struct inode *dir, struct dentry *dentry)
 	if (inode->i_size > BTRFS_EMPTY_DIR_SIZE)
 		return -ENOTEMPTY;
 	if (btrfs_ino(BTRFS_I(inode)) == BTRFS_FIRST_FREE_OBJECTID)
-		return -EPERM;
+		return btrfs_delete_subvolume(dir, dentry);
 	trans = __unlink_start_trans(dir);
 	if (IS_ERR(trans))