diff options
Diffstat (limited to 'fs/btrfs/volumes.c')
-rw-r--r-- | fs/btrfs/volumes.c | 41 |
1 files changed, 23 insertions, 18 deletions
diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c index ecf0633ab8cc..c3ee63f92a5f 100644 --- a/fs/btrfs/volumes.c +++ b/fs/btrfs/volumes.c | |||
@@ -85,7 +85,7 @@ int btrfs_cleanup_fs_uuids(void) | |||
85 | dev = list_entry(fs_devices->devices.next, | 85 | dev = list_entry(fs_devices->devices.next, |
86 | struct btrfs_device, dev_list); | 86 | struct btrfs_device, dev_list); |
87 | if (dev->bdev) { | 87 | if (dev->bdev) { |
88 | close_bdev_excl(dev->bdev); | 88 | close_bdev_exclusive(dev->bdev, dev->mode); |
89 | fs_devices->open_devices--; | 89 | fs_devices->open_devices--; |
90 | } | 90 | } |
91 | fs_devices->num_devices--; | 91 | fs_devices->num_devices--; |
@@ -317,7 +317,7 @@ again: | |||
317 | continue; | 317 | continue; |
318 | 318 | ||
319 | if (device->bdev) { | 319 | if (device->bdev) { |
320 | close_bdev_excl(device->bdev); | 320 | close_bdev_exclusive(device->bdev, device->mode); |
321 | device->bdev = NULL; | 321 | device->bdev = NULL; |
322 | fs_devices->open_devices--; | 322 | fs_devices->open_devices--; |
323 | } | 323 | } |
@@ -356,7 +356,7 @@ again: | |||
356 | list_for_each(cur, &fs_devices->devices) { | 356 | list_for_each(cur, &fs_devices->devices) { |
357 | device = list_entry(cur, struct btrfs_device, dev_list); | 357 | device = list_entry(cur, struct btrfs_device, dev_list); |
358 | if (device->bdev) { | 358 | if (device->bdev) { |
359 | close_bdev_excl(device->bdev); | 359 | close_bdev_exclusive(device->bdev, device->mode); |
360 | fs_devices->open_devices--; | 360 | fs_devices->open_devices--; |
361 | } | 361 | } |
362 | if (device->writeable) { | 362 | if (device->writeable) { |
@@ -391,7 +391,8 @@ int btrfs_close_devices(struct btrfs_fs_devices *fs_devices) | |||
391 | return ret; | 391 | return ret; |
392 | } | 392 | } |
393 | 393 | ||
394 | int __btrfs_open_devices(struct btrfs_fs_devices *fs_devices, void *holder) | 394 | int __btrfs_open_devices(struct btrfs_fs_devices *fs_devices, |
395 | int flags, void *holder) | ||
395 | { | 396 | { |
396 | struct block_device *bdev; | 397 | struct block_device *bdev; |
397 | struct list_head *head = &fs_devices->devices; | 398 | struct list_head *head = &fs_devices->devices; |
@@ -413,7 +414,7 @@ int __btrfs_open_devices(struct btrfs_fs_devices *fs_devices, void *holder) | |||
413 | if (!device->name) | 414 | if (!device->name) |
414 | continue; | 415 | continue; |
415 | 416 | ||
416 | bdev = open_bdev_excl(device->name, MS_RDONLY, holder); | 417 | bdev = open_bdev_exclusive(device->name, flags, holder); |
417 | if (IS_ERR(bdev)) { | 418 | if (IS_ERR(bdev)) { |
418 | printk("open %s failed\n", device->name); | 419 | printk("open %s failed\n", device->name); |
419 | goto error; | 420 | goto error; |
@@ -453,6 +454,8 @@ int __btrfs_open_devices(struct btrfs_fs_devices *fs_devices, void *holder) | |||
453 | 454 | ||
454 | device->bdev = bdev; | 455 | device->bdev = bdev; |
455 | device->in_fs_metadata = 0; | 456 | device->in_fs_metadata = 0; |
457 | device->mode = flags; | ||
458 | |||
456 | fs_devices->open_devices++; | 459 | fs_devices->open_devices++; |
457 | if (device->writeable) { | 460 | if (device->writeable) { |
458 | fs_devices->rw_devices++; | 461 | fs_devices->rw_devices++; |
@@ -464,7 +467,7 @@ int __btrfs_open_devices(struct btrfs_fs_devices *fs_devices, void *holder) | |||
464 | error_brelse: | 467 | error_brelse: |
465 | brelse(bh); | 468 | brelse(bh); |
466 | error_close: | 469 | error_close: |
467 | close_bdev_excl(bdev); | 470 | close_bdev_exclusive(bdev, MS_RDONLY); |
468 | error: | 471 | error: |
469 | continue; | 472 | continue; |
470 | } | 473 | } |
@@ -496,7 +499,7 @@ int btrfs_open_devices(struct btrfs_fs_devices *fs_devices, | |||
496 | ret = 0; | 499 | ret = 0; |
497 | } | 500 | } |
498 | } else { | 501 | } else { |
499 | ret = __btrfs_open_devices(fs_devices, holder); | 502 | ret = __btrfs_open_devices(fs_devices, flags, holder); |
500 | } | 503 | } |
501 | mutex_unlock(&uuid_mutex); | 504 | mutex_unlock(&uuid_mutex); |
502 | return ret; | 505 | return ret; |
@@ -514,7 +517,7 @@ int btrfs_scan_one_device(const char *path, int flags, void *holder, | |||
514 | 517 | ||
515 | mutex_lock(&uuid_mutex); | 518 | mutex_lock(&uuid_mutex); |
516 | 519 | ||
517 | bdev = open_bdev_excl(path, flags, holder); | 520 | bdev = open_bdev_exclusive(path, flags, holder); |
518 | 521 | ||
519 | if (IS_ERR(bdev)) { | 522 | if (IS_ERR(bdev)) { |
520 | ret = PTR_ERR(bdev); | 523 | ret = PTR_ERR(bdev); |
@@ -551,7 +554,7 @@ int btrfs_scan_one_device(const char *path, int flags, void *holder, | |||
551 | error_brelse: | 554 | error_brelse: |
552 | brelse(bh); | 555 | brelse(bh); |
553 | error_close: | 556 | error_close: |
554 | close_bdev_excl(bdev); | 557 | close_bdev_exclusive(bdev, flags); |
555 | error: | 558 | error: |
556 | mutex_unlock(&uuid_mutex); | 559 | mutex_unlock(&uuid_mutex); |
557 | return ret; | 560 | return ret; |
@@ -1003,7 +1006,7 @@ int btrfs_rm_device(struct btrfs_root *root, char *device_path) | |||
1003 | goto out; | 1006 | goto out; |
1004 | } | 1007 | } |
1005 | } else { | 1008 | } else { |
1006 | bdev = open_bdev_excl(device_path, MS_RDONLY, | 1009 | bdev = open_bdev_exclusive(device_path, MS_RDONLY, |
1007 | root->fs_info->bdev_holder); | 1010 | root->fs_info->bdev_holder); |
1008 | if (IS_ERR(bdev)) { | 1011 | if (IS_ERR(bdev)) { |
1009 | ret = PTR_ERR(bdev); | 1012 | ret = PTR_ERR(bdev); |
@@ -1073,10 +1076,10 @@ int btrfs_rm_device(struct btrfs_root *root, char *device_path) | |||
1073 | BUG_ON(device->writeable); | 1076 | BUG_ON(device->writeable); |
1074 | brelse(bh); | 1077 | brelse(bh); |
1075 | if (bdev) | 1078 | if (bdev) |
1076 | close_bdev_excl(bdev); | 1079 | close_bdev_exclusive(bdev, MS_RDONLY); |
1077 | 1080 | ||
1078 | if (device->bdev) { | 1081 | if (device->bdev) { |
1079 | close_bdev_excl(device->bdev); | 1082 | close_bdev_exclusive(device->bdev, device->mode); |
1080 | device->bdev = NULL; | 1083 | device->bdev = NULL; |
1081 | device->fs_devices->open_devices--; | 1084 | device->fs_devices->open_devices--; |
1082 | } | 1085 | } |
@@ -1112,11 +1115,11 @@ int btrfs_rm_device(struct btrfs_root *root, char *device_path) | |||
1112 | 1115 | ||
1113 | if (device->bdev) { | 1116 | if (device->bdev) { |
1114 | /* one close for the device struct or super_block */ | 1117 | /* one close for the device struct or super_block */ |
1115 | close_bdev_excl(device->bdev); | 1118 | close_bdev_exclusive(device->bdev, device->mode); |
1116 | } | 1119 | } |
1117 | if (bdev) { | 1120 | if (bdev) { |
1118 | /* one close for us */ | 1121 | /* one close for us */ |
1119 | close_bdev_excl(bdev); | 1122 | close_bdev_exclusive(bdev, MS_RDONLY); |
1120 | } | 1123 | } |
1121 | kfree(device->name); | 1124 | kfree(device->name); |
1122 | kfree(device); | 1125 | kfree(device); |
@@ -1127,7 +1130,7 @@ error_brelse: | |||
1127 | brelse(bh); | 1130 | brelse(bh); |
1128 | error_close: | 1131 | error_close: |
1129 | if (bdev) | 1132 | if (bdev) |
1130 | close_bdev_excl(bdev); | 1133 | close_bdev_exclusive(bdev, MS_RDONLY); |
1131 | out: | 1134 | out: |
1132 | mutex_unlock(&root->fs_info->volume_mutex); | 1135 | mutex_unlock(&root->fs_info->volume_mutex); |
1133 | mutex_unlock(&uuid_mutex); | 1136 | mutex_unlock(&uuid_mutex); |
@@ -1272,7 +1275,7 @@ int btrfs_init_new_device(struct btrfs_root *root, char *device_path) | |||
1272 | if ((sb->s_flags & MS_RDONLY) && !root->fs_info->fs_devices->seeding) | 1275 | if ((sb->s_flags & MS_RDONLY) && !root->fs_info->fs_devices->seeding) |
1273 | return -EINVAL; | 1276 | return -EINVAL; |
1274 | 1277 | ||
1275 | bdev = open_bdev_excl(device_path, 0, root->fs_info->bdev_holder); | 1278 | bdev = open_bdev_exclusive(device_path, 0, root->fs_info->bdev_holder); |
1276 | if (!bdev) { | 1279 | if (!bdev) { |
1277 | return -EIO; | 1280 | return -EIO; |
1278 | } | 1281 | } |
@@ -1331,6 +1334,7 @@ int btrfs_init_new_device(struct btrfs_root *root, char *device_path) | |||
1331 | device->dev_root = root->fs_info->dev_root; | 1334 | device->dev_root = root->fs_info->dev_root; |
1332 | device->bdev = bdev; | 1335 | device->bdev = bdev; |
1333 | device->in_fs_metadata = 1; | 1336 | device->in_fs_metadata = 1; |
1337 | device->mode = 0; | ||
1334 | set_blocksize(device->bdev, 4096); | 1338 | set_blocksize(device->bdev, 4096); |
1335 | 1339 | ||
1336 | if (seeding_dev) { | 1340 | if (seeding_dev) { |
@@ -1379,7 +1383,7 @@ out: | |||
1379 | mutex_unlock(&root->fs_info->volume_mutex); | 1383 | mutex_unlock(&root->fs_info->volume_mutex); |
1380 | return ret; | 1384 | return ret; |
1381 | error: | 1385 | error: |
1382 | close_bdev_excl(bdev); | 1386 | close_bdev_exclusive(bdev, 0); |
1383 | if (seeding_dev) { | 1387 | if (seeding_dev) { |
1384 | mutex_unlock(&uuid_mutex); | 1388 | mutex_unlock(&uuid_mutex); |
1385 | up_write(&sb->s_umount); | 1389 | up_write(&sb->s_umount); |
@@ -2907,7 +2911,8 @@ static int open_seed_devices(struct btrfs_root *root, u8 *fsid) | |||
2907 | goto out; | 2911 | goto out; |
2908 | } | 2912 | } |
2909 | 2913 | ||
2910 | ret = __btrfs_open_devices(fs_devices, root->fs_info->bdev_holder); | 2914 | ret = __btrfs_open_devices(fs_devices, MS_RDONLY, |
2915 | root->fs_info->bdev_holder); | ||
2911 | if (ret) | 2916 | if (ret) |
2912 | goto out; | 2917 | goto out; |
2913 | 2918 | ||