diff options
| author | Patrick McHardy <kaber@trash.net> | 2010-04-20 10:02:01 -0400 |
|---|---|---|
| committer | Patrick McHardy <kaber@trash.net> | 2010-04-20 10:02:01 -0400 |
| commit | 62910554656cdcd6b6f84a5154c4155aae4ca231 (patch) | |
| tree | dcf14004f6fd2ef7154362ff948bfeba0f3ea92d /fs/btrfs/volumes.c | |
| parent | 22265a5c3c103cf8c50be62e6c90d045eb649e6d (diff) | |
| parent | ab9304717f7624c41927f442e6b6d418b2d8b3e4 (diff) | |
Merge branch 'master' of /repos/git/net-next-2.6
Conflicts:
Documentation/feature-removal-schedule.txt
net/ipv6/netfilter/ip6t_REJECT.c
net/netfilter/xt_limit.c
Signed-off-by: Patrick McHardy <kaber@trash.net>
Diffstat (limited to 'fs/btrfs/volumes.c')
| -rw-r--r-- | fs/btrfs/volumes.c | 50 |
1 files changed, 31 insertions, 19 deletions
diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c index 41ecbb2347f2..aa7dc36dac78 100644 --- a/fs/btrfs/volumes.c +++ b/fs/btrfs/volumes.c | |||
| @@ -17,6 +17,7 @@ | |||
| 17 | */ | 17 | */ |
| 18 | #include <linux/sched.h> | 18 | #include <linux/sched.h> |
| 19 | #include <linux/bio.h> | 19 | #include <linux/bio.h> |
| 20 | #include <linux/slab.h> | ||
| 20 | #include <linux/buffer_head.h> | 21 | #include <linux/buffer_head.h> |
| 21 | #include <linux/blkdev.h> | 22 | #include <linux/blkdev.h> |
| 22 | #include <linux/random.h> | 23 | #include <linux/random.h> |
| @@ -256,13 +257,13 @@ loop_lock: | |||
| 256 | wake_up(&fs_info->async_submit_wait); | 257 | wake_up(&fs_info->async_submit_wait); |
| 257 | 258 | ||
| 258 | BUG_ON(atomic_read(&cur->bi_cnt) == 0); | 259 | BUG_ON(atomic_read(&cur->bi_cnt) == 0); |
| 259 | submit_bio(cur->bi_rw, cur); | ||
| 260 | num_run++; | ||
| 261 | batch_run++; | ||
| 262 | 260 | ||
| 263 | if (bio_rw_flagged(cur, BIO_RW_SYNCIO)) | 261 | if (bio_rw_flagged(cur, BIO_RW_SYNCIO)) |
| 264 | num_sync_run++; | 262 | num_sync_run++; |
| 265 | 263 | ||
| 264 | submit_bio(cur->bi_rw, cur); | ||
| 265 | num_run++; | ||
| 266 | batch_run++; | ||
| 266 | if (need_resched()) { | 267 | if (need_resched()) { |
| 267 | if (num_sync_run) { | 268 | if (num_sync_run) { |
| 268 | blk_run_backing_dev(bdi, NULL); | 269 | blk_run_backing_dev(bdi, NULL); |
| @@ -325,16 +326,6 @@ loop_lock: | |||
| 325 | num_sync_run = 0; | 326 | num_sync_run = 0; |
| 326 | blk_run_backing_dev(bdi, NULL); | 327 | blk_run_backing_dev(bdi, NULL); |
| 327 | } | 328 | } |
| 328 | |||
| 329 | cond_resched(); | ||
| 330 | if (again) | ||
| 331 | goto loop; | ||
| 332 | |||
| 333 | spin_lock(&device->io_lock); | ||
| 334 | if (device->pending_bios.head || device->pending_sync_bios.head) | ||
| 335 | goto loop_lock; | ||
| 336 | spin_unlock(&device->io_lock); | ||
| 337 | |||
| 338 | /* | 329 | /* |
| 339 | * IO has already been through a long path to get here. Checksumming, | 330 | * IO has already been through a long path to get here. Checksumming, |
| 340 | * async helper threads, perhaps compression. We've done a pretty | 331 | * async helper threads, perhaps compression. We've done a pretty |
| @@ -346,6 +337,16 @@ loop_lock: | |||
| 346 | * cared about found its way down here. | 337 | * cared about found its way down here. |
| 347 | */ | 338 | */ |
| 348 | blk_run_backing_dev(bdi, NULL); | 339 | blk_run_backing_dev(bdi, NULL); |
| 340 | |||
| 341 | cond_resched(); | ||
| 342 | if (again) | ||
| 343 | goto loop; | ||
| 344 | |||
| 345 | spin_lock(&device->io_lock); | ||
| 346 | if (device->pending_bios.head || device->pending_sync_bios.head) | ||
| 347 | goto loop_lock; | ||
| 348 | spin_unlock(&device->io_lock); | ||
| 349 | |||
| 349 | done: | 350 | done: |
| 350 | return 0; | 351 | return 0; |
| 351 | } | 352 | } |
| @@ -365,6 +366,7 @@ static noinline int device_list_add(const char *path, | |||
| 365 | struct btrfs_device *device; | 366 | struct btrfs_device *device; |
| 366 | struct btrfs_fs_devices *fs_devices; | 367 | struct btrfs_fs_devices *fs_devices; |
| 367 | u64 found_transid = btrfs_super_generation(disk_super); | 368 | u64 found_transid = btrfs_super_generation(disk_super); |
| 369 | char *name; | ||
| 368 | 370 | ||
| 369 | fs_devices = find_fsid(disk_super->fsid); | 371 | fs_devices = find_fsid(disk_super->fsid); |
| 370 | if (!fs_devices) { | 372 | if (!fs_devices) { |
| @@ -411,6 +413,12 @@ static noinline int device_list_add(const char *path, | |||
| 411 | 413 | ||
| 412 | device->fs_devices = fs_devices; | 414 | device->fs_devices = fs_devices; |
| 413 | fs_devices->num_devices++; | 415 | fs_devices->num_devices++; |
| 416 | } else if (strcmp(device->name, path)) { | ||
| 417 | name = kstrdup(path, GFP_NOFS); | ||
| 418 | if (!name) | ||
| 419 | return -ENOMEM; | ||
| 420 | kfree(device->name); | ||
| 421 | device->name = name; | ||
| 414 | } | 422 | } |
| 415 | 423 | ||
| 416 | if (found_transid > fs_devices->latest_trans) { | 424 | if (found_transid > fs_devices->latest_trans) { |
| @@ -592,7 +600,7 @@ static int __btrfs_open_devices(struct btrfs_fs_devices *fs_devices, | |||
| 592 | goto error_close; | 600 | goto error_close; |
| 593 | 601 | ||
| 594 | disk_super = (struct btrfs_super_block *)bh->b_data; | 602 | disk_super = (struct btrfs_super_block *)bh->b_data; |
| 595 | devid = le64_to_cpu(disk_super->dev_item.devid); | 603 | devid = btrfs_stack_device_id(&disk_super->dev_item); |
| 596 | if (devid != device->devid) | 604 | if (devid != device->devid) |
| 597 | goto error_brelse; | 605 | goto error_brelse; |
| 598 | 606 | ||
| @@ -694,7 +702,7 @@ int btrfs_scan_one_device(const char *path, fmode_t flags, void *holder, | |||
| 694 | goto error_close; | 702 | goto error_close; |
| 695 | } | 703 | } |
| 696 | disk_super = (struct btrfs_super_block *)bh->b_data; | 704 | disk_super = (struct btrfs_super_block *)bh->b_data; |
| 697 | devid = le64_to_cpu(disk_super->dev_item.devid); | 705 | devid = btrfs_stack_device_id(&disk_super->dev_item); |
| 698 | transid = btrfs_super_generation(disk_super); | 706 | transid = btrfs_super_generation(disk_super); |
| 699 | if (disk_super->label[0]) | 707 | if (disk_super->label[0]) |
| 700 | printk(KERN_INFO "device label %s ", disk_super->label); | 708 | printk(KERN_INFO "device label %s ", disk_super->label); |
| @@ -1187,7 +1195,7 @@ int btrfs_rm_device(struct btrfs_root *root, char *device_path) | |||
| 1187 | goto error_close; | 1195 | goto error_close; |
| 1188 | } | 1196 | } |
| 1189 | disk_super = (struct btrfs_super_block *)bh->b_data; | 1197 | disk_super = (struct btrfs_super_block *)bh->b_data; |
| 1190 | devid = le64_to_cpu(disk_super->dev_item.devid); | 1198 | devid = btrfs_stack_device_id(&disk_super->dev_item); |
| 1191 | dev_uuid = disk_super->dev_item.uuid; | 1199 | dev_uuid = disk_super->dev_item.uuid; |
| 1192 | device = btrfs_find_device(root, devid, dev_uuid, | 1200 | device = btrfs_find_device(root, devid, dev_uuid, |
| 1193 | disk_super->fsid); | 1201 | disk_super->fsid); |
| @@ -2191,9 +2199,9 @@ static int __btrfs_alloc_chunk(struct btrfs_trans_handle *trans, | |||
| 2191 | min_stripes = 2; | 2199 | min_stripes = 2; |
| 2192 | } | 2200 | } |
| 2193 | if (type & (BTRFS_BLOCK_GROUP_RAID1)) { | 2201 | if (type & (BTRFS_BLOCK_GROUP_RAID1)) { |
| 2194 | num_stripes = min_t(u64, 2, fs_devices->rw_devices); | 2202 | if (fs_devices->rw_devices < 2) |
| 2195 | if (num_stripes < 2) | ||
| 2196 | return -ENOSPC; | 2203 | return -ENOSPC; |
| 2204 | num_stripes = 2; | ||
| 2197 | min_stripes = 2; | 2205 | min_stripes = 2; |
| 2198 | } | 2206 | } |
| 2199 | if (type & (BTRFS_BLOCK_GROUP_RAID10)) { | 2207 | if (type & (BTRFS_BLOCK_GROUP_RAID10)) { |
| @@ -2237,8 +2245,10 @@ again: | |||
| 2237 | do_div(calc_size, stripe_len); | 2245 | do_div(calc_size, stripe_len); |
| 2238 | calc_size *= stripe_len; | 2246 | calc_size *= stripe_len; |
| 2239 | } | 2247 | } |
| 2248 | |||
| 2240 | /* we don't want tiny stripes */ | 2249 | /* we don't want tiny stripes */ |
| 2241 | calc_size = max_t(u64, min_stripe_size, calc_size); | 2250 | if (!looped) |
| 2251 | calc_size = max_t(u64, min_stripe_size, calc_size); | ||
| 2242 | 2252 | ||
| 2243 | do_div(calc_size, stripe_len); | 2253 | do_div(calc_size, stripe_len); |
| 2244 | calc_size *= stripe_len; | 2254 | calc_size *= stripe_len; |
| @@ -3382,6 +3392,8 @@ int btrfs_read_chunk_tree(struct btrfs_root *root) | |||
| 3382 | key.type = 0; | 3392 | key.type = 0; |
| 3383 | again: | 3393 | again: |
| 3384 | ret = btrfs_search_slot(NULL, root, &key, path, 0, 0); | 3394 | ret = btrfs_search_slot(NULL, root, &key, path, 0, 0); |
| 3395 | if (ret < 0) | ||
| 3396 | goto error; | ||
| 3385 | while (1) { | 3397 | while (1) { |
| 3386 | leaf = path->nodes[0]; | 3398 | leaf = path->nodes[0]; |
| 3387 | slot = path->slots[0]; | 3399 | slot = path->slots[0]; |
