Skip to content

Commit b97cf39

Browse files
boryassmb49
authored andcommitted
btrfs: do not clear read-only when adding sprout device
BugLink: https://bugs.launchpad.net/bugs/2102118 [ Upstream commit 70958a9 ] If you follow the seed/sprout wiki, it suggests the following workflow: btrfstune -S 1 seed_dev mount seed_dev mnt btrfs device add sprout_dev mount -o remount,rw mnt The first mount mounts the FS readonly, which results in not setting BTRFS_FS_OPEN, and setting the readonly bit on the sb. The device add somewhat surprisingly clears the readonly bit on the sb (though the mount is still practically readonly, from the users perspective...). Finally, the remount checks the readonly bit on the sb against the flag and sees no change, so it does not run the code intended to run on ro->rw transitions, leaving BTRFS_FS_OPEN unset. As a result, when the cleaner_kthread runs, it sees no BTRFS_FS_OPEN and does no work. This results in leaking deleted snapshots until we run out of space. I propose fixing it at the first departure from what feels reasonable: when we clear the readonly bit on the sb during device add. A new fstest I have written reproduces the bug and confirms the fix. Reviewed-by: Qu Wenruo <wqu@suse.com> Signed-off-by: Boris Burkov <boris@bur.io> Signed-off-by: David Sterba <dsterba@suse.com> Signed-off-by: Sasha Levin <sashal@kernel.org> Signed-off-by: Koichiro Den <koichiro.den@canonical.com> Signed-off-by: Stefan Bader <stefan.bader@canonical.com>
1 parent 6d2ff9c commit b97cf39

File tree

1 file changed

+0
-4
lines changed

1 file changed

+0
-4
lines changed

fs/btrfs/volumes.c

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2754,8 +2754,6 @@ int btrfs_init_new_device(struct btrfs_fs_info *fs_info, const char *device_path
27542754
set_blocksize(device->bdev, BTRFS_BDEV_BLOCKSIZE);
27552755

27562756
if (seeding_dev) {
2757-
btrfs_clear_sb_rdonly(sb);
2758-
27592757
/* GFP_KERNEL allocation must not be under device_list_mutex */
27602758
seed_devices = btrfs_init_sprout(fs_info);
27612759
if (IS_ERR(seed_devices)) {
@@ -2898,8 +2896,6 @@ int btrfs_init_new_device(struct btrfs_fs_info *fs_info, const char *device_path
28982896
mutex_unlock(&fs_info->chunk_mutex);
28992897
mutex_unlock(&fs_info->fs_devices->device_list_mutex);
29002898
error_trans:
2901-
if (seeding_dev)
2902-
btrfs_set_sb_rdonly(sb);
29032899
if (trans)
29042900
btrfs_end_transaction(trans);
29052901
error_free_zone:

0 commit comments

Comments
 (0)