aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStefan Behrens <sbehrens@giantdisaster.de>2012-11-05 11:03:39 -0500
committerJosef Bacik <jbacik@fusionio.com>2012-12-12 17:15:36 -0500
commitaa1b8cd409f05e1489ec77ff219eff6ed4b801b8 (patch)
tree92d091da518c2c9b141b5649663a7aa9c0d5624c
parenta8a6dab77997a371f1925a4001021eea3ee5cb88 (diff)
Btrfs: pass fs_info instead of root
A small number of functions that are used in a device replace procedure when the operation is resumed at mount time are unable to pass the same root pointer that would be used in the regular (ioctl) context. And since the root pointer is not required, only the fs_info is, the root pointer argument is replaced with the fs_info pointer argument. Signed-off-by: Stefan Behrens <sbehrens@giantdisaster.de> Signed-off-by: Chris Mason <chris.mason@fusionio.com>
-rw-r--r--fs/btrfs/ctree.h11
-rw-r--r--fs/btrfs/disk-io.c4
-rw-r--r--fs/btrfs/ioctl.c8
-rw-r--r--fs/btrfs/scrub.c76
-rw-r--r--fs/btrfs/super.c2
-rw-r--r--fs/btrfs/volumes.c23
-rw-r--r--fs/btrfs/volumes.h2
7 files changed, 60 insertions, 66 deletions
diff --git a/fs/btrfs/ctree.h b/fs/btrfs/ctree.h
index f9a078661ebc..f8bb62c82b0c 100644
--- a/fs/btrfs/ctree.h
+++ b/fs/btrfs/ctree.h
@@ -3540,15 +3540,16 @@ int btrfs_reloc_post_snapshot(struct btrfs_trans_handle *trans,
3540 struct btrfs_pending_snapshot *pending); 3540 struct btrfs_pending_snapshot *pending);
3541 3541
3542/* scrub.c */ 3542/* scrub.c */
3543int btrfs_scrub_dev(struct btrfs_root *root, u64 devid, u64 start, u64 end, 3543int btrfs_scrub_dev(struct btrfs_fs_info *fs_info, u64 devid, u64 start,
3544 struct btrfs_scrub_progress *progress, int readonly); 3544 u64 end, struct btrfs_scrub_progress *progress,
3545 int readonly);
3545void btrfs_scrub_pause(struct btrfs_root *root); 3546void btrfs_scrub_pause(struct btrfs_root *root);
3546void btrfs_scrub_pause_super(struct btrfs_root *root); 3547void btrfs_scrub_pause_super(struct btrfs_root *root);
3547void btrfs_scrub_continue(struct btrfs_root *root); 3548void btrfs_scrub_continue(struct btrfs_root *root);
3548void btrfs_scrub_continue_super(struct btrfs_root *root); 3549void btrfs_scrub_continue_super(struct btrfs_root *root);
3549int __btrfs_scrub_cancel(struct btrfs_fs_info *info); 3550int btrfs_scrub_cancel(struct btrfs_fs_info *info);
3550int btrfs_scrub_cancel(struct btrfs_root *root); 3551int btrfs_scrub_cancel_dev(struct btrfs_fs_info *info,
3551int btrfs_scrub_cancel_dev(struct btrfs_root *root, struct btrfs_device *dev); 3552 struct btrfs_device *dev);
3552int btrfs_scrub_cancel_devid(struct btrfs_root *root, u64 devid); 3553int btrfs_scrub_cancel_devid(struct btrfs_root *root, u64 devid);
3553int btrfs_scrub_progress(struct btrfs_root *root, u64 devid, 3554int btrfs_scrub_progress(struct btrfs_root *root, u64 devid,
3554 struct btrfs_scrub_progress *progress); 3555 struct btrfs_scrub_progress *progress);
diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c
index ba2b931fd8f6..42a8024e935f 100644
--- a/fs/btrfs/disk-io.c
+++ b/fs/btrfs/disk-io.c
@@ -3283,9 +3283,9 @@ int close_ctree(struct btrfs_root *root)
3283 smp_mb(); 3283 smp_mb();
3284 3284
3285 /* pause restriper - we want to resume on mount */ 3285 /* pause restriper - we want to resume on mount */
3286 btrfs_pause_balance(root->fs_info); 3286 btrfs_pause_balance(fs_info);
3287 3287
3288 btrfs_scrub_cancel(root); 3288 btrfs_scrub_cancel(fs_info);
3289 3289
3290 /* wait for any defraggers to finish */ 3290 /* wait for any defraggers to finish */
3291 wait_event(fs_info->transaction_wait, 3291 wait_event(fs_info->transaction_wait,
diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c
index e262cd8c4a7d..b40b827f93e7 100644
--- a/fs/btrfs/ioctl.c
+++ b/fs/btrfs/ioctl.c
@@ -1343,7 +1343,7 @@ static noinline int btrfs_ioctl_resize(struct btrfs_root *root,
1343 printk(KERN_INFO "btrfs: resizing devid %llu\n", 1343 printk(KERN_INFO "btrfs: resizing devid %llu\n",
1344 (unsigned long long)devid); 1344 (unsigned long long)devid);
1345 } 1345 }
1346 device = btrfs_find_device(root, devid, NULL, NULL); 1346 device = btrfs_find_device(root->fs_info, devid, NULL, NULL);
1347 if (!device) { 1347 if (!device) {
1348 printk(KERN_INFO "btrfs: resizer unable to find device %llu\n", 1348 printk(KERN_INFO "btrfs: resizer unable to find device %llu\n",
1349 (unsigned long long)devid); 1349 (unsigned long long)devid);
@@ -2332,7 +2332,7 @@ static long btrfs_ioctl_dev_info(struct btrfs_root *root, void __user *arg)
2332 s_uuid = di_args->uuid; 2332 s_uuid = di_args->uuid;
2333 2333
2334 mutex_lock(&fs_devices->device_list_mutex); 2334 mutex_lock(&fs_devices->device_list_mutex);
2335 dev = btrfs_find_device(root, di_args->devid, s_uuid, NULL); 2335 dev = btrfs_find_device(root->fs_info, di_args->devid, s_uuid, NULL);
2336 mutex_unlock(&fs_devices->device_list_mutex); 2336 mutex_unlock(&fs_devices->device_list_mutex);
2337 2337
2338 if (!dev) { 2338 if (!dev) {
@@ -3089,7 +3089,7 @@ static long btrfs_ioctl_scrub(struct btrfs_root *root, void __user *arg)
3089 if (IS_ERR(sa)) 3089 if (IS_ERR(sa))
3090 return PTR_ERR(sa); 3090 return PTR_ERR(sa);
3091 3091
3092 ret = btrfs_scrub_dev(root, sa->devid, sa->start, sa->end, 3092 ret = btrfs_scrub_dev(root->fs_info, sa->devid, sa->start, sa->end,
3093 &sa->progress, sa->flags & BTRFS_SCRUB_READONLY); 3093 &sa->progress, sa->flags & BTRFS_SCRUB_READONLY);
3094 3094
3095 if (copy_to_user(arg, sa, sizeof(*sa))) 3095 if (copy_to_user(arg, sa, sizeof(*sa)))
@@ -3104,7 +3104,7 @@ static long btrfs_ioctl_scrub_cancel(struct btrfs_root *root, void __user *arg)
3104 if (!capable(CAP_SYS_ADMIN)) 3104 if (!capable(CAP_SYS_ADMIN))
3105 return -EPERM; 3105 return -EPERM;
3106 3106
3107 return btrfs_scrub_cancel(root); 3107 return btrfs_scrub_cancel(root->fs_info);
3108} 3108}
3109 3109
3110static long btrfs_ioctl_scrub_progress(struct btrfs_root *root, 3110static long btrfs_ioctl_scrub_progress(struct btrfs_root *root,
diff --git a/fs/btrfs/scrub.c b/fs/btrfs/scrub.c
index 894bb2732fcc..6cf23f4f7bb7 100644
--- a/fs/btrfs/scrub.c
+++ b/fs/btrfs/scrub.c
@@ -2262,9 +2262,8 @@ static noinline_for_stack int scrub_supers(struct scrub_ctx *sctx,
2262/* 2262/*
2263 * get a reference count on fs_info->scrub_workers. start worker if necessary 2263 * get a reference count on fs_info->scrub_workers. start worker if necessary
2264 */ 2264 */
2265static noinline_for_stack int scrub_workers_get(struct btrfs_root *root) 2265static noinline_for_stack int scrub_workers_get(struct btrfs_fs_info *fs_info)
2266{ 2266{
2267 struct btrfs_fs_info *fs_info = root->fs_info;
2268 int ret = 0; 2267 int ret = 0;
2269 2268
2270 mutex_lock(&fs_info->scrub_lock); 2269 mutex_lock(&fs_info->scrub_lock);
@@ -2283,10 +2282,8 @@ out:
2283 return ret; 2282 return ret;
2284} 2283}
2285 2284
2286static noinline_for_stack void scrub_workers_put(struct btrfs_root *root) 2285static noinline_for_stack void scrub_workers_put(struct btrfs_fs_info *fs_info)
2287{ 2286{
2288 struct btrfs_fs_info *fs_info = root->fs_info;
2289
2290 mutex_lock(&fs_info->scrub_lock); 2287 mutex_lock(&fs_info->scrub_lock);
2291 if (--fs_info->scrub_workers_refcnt == 0) 2288 if (--fs_info->scrub_workers_refcnt == 0)
2292 btrfs_stop_workers(&fs_info->scrub_workers); 2289 btrfs_stop_workers(&fs_info->scrub_workers);
@@ -2294,29 +2291,29 @@ static noinline_for_stack void scrub_workers_put(struct btrfs_root *root)
2294 mutex_unlock(&fs_info->scrub_lock); 2291 mutex_unlock(&fs_info->scrub_lock);
2295} 2292}
2296 2293
2297 2294int btrfs_scrub_dev(struct btrfs_fs_info *fs_info, u64 devid, u64 start,
2298int btrfs_scrub_dev(struct btrfs_root *root, u64 devid, u64 start, u64 end, 2295 u64 end, struct btrfs_scrub_progress *progress,
2299 struct btrfs_scrub_progress *progress, int readonly) 2296 int readonly)
2300{ 2297{
2301 struct scrub_ctx *sctx; 2298 struct scrub_ctx *sctx;
2302 struct btrfs_fs_info *fs_info = root->fs_info;
2303 int ret; 2299 int ret;
2304 struct btrfs_device *dev; 2300 struct btrfs_device *dev;
2305 2301
2306 if (btrfs_fs_closing(root->fs_info)) 2302 if (btrfs_fs_closing(fs_info))
2307 return -EINVAL; 2303 return -EINVAL;
2308 2304
2309 /* 2305 /*
2310 * check some assumptions 2306 * check some assumptions
2311 */ 2307 */
2312 if (root->nodesize != root->leafsize) { 2308 if (fs_info->chunk_root->nodesize != fs_info->chunk_root->leafsize) {
2313 printk(KERN_ERR 2309 printk(KERN_ERR
2314 "btrfs_scrub: size assumption nodesize == leafsize (%d == %d) fails\n", 2310 "btrfs_scrub: size assumption nodesize == leafsize (%d == %d) fails\n",
2315 root->nodesize, root->leafsize); 2311 fs_info->chunk_root->nodesize,
2312 fs_info->chunk_root->leafsize);
2316 return -EINVAL; 2313 return -EINVAL;
2317 } 2314 }
2318 2315
2319 if (root->nodesize > BTRFS_STRIPE_LEN) { 2316 if (fs_info->chunk_root->nodesize > BTRFS_STRIPE_LEN) {
2320 /* 2317 /*
2321 * in this case scrub is unable to calculate the checksum 2318 * in this case scrub is unable to calculate the checksum
2322 * the way scrub is implemented. Do not handle this 2319 * the way scrub is implemented. Do not handle this
@@ -2324,15 +2321,16 @@ int btrfs_scrub_dev(struct btrfs_root *root, u64 devid, u64 start, u64 end,
2324 */ 2321 */
2325 printk(KERN_ERR 2322 printk(KERN_ERR
2326 "btrfs_scrub: size assumption nodesize <= BTRFS_STRIPE_LEN (%d <= %d) fails\n", 2323 "btrfs_scrub: size assumption nodesize <= BTRFS_STRIPE_LEN (%d <= %d) fails\n",
2327 root->nodesize, BTRFS_STRIPE_LEN); 2324 fs_info->chunk_root->nodesize, BTRFS_STRIPE_LEN);
2328 return -EINVAL; 2325 return -EINVAL;
2329 } 2326 }
2330 2327
2331 if (root->sectorsize != PAGE_SIZE) { 2328 if (fs_info->chunk_root->sectorsize != PAGE_SIZE) {
2332 /* not supported for data w/o checksums */ 2329 /* not supported for data w/o checksums */
2333 printk(KERN_ERR 2330 printk(KERN_ERR
2334 "btrfs_scrub: size assumption sectorsize != PAGE_SIZE (%d != %lld) fails\n", 2331 "btrfs_scrub: size assumption sectorsize != PAGE_SIZE (%d != %lld) fails\n",
2335 root->sectorsize, (unsigned long long)PAGE_SIZE); 2332 fs_info->chunk_root->sectorsize,
2333 (unsigned long long)PAGE_SIZE);
2336 return -EINVAL; 2334 return -EINVAL;
2337 } 2335 }
2338 2336
@@ -2352,37 +2350,37 @@ int btrfs_scrub_dev(struct btrfs_root *root, u64 devid, u64 start, u64 end,
2352 return -EINVAL; 2350 return -EINVAL;
2353 } 2351 }
2354 2352
2355 ret = scrub_workers_get(root); 2353 ret = scrub_workers_get(fs_info);
2356 if (ret) 2354 if (ret)
2357 return ret; 2355 return ret;
2358 2356
2359 mutex_lock(&root->fs_info->fs_devices->device_list_mutex); 2357 mutex_lock(&fs_info->fs_devices->device_list_mutex);
2360 dev = btrfs_find_device(root, devid, NULL, NULL); 2358 dev = btrfs_find_device(fs_info, devid, NULL, NULL);
2361 if (!dev || dev->missing) { 2359 if (!dev || dev->missing) {
2362 mutex_unlock(&root->fs_info->fs_devices->device_list_mutex); 2360 mutex_unlock(&fs_info->fs_devices->device_list_mutex);
2363 scrub_workers_put(root); 2361 scrub_workers_put(fs_info);
2364 return -ENODEV; 2362 return -ENODEV;
2365 } 2363 }
2366 mutex_lock(&fs_info->scrub_lock); 2364 mutex_lock(&fs_info->scrub_lock);
2367 2365
2368 if (!dev->in_fs_metadata) { 2366 if (!dev->in_fs_metadata) {
2369 mutex_unlock(&fs_info->scrub_lock); 2367 mutex_unlock(&fs_info->scrub_lock);
2370 mutex_unlock(&root->fs_info->fs_devices->device_list_mutex); 2368 mutex_unlock(&fs_info->fs_devices->device_list_mutex);
2371 scrub_workers_put(root); 2369 scrub_workers_put(fs_info);
2372 return -ENODEV; 2370 return -EIO;
2373 } 2371 }
2374 2372
2375 if (dev->scrub_device) { 2373 if (dev->scrub_device) {
2376 mutex_unlock(&fs_info->scrub_lock); 2374 mutex_unlock(&fs_info->scrub_lock);
2377 mutex_unlock(&root->fs_info->fs_devices->device_list_mutex); 2375 mutex_unlock(&fs_info->fs_devices->device_list_mutex);
2378 scrub_workers_put(root); 2376 scrub_workers_put(fs_info);
2379 return -EINPROGRESS; 2377 return -EINPROGRESS;
2380 } 2378 }
2381 sctx = scrub_setup_ctx(dev); 2379 sctx = scrub_setup_ctx(dev);
2382 if (IS_ERR(sctx)) { 2380 if (IS_ERR(sctx)) {
2383 mutex_unlock(&fs_info->scrub_lock); 2381 mutex_unlock(&fs_info->scrub_lock);
2384 mutex_unlock(&root->fs_info->fs_devices->device_list_mutex); 2382 mutex_unlock(&fs_info->fs_devices->device_list_mutex);
2385 scrub_workers_put(root); 2383 scrub_workers_put(fs_info);
2386 return PTR_ERR(sctx); 2384 return PTR_ERR(sctx);
2387 } 2385 }
2388 sctx->readonly = readonly; 2386 sctx->readonly = readonly;
@@ -2390,7 +2388,7 @@ int btrfs_scrub_dev(struct btrfs_root *root, u64 devid, u64 start, u64 end,
2390 2388
2391 atomic_inc(&fs_info->scrubs_running); 2389 atomic_inc(&fs_info->scrubs_running);
2392 mutex_unlock(&fs_info->scrub_lock); 2390 mutex_unlock(&fs_info->scrub_lock);
2393 mutex_unlock(&root->fs_info->fs_devices->device_list_mutex); 2391 mutex_unlock(&fs_info->fs_devices->device_list_mutex);
2394 2392
2395 down_read(&fs_info->scrub_super_lock); 2393 down_read(&fs_info->scrub_super_lock);
2396 ret = scrub_supers(sctx, dev); 2394 ret = scrub_supers(sctx, dev);
@@ -2413,7 +2411,7 @@ int btrfs_scrub_dev(struct btrfs_root *root, u64 devid, u64 start, u64 end,
2413 mutex_unlock(&fs_info->scrub_lock); 2411 mutex_unlock(&fs_info->scrub_lock);
2414 2412
2415 scrub_free_ctx(sctx); 2413 scrub_free_ctx(sctx);
2416 scrub_workers_put(root); 2414 scrub_workers_put(fs_info);
2417 2415
2418 return ret; 2416 return ret;
2419} 2417}
@@ -2453,9 +2451,8 @@ void btrfs_scrub_continue_super(struct btrfs_root *root)
2453 up_write(&root->fs_info->scrub_super_lock); 2451 up_write(&root->fs_info->scrub_super_lock);
2454} 2452}
2455 2453
2456int __btrfs_scrub_cancel(struct btrfs_fs_info *fs_info) 2454int btrfs_scrub_cancel(struct btrfs_fs_info *fs_info)
2457{ 2455{
2458
2459 mutex_lock(&fs_info->scrub_lock); 2456 mutex_lock(&fs_info->scrub_lock);
2460 if (!atomic_read(&fs_info->scrubs_running)) { 2457 if (!atomic_read(&fs_info->scrubs_running)) {
2461 mutex_unlock(&fs_info->scrub_lock); 2458 mutex_unlock(&fs_info->scrub_lock);
@@ -2475,14 +2472,9 @@ int __btrfs_scrub_cancel(struct btrfs_fs_info *fs_info)
2475 return 0; 2472 return 0;
2476} 2473}
2477 2474
2478int btrfs_scrub_cancel(struct btrfs_root *root) 2475int btrfs_scrub_cancel_dev(struct btrfs_fs_info *fs_info,
2476 struct btrfs_device *dev)
2479{ 2477{
2480 return __btrfs_scrub_cancel(root->fs_info);
2481}
2482
2483int btrfs_scrub_cancel_dev(struct btrfs_root *root, struct btrfs_device *dev)
2484{
2485 struct btrfs_fs_info *fs_info = root->fs_info;
2486 struct scrub_ctx *sctx; 2478 struct scrub_ctx *sctx;
2487 2479
2488 mutex_lock(&fs_info->scrub_lock); 2480 mutex_lock(&fs_info->scrub_lock);
@@ -2514,12 +2506,12 @@ int btrfs_scrub_cancel_devid(struct btrfs_root *root, u64 devid)
2514 * does not go away in cancel_dev. FIXME: find a better solution 2506 * does not go away in cancel_dev. FIXME: find a better solution
2515 */ 2507 */
2516 mutex_lock(&fs_info->fs_devices->device_list_mutex); 2508 mutex_lock(&fs_info->fs_devices->device_list_mutex);
2517 dev = btrfs_find_device(root, devid, NULL, NULL); 2509 dev = btrfs_find_device(fs_info, devid, NULL, NULL);
2518 if (!dev) { 2510 if (!dev) {
2519 mutex_unlock(&fs_info->fs_devices->device_list_mutex); 2511 mutex_unlock(&fs_info->fs_devices->device_list_mutex);
2520 return -ENODEV; 2512 return -ENODEV;
2521 } 2513 }
2522 ret = btrfs_scrub_cancel_dev(root, dev); 2514 ret = btrfs_scrub_cancel_dev(fs_info, dev);
2523 mutex_unlock(&fs_info->fs_devices->device_list_mutex); 2515 mutex_unlock(&fs_info->fs_devices->device_list_mutex);
2524 2516
2525 return ret; 2517 return ret;
@@ -2532,7 +2524,7 @@ int btrfs_scrub_progress(struct btrfs_root *root, u64 devid,
2532 struct scrub_ctx *sctx = NULL; 2524 struct scrub_ctx *sctx = NULL;
2533 2525
2534 mutex_lock(&root->fs_info->fs_devices->device_list_mutex); 2526 mutex_lock(&root->fs_info->fs_devices->device_list_mutex);
2535 dev = btrfs_find_device(root, devid, NULL, NULL); 2527 dev = btrfs_find_device(root->fs_info, devid, NULL, NULL);
2536 if (dev) 2528 if (dev)
2537 sctx = dev->scrub_device; 2529 sctx = dev->scrub_device;
2538 if (sctx) 2530 if (sctx)
diff --git a/fs/btrfs/super.c b/fs/btrfs/super.c
index acd2df85bed5..a1a6c296ddcd 100644
--- a/fs/btrfs/super.c
+++ b/fs/btrfs/super.c
@@ -116,7 +116,7 @@ static void btrfs_handle_error(struct btrfs_fs_info *fs_info)
116 if (fs_info->fs_state & BTRFS_SUPER_FLAG_ERROR) { 116 if (fs_info->fs_state & BTRFS_SUPER_FLAG_ERROR) {
117 sb->s_flags |= MS_RDONLY; 117 sb->s_flags |= MS_RDONLY;
118 printk(KERN_INFO "btrfs is forced readonly\n"); 118 printk(KERN_INFO "btrfs is forced readonly\n");
119 __btrfs_scrub_cancel(fs_info); 119 btrfs_scrub_cancel(fs_info);
120// WARN_ON(1); 120// WARN_ON(1);
121 } 121 }
122} 122}
diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c
index 6cd8a32c4484..d2c0bccca607 100644
--- a/fs/btrfs/volumes.c
+++ b/fs/btrfs/volumes.c
@@ -1398,7 +1398,7 @@ int btrfs_rm_device(struct btrfs_root *root, char *device_path)
1398 disk_super = (struct btrfs_super_block *)bh->b_data; 1398 disk_super = (struct btrfs_super_block *)bh->b_data;
1399 devid = btrfs_stack_device_id(&disk_super->dev_item); 1399 devid = btrfs_stack_device_id(&disk_super->dev_item);
1400 dev_uuid = disk_super->dev_item.uuid; 1400 dev_uuid = disk_super->dev_item.uuid;
1401 device = btrfs_find_device(root, devid, dev_uuid, 1401 device = btrfs_find_device(root->fs_info, devid, dev_uuid,
1402 disk_super->fsid); 1402 disk_super->fsid);
1403 if (!device) { 1403 if (!device) {
1404 ret = -ENOENT; 1404 ret = -ENOENT;
@@ -1435,7 +1435,7 @@ int btrfs_rm_device(struct btrfs_root *root, char *device_path)
1435 spin_unlock(&root->fs_info->free_chunk_lock); 1435 spin_unlock(&root->fs_info->free_chunk_lock);
1436 1436
1437 device->in_fs_metadata = 0; 1437 device->in_fs_metadata = 0;
1438 btrfs_scrub_cancel_dev(root, device); 1438 btrfs_scrub_cancel_dev(root->fs_info, device);
1439 1439
1440 /* 1440 /*
1441 * the device list mutex makes sure that we don't change 1441 * the device list mutex makes sure that we don't change
@@ -1492,7 +1492,7 @@ int btrfs_rm_device(struct btrfs_root *root, char *device_path)
1492 * at this point, the device is zero sized. We want to 1492 * at this point, the device is zero sized. We want to
1493 * remove it from the devices list and zero out the old super 1493 * remove it from the devices list and zero out the old super
1494 */ 1494 */
1495 if (clear_super) { 1495 if (clear_super && disk_super) {
1496 /* make sure this device isn't detected as part of 1496 /* make sure this device isn't detected as part of
1497 * the FS anymore 1497 * the FS anymore
1498 */ 1498 */
@@ -1540,7 +1540,7 @@ int btrfs_find_device_by_path(struct btrfs_root *root, char *device_path,
1540 disk_super = (struct btrfs_super_block *)bh->b_data; 1540 disk_super = (struct btrfs_super_block *)bh->b_data;
1541 devid = btrfs_stack_device_id(&disk_super->dev_item); 1541 devid = btrfs_stack_device_id(&disk_super->dev_item);
1542 dev_uuid = disk_super->dev_item.uuid; 1542 dev_uuid = disk_super->dev_item.uuid;
1543 *device = btrfs_find_device(root, devid, dev_uuid, 1543 *device = btrfs_find_device(root->fs_info, devid, dev_uuid,
1544 disk_super->fsid); 1544 disk_super->fsid);
1545 brelse(bh); 1545 brelse(bh);
1546 if (!*device) 1546 if (!*device)
@@ -1699,7 +1699,8 @@ next_slot:
1699 read_extent_buffer(leaf, fs_uuid, 1699 read_extent_buffer(leaf, fs_uuid,
1700 (unsigned long)btrfs_device_fsid(dev_item), 1700 (unsigned long)btrfs_device_fsid(dev_item),
1701 BTRFS_UUID_SIZE); 1701 BTRFS_UUID_SIZE);
1702 device = btrfs_find_device(root, devid, dev_uuid, fs_uuid); 1702 device = btrfs_find_device(root->fs_info, devid, dev_uuid,
1703 fs_uuid);
1703 BUG_ON(!device); /* Logic error */ 1704 BUG_ON(!device); /* Logic error */
1704 1705
1705 if (device->fs_devices->seeding) { 1706 if (device->fs_devices->seeding) {
@@ -4463,13 +4464,13 @@ int btrfs_map_bio(struct btrfs_root *root, int rw, struct bio *bio,
4463 return 0; 4464 return 0;
4464} 4465}
4465 4466
4466struct btrfs_device *btrfs_find_device(struct btrfs_root *root, u64 devid, 4467struct btrfs_device *btrfs_find_device(struct btrfs_fs_info *fs_info, u64 devid,
4467 u8 *uuid, u8 *fsid) 4468 u8 *uuid, u8 *fsid)
4468{ 4469{
4469 struct btrfs_device *device; 4470 struct btrfs_device *device;
4470 struct btrfs_fs_devices *cur_devices; 4471 struct btrfs_fs_devices *cur_devices;
4471 4472
4472 cur_devices = root->fs_info->fs_devices; 4473 cur_devices = fs_info->fs_devices;
4473 while (cur_devices) { 4474 while (cur_devices) {
4474 if (!fsid || 4475 if (!fsid ||
4475 !memcmp(cur_devices->fsid, fsid, BTRFS_UUID_SIZE)) { 4476 !memcmp(cur_devices->fsid, fsid, BTRFS_UUID_SIZE)) {
@@ -4567,8 +4568,8 @@ static int read_one_chunk(struct btrfs_root *root, struct btrfs_key *key,
4567 read_extent_buffer(leaf, uuid, (unsigned long) 4568 read_extent_buffer(leaf, uuid, (unsigned long)
4568 btrfs_stripe_dev_uuid_nr(chunk, i), 4569 btrfs_stripe_dev_uuid_nr(chunk, i),
4569 BTRFS_UUID_SIZE); 4570 BTRFS_UUID_SIZE);
4570 map->stripes[i].dev = btrfs_find_device(root, devid, uuid, 4571 map->stripes[i].dev = btrfs_find_device(root->fs_info, devid,
4571 NULL); 4572 uuid, NULL);
4572 if (!map->stripes[i].dev && !btrfs_test_opt(root, DEGRADED)) { 4573 if (!map->stripes[i].dev && !btrfs_test_opt(root, DEGRADED)) {
4573 kfree(map); 4574 kfree(map);
4574 free_extent_map(em); 4575 free_extent_map(em);
@@ -4686,7 +4687,7 @@ static int read_one_dev(struct btrfs_root *root,
4686 return ret; 4687 return ret;
4687 } 4688 }
4688 4689
4689 device = btrfs_find_device(root, devid, dev_uuid, fs_uuid); 4690 device = btrfs_find_device(root->fs_info, devid, dev_uuid, fs_uuid);
4690 if (!device || !device->bdev) { 4691 if (!device || !device->bdev) {
4691 if (!btrfs_test_opt(root, DEGRADED)) 4692 if (!btrfs_test_opt(root, DEGRADED))
4692 return -EIO; 4693 return -EIO;
@@ -5078,7 +5079,7 @@ int btrfs_get_dev_stats(struct btrfs_root *root,
5078 int i; 5079 int i;
5079 5080
5080 mutex_lock(&fs_devices->device_list_mutex); 5081 mutex_lock(&fs_devices->device_list_mutex);
5081 dev = btrfs_find_device(root, stats->devid, NULL, NULL); 5082 dev = btrfs_find_device(root->fs_info, stats->devid, NULL, NULL);
5082 mutex_unlock(&fs_devices->device_list_mutex); 5083 mutex_unlock(&fs_devices->device_list_mutex);
5083 5084
5084 if (!dev) { 5085 if (!dev) {
diff --git a/fs/btrfs/volumes.h b/fs/btrfs/volumes.h
index 7eaaf4e61959..802e2ba02f09 100644
--- a/fs/btrfs/volumes.h
+++ b/fs/btrfs/volumes.h
@@ -281,7 +281,7 @@ void btrfs_cleanup_fs_uuids(void);
281int btrfs_num_copies(struct btrfs_fs_info *fs_info, u64 logical, u64 len); 281int btrfs_num_copies(struct btrfs_fs_info *fs_info, u64 logical, u64 len);
282int btrfs_grow_device(struct btrfs_trans_handle *trans, 282int btrfs_grow_device(struct btrfs_trans_handle *trans,
283 struct btrfs_device *device, u64 new_size); 283 struct btrfs_device *device, u64 new_size);
284struct btrfs_device *btrfs_find_device(struct btrfs_root *root, u64 devid, 284struct btrfs_device *btrfs_find_device(struct btrfs_fs_info *fs_info, u64 devid,
285 u8 *uuid, u8 *fsid); 285 u8 *uuid, u8 *fsid);
286int btrfs_shrink_device(struct btrfs_device *device, u64 new_size); 286int btrfs_shrink_device(struct btrfs_device *device, u64 new_size);
287int btrfs_init_new_device(struct btrfs_root *root, char *path); 287int btrfs_init_new_device(struct btrfs_root *root, char *path);