]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/commitdiff
btrfs: bail out of uuid tree scanning if we're closing
authorJosef Bacik <josef@toxicpanda.com>
Fri, 14 Feb 2020 20:05:01 +0000 (15:05 -0500)
committerDavid Sterba <dsterba@suse.com>
Mon, 23 Mar 2020 16:01:41 +0000 (17:01 +0100)
In doing my fsstress+EIO stress testing I started running into issues
where umount would get stuck forever because the uuid checker was
chewing through the thousands of subvolumes I had created.

We shouldn't block umount on this, simply bail if we're unmounting the
fs.  We need to make sure we don't mark the UUID tree as ok, so we only
set that bit if we made it through the whole rescan operation, but
otherwise this is completely safe.

Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
Signed-off-by: Josef Bacik <josef@toxicpanda.com>
Reviewed-by: David Sterba <dsterba@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/disk-io.c
fs/btrfs/uuid-tree.c
fs/btrfs/volumes.c

index 074b77041f8915cb47f7ddf1ea4326fbdf938013..864ffc6c81c1c0f88c0c1c6d7b962fc95d388af6 100644 (file)
@@ -2847,7 +2847,9 @@ static int btrfs_uuid_rescan_kthread(void *data)
         */
        ret = btrfs_uuid_tree_iterate(fs_info);
        if (ret < 0) {
-               btrfs_warn(fs_info, "iterating uuid_tree failed %d", ret);
+               if (ret != -EINTR)
+                       btrfs_warn(fs_info, "iterating uuid_tree failed %d",
+                                  ret);
                up(&fs_info->uuid_tree_rescan_sem);
                return ret;
        }
index dc95e954ebbebd005ad3cf065259f474ceb9f7a7..76671a6bcb61c903be6ad378b521fd666dfbd1c1 100644 (file)
@@ -322,6 +322,10 @@ again_search_slot:
        }
 
        while (1) {
+               if (btrfs_fs_closing(fs_info)) {
+                       ret = -EINTR;
+                       goto out;
+               }
                cond_resched();
                leaf = path->nodes[0];
                slot = path->slots[0];
index cb2f18575ef40fca1dbb463193da51804f11405c..b9787945fe2633c8cbf23b95239d8d9b9f247fe4 100644 (file)
@@ -4325,6 +4325,7 @@ int btrfs_uuid_scan_kthread(void *data)
        struct btrfs_root_item root_item;
        u32 item_size;
        struct btrfs_trans_handle *trans = NULL;
+       bool closing = false;
 
        path = btrfs_alloc_path();
        if (!path) {
@@ -4337,6 +4338,10 @@ int btrfs_uuid_scan_kthread(void *data)
        key.offset = 0;
 
        while (1) {
+               if (btrfs_fs_closing(fs_info)) {
+                       closing = true;
+                       break;
+               }
                ret = btrfs_search_forward(root, &key, path,
                                BTRFS_OLDEST_GENERATION);
                if (ret) {
@@ -4436,7 +4441,7 @@ out:
                btrfs_end_transaction(trans);
        if (ret)
                btrfs_warn(fs_info, "btrfs_uuid_scan_kthread failed %d", ret);
-       else
+       else if (!closing)
                set_bit(BTRFS_FS_UPDATE_UUID_TREE_GEN, &fs_info->flags);
        up(&fs_info->uuid_tree_rescan_sem);
        return 0;