diff options
Diffstat (limited to 'fs/btrfs/inode-map.c')
-rw-r--r-- | fs/btrfs/inode-map.c | 25 |
1 files changed, 14 insertions, 11 deletions
diff --git a/fs/btrfs/inode-map.c b/fs/btrfs/inode-map.c index ee15d88b33d2..b1a1c929ba80 100644 --- a/fs/btrfs/inode-map.c +++ b/fs/btrfs/inode-map.c | |||
@@ -178,7 +178,7 @@ static void start_caching(struct btrfs_root *root) | |||
178 | 178 | ||
179 | tsk = kthread_run(caching_kthread, root, "btrfs-ino-cache-%llu\n", | 179 | tsk = kthread_run(caching_kthread, root, "btrfs-ino-cache-%llu\n", |
180 | root->root_key.objectid); | 180 | root->root_key.objectid); |
181 | BUG_ON(IS_ERR(tsk)); | 181 | BUG_ON(IS_ERR(tsk)); /* -ENOMEM */ |
182 | } | 182 | } |
183 | 183 | ||
184 | int btrfs_find_free_ino(struct btrfs_root *root, u64 *objectid) | 184 | int btrfs_find_free_ino(struct btrfs_root *root, u64 *objectid) |
@@ -271,7 +271,7 @@ void btrfs_unpin_free_ino(struct btrfs_root *root) | |||
271 | break; | 271 | break; |
272 | 272 | ||
273 | info = rb_entry(n, struct btrfs_free_space, offset_index); | 273 | info = rb_entry(n, struct btrfs_free_space, offset_index); |
274 | BUG_ON(info->bitmap); | 274 | BUG_ON(info->bitmap); /* Logic error */ |
275 | 275 | ||
276 | if (info->offset > root->cache_progress) | 276 | if (info->offset > root->cache_progress) |
277 | goto free; | 277 | goto free; |
@@ -439,17 +439,16 @@ int btrfs_save_ino_cache(struct btrfs_root *root, | |||
439 | if (ret) | 439 | if (ret) |
440 | goto out; | 440 | goto out; |
441 | trace_btrfs_space_reservation(root->fs_info, "ino_cache", | 441 | trace_btrfs_space_reservation(root->fs_info, "ino_cache", |
442 | (u64)(unsigned long)trans, | 442 | trans->transid, trans->bytes_reserved, 1); |
443 | trans->bytes_reserved, 1); | ||
444 | again: | 443 | again: |
445 | inode = lookup_free_ino_inode(root, path); | 444 | inode = lookup_free_ino_inode(root, path); |
446 | if (IS_ERR(inode) && PTR_ERR(inode) != -ENOENT) { | 445 | if (IS_ERR(inode) && (PTR_ERR(inode) != -ENOENT || retry)) { |
447 | ret = PTR_ERR(inode); | 446 | ret = PTR_ERR(inode); |
448 | goto out_release; | 447 | goto out_release; |
449 | } | 448 | } |
450 | 449 | ||
451 | if (IS_ERR(inode)) { | 450 | if (IS_ERR(inode)) { |
452 | BUG_ON(retry); | 451 | BUG_ON(retry); /* Logic error */ |
453 | retry = true; | 452 | retry = true; |
454 | 453 | ||
455 | ret = create_free_ino_inode(root, trans, path); | 454 | ret = create_free_ino_inode(root, trans, path); |
@@ -460,12 +459,17 @@ again: | |||
460 | 459 | ||
461 | BTRFS_I(inode)->generation = 0; | 460 | BTRFS_I(inode)->generation = 0; |
462 | ret = btrfs_update_inode(trans, root, inode); | 461 | ret = btrfs_update_inode(trans, root, inode); |
463 | WARN_ON(ret); | 462 | if (ret) { |
463 | btrfs_abort_transaction(trans, root, ret); | ||
464 | goto out_put; | ||
465 | } | ||
464 | 466 | ||
465 | if (i_size_read(inode) > 0) { | 467 | if (i_size_read(inode) > 0) { |
466 | ret = btrfs_truncate_free_space_cache(root, trans, path, inode); | 468 | ret = btrfs_truncate_free_space_cache(root, trans, path, inode); |
467 | if (ret) | 469 | if (ret) { |
470 | btrfs_abort_transaction(trans, root, ret); | ||
468 | goto out_put; | 471 | goto out_put; |
472 | } | ||
469 | } | 473 | } |
470 | 474 | ||
471 | spin_lock(&root->cache_lock); | 475 | spin_lock(&root->cache_lock); |
@@ -502,8 +506,7 @@ out_put: | |||
502 | iput(inode); | 506 | iput(inode); |
503 | out_release: | 507 | out_release: |
504 | trace_btrfs_space_reservation(root->fs_info, "ino_cache", | 508 | trace_btrfs_space_reservation(root->fs_info, "ino_cache", |
505 | (u64)(unsigned long)trans, | 509 | trans->transid, trans->bytes_reserved, 0); |
506 | trans->bytes_reserved, 0); | ||
507 | btrfs_block_rsv_release(root, trans->block_rsv, trans->bytes_reserved); | 510 | btrfs_block_rsv_release(root, trans->block_rsv, trans->bytes_reserved); |
508 | out: | 511 | out: |
509 | trans->block_rsv = rsv; | 512 | trans->block_rsv = rsv; |
@@ -532,7 +535,7 @@ static int btrfs_find_highest_objectid(struct btrfs_root *root, u64 *objectid) | |||
532 | ret = btrfs_search_slot(NULL, root, &search_key, path, 0, 0); | 535 | ret = btrfs_search_slot(NULL, root, &search_key, path, 0, 0); |
533 | if (ret < 0) | 536 | if (ret < 0) |
534 | goto error; | 537 | goto error; |
535 | BUG_ON(ret == 0); | 538 | BUG_ON(ret == 0); /* Corruption */ |
536 | if (path->slots[0] > 0) { | 539 | if (path->slots[0] > 0) { |
537 | slot = path->slots[0] - 1; | 540 | slot = path->slots[0] - 1; |
538 | l = path->nodes[0]; | 541 | l = path->nodes[0]; |