diff options
Diffstat (limited to 'fs/btrfs/volumes.c')
-rw-r--r-- | fs/btrfs/volumes.c | 34 |
1 files changed, 29 insertions, 5 deletions
diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c index d158530233b7..dd13eb81ee40 100644 --- a/fs/btrfs/volumes.c +++ b/fs/btrfs/volumes.c | |||
@@ -1213,6 +1213,10 @@ static int btrfs_rm_dev_item(struct btrfs_root *root, | |||
1213 | return -ENOMEM; | 1213 | return -ENOMEM; |
1214 | 1214 | ||
1215 | trans = btrfs_start_transaction(root, 0); | 1215 | trans = btrfs_start_transaction(root, 0); |
1216 | if (IS_ERR(trans)) { | ||
1217 | btrfs_free_path(path); | ||
1218 | return PTR_ERR(trans); | ||
1219 | } | ||
1216 | key.objectid = BTRFS_DEV_ITEMS_OBJECTID; | 1220 | key.objectid = BTRFS_DEV_ITEMS_OBJECTID; |
1217 | key.type = BTRFS_DEV_ITEM_KEY; | 1221 | key.type = BTRFS_DEV_ITEM_KEY; |
1218 | key.offset = device->devid; | 1222 | key.offset = device->devid; |
@@ -1334,11 +1338,11 @@ int btrfs_rm_device(struct btrfs_root *root, char *device_path) | |||
1334 | 1338 | ||
1335 | ret = btrfs_shrink_device(device, 0); | 1339 | ret = btrfs_shrink_device(device, 0); |
1336 | if (ret) | 1340 | if (ret) |
1337 | goto error_brelse; | 1341 | goto error_undo; |
1338 | 1342 | ||
1339 | ret = btrfs_rm_dev_item(root->fs_info->chunk_root, device); | 1343 | ret = btrfs_rm_dev_item(root->fs_info->chunk_root, device); |
1340 | if (ret) | 1344 | if (ret) |
1341 | goto error_brelse; | 1345 | goto error_undo; |
1342 | 1346 | ||
1343 | device->in_fs_metadata = 0; | 1347 | device->in_fs_metadata = 0; |
1344 | 1348 | ||
@@ -1412,6 +1416,13 @@ out: | |||
1412 | mutex_unlock(&root->fs_info->volume_mutex); | 1416 | mutex_unlock(&root->fs_info->volume_mutex); |
1413 | mutex_unlock(&uuid_mutex); | 1417 | mutex_unlock(&uuid_mutex); |
1414 | return ret; | 1418 | return ret; |
1419 | error_undo: | ||
1420 | if (device->writeable) { | ||
1421 | list_add(&device->dev_alloc_list, | ||
1422 | &root->fs_info->fs_devices->alloc_list); | ||
1423 | root->fs_info->fs_devices->rw_devices++; | ||
1424 | } | ||
1425 | goto error_brelse; | ||
1415 | } | 1426 | } |
1416 | 1427 | ||
1417 | /* | 1428 | /* |
@@ -1601,11 +1612,19 @@ int btrfs_init_new_device(struct btrfs_root *root, char *device_path) | |||
1601 | 1612 | ||
1602 | ret = find_next_devid(root, &device->devid); | 1613 | ret = find_next_devid(root, &device->devid); |
1603 | if (ret) { | 1614 | if (ret) { |
1615 | kfree(device->name); | ||
1604 | kfree(device); | 1616 | kfree(device); |
1605 | goto error; | 1617 | goto error; |
1606 | } | 1618 | } |
1607 | 1619 | ||
1608 | trans = btrfs_start_transaction(root, 0); | 1620 | trans = btrfs_start_transaction(root, 0); |
1621 | if (IS_ERR(trans)) { | ||
1622 | kfree(device->name); | ||
1623 | kfree(device); | ||
1624 | ret = PTR_ERR(trans); | ||
1625 | goto error; | ||
1626 | } | ||
1627 | |||
1609 | lock_chunks(root); | 1628 | lock_chunks(root); |
1610 | 1629 | ||
1611 | device->writeable = 1; | 1630 | device->writeable = 1; |
@@ -1621,7 +1640,7 @@ int btrfs_init_new_device(struct btrfs_root *root, char *device_path) | |||
1621 | device->dev_root = root->fs_info->dev_root; | 1640 | device->dev_root = root->fs_info->dev_root; |
1622 | device->bdev = bdev; | 1641 | device->bdev = bdev; |
1623 | device->in_fs_metadata = 1; | 1642 | device->in_fs_metadata = 1; |
1624 | device->mode = 0; | 1643 | device->mode = FMODE_EXCL; |
1625 | set_blocksize(device->bdev, 4096); | 1644 | set_blocksize(device->bdev, 4096); |
1626 | 1645 | ||
1627 | if (seeding_dev) { | 1646 | if (seeding_dev) { |
@@ -1873,7 +1892,7 @@ static int btrfs_relocate_chunk(struct btrfs_root *root, | |||
1873 | return ret; | 1892 | return ret; |
1874 | 1893 | ||
1875 | trans = btrfs_start_transaction(root, 0); | 1894 | trans = btrfs_start_transaction(root, 0); |
1876 | BUG_ON(!trans); | 1895 | BUG_ON(IS_ERR(trans)); |
1877 | 1896 | ||
1878 | lock_chunks(root); | 1897 | lock_chunks(root); |
1879 | 1898 | ||
@@ -2047,7 +2066,7 @@ int btrfs_balance(struct btrfs_root *dev_root) | |||
2047 | BUG_ON(ret); | 2066 | BUG_ON(ret); |
2048 | 2067 | ||
2049 | trans = btrfs_start_transaction(dev_root, 0); | 2068 | trans = btrfs_start_transaction(dev_root, 0); |
2050 | BUG_ON(!trans); | 2069 | BUG_ON(IS_ERR(trans)); |
2051 | 2070 | ||
2052 | ret = btrfs_grow_device(trans, device, old_size); | 2071 | ret = btrfs_grow_device(trans, device, old_size); |
2053 | BUG_ON(ret); | 2072 | BUG_ON(ret); |
@@ -2213,6 +2232,11 @@ again: | |||
2213 | 2232 | ||
2214 | /* Shrinking succeeded, else we would be at "done". */ | 2233 | /* Shrinking succeeded, else we would be at "done". */ |
2215 | trans = btrfs_start_transaction(root, 0); | 2234 | trans = btrfs_start_transaction(root, 0); |
2235 | if (IS_ERR(trans)) { | ||
2236 | ret = PTR_ERR(trans); | ||
2237 | goto done; | ||
2238 | } | ||
2239 | |||
2216 | lock_chunks(root); | 2240 | lock_chunks(root); |
2217 | 2241 | ||
2218 | device->disk_total_bytes = new_size; | 2242 | device->disk_total_bytes = new_size; |