diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c index 074b77041f8915cb47f7ddf1ea4326fbdf938013..864ffc6c81c1c0f88c0c1c6d7b962fc95d388af6 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c @@ -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; } diff --git a/fs/btrfs/uuid-tree.c b/fs/btrfs/uuid-tree.c index dc95e954ebbebd005ad3cf065259f474ceb9f7a7..76671a6bcb61c903be6ad378b521fd666dfbd1c1 100644 --- a/fs/btrfs/uuid-tree.c +++ b/fs/btrfs/uuid-tree.c @@ -322,6 +322,10 @@ int btrfs_uuid_tree_iterate(struct btrfs_fs_info *fs_info) } while (1) { + if (btrfs_fs_closing(fs_info)) { + ret = -EINTR; + goto out; + } cond_resched(); leaf = path->nodes[0]; slot = path->slots[0]; diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c index cb2f18575ef40fca1dbb463193da51804f11405c..b9787945fe2633c8cbf23b95239d8d9b9f247fe4 100644 --- a/fs/btrfs/volumes.c +++ b/fs/btrfs/volumes.c @@ -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 @@ int btrfs_uuid_scan_kthread(void *data) 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;