diff options
Diffstat (limited to 'fs/btrfs/volumes.c')
-rw-r--r-- | fs/btrfs/volumes.c | 37 |
1 files changed, 6 insertions, 31 deletions
diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c index b8708f994e67..88b969aeeb71 100644 --- a/fs/btrfs/volumes.c +++ b/fs/btrfs/volumes.c | |||
@@ -227,9 +227,8 @@ loop_lock: | |||
227 | cur = pending; | 227 | cur = pending; |
228 | pending = pending->bi_next; | 228 | pending = pending->bi_next; |
229 | cur->bi_next = NULL; | 229 | cur->bi_next = NULL; |
230 | atomic_dec(&fs_info->nr_async_bios); | ||
231 | 230 | ||
232 | if (atomic_read(&fs_info->nr_async_bios) < limit && | 231 | if (atomic_dec_return(&fs_info->nr_async_bios) < limit && |
233 | waitqueue_active(&fs_info->async_submit_wait)) | 232 | waitqueue_active(&fs_info->async_submit_wait)) |
234 | wake_up(&fs_info->async_submit_wait); | 233 | wake_up(&fs_info->async_submit_wait); |
235 | 234 | ||
@@ -569,9 +568,11 @@ static int __btrfs_close_devices(struct btrfs_fs_devices *fs_devices) | |||
569 | memcpy(new_device, device, sizeof(*new_device)); | 568 | memcpy(new_device, device, sizeof(*new_device)); |
570 | 569 | ||
571 | /* Safe because we are under uuid_mutex */ | 570 | /* Safe because we are under uuid_mutex */ |
572 | name = rcu_string_strdup(device->name->str, GFP_NOFS); | 571 | if (device->name) { |
573 | BUG_ON(device->name && !name); /* -ENOMEM */ | 572 | name = rcu_string_strdup(device->name->str, GFP_NOFS); |
574 | rcu_assign_pointer(new_device->name, name); | 573 | BUG_ON(device->name && !name); /* -ENOMEM */ |
574 | rcu_assign_pointer(new_device->name, name); | ||
575 | } | ||
575 | new_device->bdev = NULL; | 576 | new_device->bdev = NULL; |
576 | new_device->writeable = 0; | 577 | new_device->writeable = 0; |
577 | new_device->in_fs_metadata = 0; | 578 | new_device->in_fs_metadata = 0; |
@@ -1744,10 +1745,6 @@ int btrfs_init_new_device(struct btrfs_root *root, char *device_path) | |||
1744 | 1745 | ||
1745 | device->fs_devices = root->fs_info->fs_devices; | 1746 | device->fs_devices = root->fs_info->fs_devices; |
1746 | 1747 | ||
1747 | /* | ||
1748 | * we don't want write_supers to jump in here with our device | ||
1749 | * half setup | ||
1750 | */ | ||
1751 | mutex_lock(&root->fs_info->fs_devices->device_list_mutex); | 1748 | mutex_lock(&root->fs_info->fs_devices->device_list_mutex); |
1752 | list_add_rcu(&device->dev_list, &root->fs_info->fs_devices->devices); | 1749 | list_add_rcu(&device->dev_list, &root->fs_info->fs_devices->devices); |
1753 | list_add(&device->dev_alloc_list, | 1750 | list_add(&device->dev_alloc_list, |
@@ -4609,28 +4606,6 @@ int btrfs_read_sys_array(struct btrfs_root *root) | |||
4609 | return ret; | 4606 | return ret; |
4610 | } | 4607 | } |
4611 | 4608 | ||
4612 | struct btrfs_device *btrfs_find_device_for_logical(struct btrfs_root *root, | ||
4613 | u64 logical, int mirror_num) | ||
4614 | { | ||
4615 | struct btrfs_mapping_tree *map_tree = &root->fs_info->mapping_tree; | ||
4616 | int ret; | ||
4617 | u64 map_length = 0; | ||
4618 | struct btrfs_bio *bbio = NULL; | ||
4619 | struct btrfs_device *device; | ||
4620 | |||
4621 | BUG_ON(mirror_num == 0); | ||
4622 | ret = btrfs_map_block(map_tree, WRITE, logical, &map_length, &bbio, | ||
4623 | mirror_num); | ||
4624 | if (ret) { | ||
4625 | BUG_ON(bbio != NULL); | ||
4626 | return NULL; | ||
4627 | } | ||
4628 | BUG_ON(mirror_num != bbio->mirror_num); | ||
4629 | device = bbio->stripes[mirror_num - 1].dev; | ||
4630 | kfree(bbio); | ||
4631 | return device; | ||
4632 | } | ||
4633 | |||
4634 | int btrfs_read_chunk_tree(struct btrfs_root *root) | 4609 | int btrfs_read_chunk_tree(struct btrfs_root *root) |
4635 | { | 4610 | { |
4636 | struct btrfs_path *path; | 4611 | struct btrfs_path *path; |