diff options
| -rw-r--r-- | fs/btrfs/acl.c | 6 | ||||
| -rw-r--r-- | fs/btrfs/compression.c | 27 | ||||
| -rw-r--r-- | fs/btrfs/disk-io.c | 7 | ||||
| -rw-r--r-- | fs/btrfs/export.c | 2 | ||||
| -rw-r--r-- | fs/btrfs/extent-tree.c | 98 | ||||
| -rw-r--r-- | fs/btrfs/extent_io.c | 6 | ||||
| -rw-r--r-- | fs/btrfs/file-item.c | 5 | ||||
| -rw-r--r-- | fs/btrfs/file.c | 20 | ||||
| -rw-r--r-- | fs/btrfs/free-space-cache.c | 162 | ||||
| -rw-r--r-- | fs/btrfs/inode.c | 35 | ||||
| -rw-r--r-- | fs/btrfs/ioctl.c | 19 | ||||
| -rw-r--r-- | fs/btrfs/ordered-data.c | 2 | ||||
| -rw-r--r-- | fs/btrfs/print-tree.c | 1 | ||||
| -rw-r--r-- | fs/btrfs/relocation.c | 29 | ||||
| -rw-r--r-- | fs/btrfs/super.c | 9 | ||||
| -rw-r--r-- | fs/btrfs/transaction.c | 5 | ||||
| -rw-r--r-- | fs/btrfs/tree-log.c | 35 | ||||
| -rw-r--r-- | fs/btrfs/volumes.c | 19 |
18 files changed, 371 insertions, 116 deletions
diff --git a/fs/btrfs/acl.c b/fs/btrfs/acl.c index 15b5ca2a2606..9c949348510b 100644 --- a/fs/btrfs/acl.c +++ b/fs/btrfs/acl.c | |||
| @@ -37,6 +37,9 @@ static struct posix_acl *btrfs_get_acl(struct inode *inode, int type) | |||
| 37 | char *value = NULL; | 37 | char *value = NULL; |
| 38 | struct posix_acl *acl; | 38 | struct posix_acl *acl; |
| 39 | 39 | ||
| 40 | if (!IS_POSIXACL(inode)) | ||
| 41 | return NULL; | ||
| 42 | |||
| 40 | acl = get_cached_acl(inode, type); | 43 | acl = get_cached_acl(inode, type); |
| 41 | if (acl != ACL_NOT_CACHED) | 44 | if (acl != ACL_NOT_CACHED) |
| 42 | return acl; | 45 | return acl; |
| @@ -84,6 +87,9 @@ static int btrfs_xattr_acl_get(struct dentry *dentry, const char *name, | |||
| 84 | struct posix_acl *acl; | 87 | struct posix_acl *acl; |
| 85 | int ret = 0; | 88 | int ret = 0; |
| 86 | 89 | ||
| 90 | if (!IS_POSIXACL(dentry->d_inode)) | ||
| 91 | return -EOPNOTSUPP; | ||
| 92 | |||
| 87 | acl = btrfs_get_acl(dentry->d_inode, type); | 93 | acl = btrfs_get_acl(dentry->d_inode, type); |
| 88 | 94 | ||
| 89 | if (IS_ERR(acl)) | 95 | if (IS_ERR(acl)) |
diff --git a/fs/btrfs/compression.c b/fs/btrfs/compression.c index f745287fbf2e..4d2110eafe29 100644 --- a/fs/btrfs/compression.c +++ b/fs/btrfs/compression.c | |||
| @@ -562,7 +562,7 @@ int btrfs_submit_compressed_read(struct inode *inode, struct bio *bio, | |||
| 562 | u64 em_len; | 562 | u64 em_len; |
| 563 | u64 em_start; | 563 | u64 em_start; |
| 564 | struct extent_map *em; | 564 | struct extent_map *em; |
| 565 | int ret; | 565 | int ret = -ENOMEM; |
| 566 | u32 *sums; | 566 | u32 *sums; |
| 567 | 567 | ||
| 568 | tree = &BTRFS_I(inode)->io_tree; | 568 | tree = &BTRFS_I(inode)->io_tree; |
| @@ -577,6 +577,9 @@ int btrfs_submit_compressed_read(struct inode *inode, struct bio *bio, | |||
| 577 | 577 | ||
| 578 | compressed_len = em->block_len; | 578 | compressed_len = em->block_len; |
| 579 | cb = kmalloc(compressed_bio_size(root, compressed_len), GFP_NOFS); | 579 | cb = kmalloc(compressed_bio_size(root, compressed_len), GFP_NOFS); |
| 580 | if (!cb) | ||
| 581 | goto out; | ||
| 582 | |||
| 580 | atomic_set(&cb->pending_bios, 0); | 583 | atomic_set(&cb->pending_bios, 0); |
| 581 | cb->errors = 0; | 584 | cb->errors = 0; |
| 582 | cb->inode = inode; | 585 | cb->inode = inode; |
| @@ -597,13 +600,18 @@ int btrfs_submit_compressed_read(struct inode *inode, struct bio *bio, | |||
| 597 | 600 | ||
| 598 | nr_pages = (compressed_len + PAGE_CACHE_SIZE - 1) / | 601 | nr_pages = (compressed_len + PAGE_CACHE_SIZE - 1) / |
| 599 | PAGE_CACHE_SIZE; | 602 | PAGE_CACHE_SIZE; |
| 600 | cb->compressed_pages = kmalloc(sizeof(struct page *) * nr_pages, | 603 | cb->compressed_pages = kzalloc(sizeof(struct page *) * nr_pages, |
| 601 | GFP_NOFS); | 604 | GFP_NOFS); |
| 605 | if (!cb->compressed_pages) | ||
| 606 | goto fail1; | ||
| 607 | |||
| 602 | bdev = BTRFS_I(inode)->root->fs_info->fs_devices->latest_bdev; | 608 | bdev = BTRFS_I(inode)->root->fs_info->fs_devices->latest_bdev; |
| 603 | 609 | ||
| 604 | for (page_index = 0; page_index < nr_pages; page_index++) { | 610 | for (page_index = 0; page_index < nr_pages; page_index++) { |
| 605 | cb->compressed_pages[page_index] = alloc_page(GFP_NOFS | | 611 | cb->compressed_pages[page_index] = alloc_page(GFP_NOFS | |
| 606 | __GFP_HIGHMEM); | 612 | __GFP_HIGHMEM); |
| 613 | if (!cb->compressed_pages[page_index]) | ||
| 614 | goto fail2; | ||
| 607 | } | 615 | } |
| 608 | cb->nr_pages = nr_pages; | 616 | cb->nr_pages = nr_pages; |
| 609 | 617 | ||
| @@ -614,6 +622,8 @@ int btrfs_submit_compressed_read(struct inode *inode, struct bio *bio, | |||
| 614 | cb->len = uncompressed_len; | 622 | cb->len = uncompressed_len; |
| 615 | 623 | ||
| 616 | comp_bio = compressed_bio_alloc(bdev, cur_disk_byte, GFP_NOFS); | 624 | comp_bio = compressed_bio_alloc(bdev, cur_disk_byte, GFP_NOFS); |
| 625 | if (!comp_bio) | ||
| 626 | goto fail2; | ||
| 617 | comp_bio->bi_private = cb; | 627 | comp_bio->bi_private = cb; |
| 618 | comp_bio->bi_end_io = end_compressed_bio_read; | 628 | comp_bio->bi_end_io = end_compressed_bio_read; |
| 619 | atomic_inc(&cb->pending_bios); | 629 | atomic_inc(&cb->pending_bios); |
| @@ -681,6 +691,17 @@ int btrfs_submit_compressed_read(struct inode *inode, struct bio *bio, | |||
| 681 | 691 | ||
| 682 | bio_put(comp_bio); | 692 | bio_put(comp_bio); |
| 683 | return 0; | 693 | return 0; |
| 694 | |||
| 695 | fail2: | ||
| 696 | for (page_index = 0; page_index < nr_pages; page_index++) | ||
| 697 | free_page((unsigned long)cb->compressed_pages[page_index]); | ||
| 698 | |||
| 699 | kfree(cb->compressed_pages); | ||
| 700 | fail1: | ||
| 701 | kfree(cb); | ||
| 702 | out: | ||
| 703 | free_extent_map(em); | ||
| 704 | return ret; | ||
| 684 | } | 705 | } |
| 685 | 706 | ||
| 686 | static struct list_head comp_idle_workspace[BTRFS_COMPRESS_TYPES]; | 707 | static struct list_head comp_idle_workspace[BTRFS_COMPRESS_TYPES]; |
| @@ -900,7 +921,7 @@ int btrfs_decompress(int type, unsigned char *data_in, struct page *dest_page, | |||
| 900 | return ret; | 921 | return ret; |
| 901 | } | 922 | } |
| 902 | 923 | ||
| 903 | void __exit btrfs_exit_compress(void) | 924 | void btrfs_exit_compress(void) |
| 904 | { | 925 | { |
| 905 | free_workspaces(); | 926 | free_workspaces(); |
| 906 | } | 927 | } |
diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c index b531c36455d8..fdce8799b98d 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c | |||
| @@ -1550,6 +1550,7 @@ static int transaction_kthread(void *arg) | |||
| 1550 | spin_unlock(&root->fs_info->new_trans_lock); | 1550 | spin_unlock(&root->fs_info->new_trans_lock); |
| 1551 | 1551 | ||
| 1552 | trans = btrfs_join_transaction(root, 1); | 1552 | trans = btrfs_join_transaction(root, 1); |
| 1553 | BUG_ON(IS_ERR(trans)); | ||
| 1553 | if (transid == trans->transid) { | 1554 | if (transid == trans->transid) { |
| 1554 | ret = btrfs_commit_transaction(trans, root); | 1555 | ret = btrfs_commit_transaction(trans, root); |
| 1555 | BUG_ON(ret); | 1556 | BUG_ON(ret); |
| @@ -2453,10 +2454,14 @@ int btrfs_commit_super(struct btrfs_root *root) | |||
| 2453 | up_write(&root->fs_info->cleanup_work_sem); | 2454 | up_write(&root->fs_info->cleanup_work_sem); |
| 2454 | 2455 | ||
| 2455 | trans = btrfs_join_transaction(root, 1); | 2456 | trans = btrfs_join_transaction(root, 1); |
| 2457 | if (IS_ERR(trans)) | ||
| 2458 | return PTR_ERR(trans); | ||
| 2456 | ret = btrfs_commit_transaction(trans, root); | 2459 | ret = btrfs_commit_transaction(trans, root); |
| 2457 | BUG_ON(ret); | 2460 | BUG_ON(ret); |
| 2458 | /* run commit again to drop the original snapshot */ | 2461 | /* run commit again to drop the original snapshot */ |
| 2459 | trans = btrfs_join_transaction(root, 1); | 2462 | trans = btrfs_join_transaction(root, 1); |
| 2463 | if (IS_ERR(trans)) | ||
| 2464 | return PTR_ERR(trans); | ||
| 2460 | btrfs_commit_transaction(trans, root); | 2465 | btrfs_commit_transaction(trans, root); |
| 2461 | ret = btrfs_write_and_wait_transaction(NULL, root); | 2466 | ret = btrfs_write_and_wait_transaction(NULL, root); |
| 2462 | BUG_ON(ret); | 2467 | BUG_ON(ret); |
| @@ -2554,6 +2559,8 @@ int close_ctree(struct btrfs_root *root) | |||
| 2554 | kfree(fs_info->chunk_root); | 2559 | kfree(fs_info->chunk_root); |
| 2555 | kfree(fs_info->dev_root); | 2560 | kfree(fs_info->dev_root); |
| 2556 | kfree(fs_info->csum_root); | 2561 | kfree(fs_info->csum_root); |
| 2562 | kfree(fs_info); | ||
| 2563 | |||
| 2557 | return 0; | 2564 | return 0; |
| 2558 | } | 2565 | } |
| 2559 | 2566 | ||
diff --git a/fs/btrfs/export.c b/fs/btrfs/export.c index 9786963b07e5..ff27d7a477b2 100644 --- a/fs/btrfs/export.c +++ b/fs/btrfs/export.c | |||
| @@ -171,6 +171,8 @@ static struct dentry *btrfs_get_parent(struct dentry *child) | |||
| 171 | int ret; | 171 | int ret; |
| 172 | 172 | ||
| 173 | path = btrfs_alloc_path(); | 173 | path = btrfs_alloc_path(); |
| 174 | if (!path) | ||
| 175 | return ERR_PTR(-ENOMEM); | ||
| 174 | 176 | ||
| 175 | if (dir->i_ino == BTRFS_FIRST_FREE_OBJECTID) { | 177 | if (dir->i_ino == BTRFS_FIRST_FREE_OBJECTID) { |
| 176 | key.objectid = root->root_key.objectid; | 178 | key.objectid = root->root_key.objectid; |
diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c index b55269340cec..4e7e012ad667 100644 --- a/fs/btrfs/extent-tree.c +++ b/fs/btrfs/extent-tree.c | |||
| @@ -320,11 +320,6 @@ static int caching_kthread(void *data) | |||
| 320 | if (!path) | 320 | if (!path) |
| 321 | return -ENOMEM; | 321 | return -ENOMEM; |
| 322 | 322 | ||
| 323 | exclude_super_stripes(extent_root, block_group); | ||
| 324 | spin_lock(&block_group->space_info->lock); | ||
| 325 | block_group->space_info->bytes_readonly += block_group->bytes_super; | ||
| 326 | spin_unlock(&block_group->space_info->lock); | ||
| 327 | |||
| 328 | last = max_t(u64, block_group->key.objectid, BTRFS_SUPER_INFO_OFFSET); | 323 | last = max_t(u64, block_group->key.objectid, BTRFS_SUPER_INFO_OFFSET); |
| 329 | 324 | ||
| 330 | /* | 325 | /* |
| @@ -467,8 +462,10 @@ static int cache_block_group(struct btrfs_block_group_cache *cache, | |||
| 467 | cache->cached = BTRFS_CACHE_NO; | 462 | cache->cached = BTRFS_CACHE_NO; |
| 468 | } | 463 | } |
| 469 | spin_unlock(&cache->lock); | 464 | spin_unlock(&cache->lock); |
| 470 | if (ret == 1) | 465 | if (ret == 1) { |
| 466 | free_excluded_extents(fs_info->extent_root, cache); | ||
| 471 | return 0; | 467 | return 0; |
| 468 | } | ||
| 472 | } | 469 | } |
| 473 | 470 | ||
| 474 | if (load_cache_only) | 471 | if (load_cache_only) |
| @@ -3344,8 +3341,10 @@ static int shrink_delalloc(struct btrfs_trans_handle *trans, | |||
| 3344 | u64 reserved; | 3341 | u64 reserved; |
| 3345 | u64 max_reclaim; | 3342 | u64 max_reclaim; |
| 3346 | u64 reclaimed = 0; | 3343 | u64 reclaimed = 0; |
| 3344 | long time_left; | ||
| 3347 | int pause = 1; | 3345 | int pause = 1; |
| 3348 | int nr_pages = (2 * 1024 * 1024) >> PAGE_CACHE_SHIFT; | 3346 | int nr_pages = (2 * 1024 * 1024) >> PAGE_CACHE_SHIFT; |
| 3347 | int loops = 0; | ||
| 3349 | 3348 | ||
| 3350 | block_rsv = &root->fs_info->delalloc_block_rsv; | 3349 | block_rsv = &root->fs_info->delalloc_block_rsv; |
| 3351 | space_info = block_rsv->space_info; | 3350 | space_info = block_rsv->space_info; |
| @@ -3358,7 +3357,7 @@ static int shrink_delalloc(struct btrfs_trans_handle *trans, | |||
| 3358 | 3357 | ||
| 3359 | max_reclaim = min(reserved, to_reclaim); | 3358 | max_reclaim = min(reserved, to_reclaim); |
| 3360 | 3359 | ||
| 3361 | while (1) { | 3360 | while (loops < 1024) { |
| 3362 | /* have the flusher threads jump in and do some IO */ | 3361 | /* have the flusher threads jump in and do some IO */ |
| 3363 | smp_mb(); | 3362 | smp_mb(); |
| 3364 | nr_pages = min_t(unsigned long, nr_pages, | 3363 | nr_pages = min_t(unsigned long, nr_pages, |
| @@ -3366,8 +3365,12 @@ static int shrink_delalloc(struct btrfs_trans_handle *trans, | |||
| 3366 | writeback_inodes_sb_nr_if_idle(root->fs_info->sb, nr_pages); | 3365 | writeback_inodes_sb_nr_if_idle(root->fs_info->sb, nr_pages); |
| 3367 | 3366 | ||
| 3368 | spin_lock(&space_info->lock); | 3367 | spin_lock(&space_info->lock); |
| 3369 | if (reserved > space_info->bytes_reserved) | 3368 | if (reserved > space_info->bytes_reserved) { |
| 3369 | loops = 0; | ||
| 3370 | reclaimed += reserved - space_info->bytes_reserved; | 3370 | reclaimed += reserved - space_info->bytes_reserved; |
| 3371 | } else { | ||
| 3372 | loops++; | ||
| 3373 | } | ||
| 3371 | reserved = space_info->bytes_reserved; | 3374 | reserved = space_info->bytes_reserved; |
| 3372 | spin_unlock(&space_info->lock); | 3375 | spin_unlock(&space_info->lock); |
| 3373 | 3376 | ||
| @@ -3378,7 +3381,12 @@ static int shrink_delalloc(struct btrfs_trans_handle *trans, | |||
| 3378 | return -EAGAIN; | 3381 | return -EAGAIN; |
| 3379 | 3382 | ||
| 3380 | __set_current_state(TASK_INTERRUPTIBLE); | 3383 | __set_current_state(TASK_INTERRUPTIBLE); |
| 3381 | schedule_timeout(pause); | 3384 | time_left = schedule_timeout(pause); |
| 3385 | |||
| 3386 | /* We were interrupted, exit */ | ||
| 3387 | if (time_left) | ||
| 3388 | break; | ||
| 3389 | |||
| 3382 | pause <<= 1; | 3390 | pause <<= 1; |
| 3383 | if (pause > HZ / 10) | 3391 | if (pause > HZ / 10) |
| 3384 | pause = HZ / 10; | 3392 | pause = HZ / 10; |
| @@ -3588,8 +3596,20 @@ void block_rsv_release_bytes(struct btrfs_block_rsv *block_rsv, | |||
| 3588 | 3596 | ||
| 3589 | if (num_bytes > 0) { | 3597 | if (num_bytes > 0) { |
| 3590 | if (dest) { | 3598 | if (dest) { |
| 3591 | block_rsv_add_bytes(dest, num_bytes, 0); | 3599 | spin_lock(&dest->lock); |
| 3592 | } else { | 3600 | if (!dest->full) { |
| 3601 | u64 bytes_to_add; | ||
| 3602 | |||
| 3603 | bytes_to_add = dest->size - dest->reserved; | ||
| 3604 | bytes_to_add = min(num_bytes, bytes_to_add); | ||
| 3605 | dest->reserved += bytes_to_add; | ||
| 3606 | if (dest->reserved >= dest->size) | ||
| 3607 | dest->full = 1; | ||
| 3608 | num_bytes -= bytes_to_add; | ||
| 3609 | } | ||
| 3610 | spin_unlock(&dest->lock); | ||
| 3611 | } | ||
| 3612 | if (num_bytes) { | ||
| 3593 | spin_lock(&space_info->lock); | 3613 | spin_lock(&space_info->lock); |
| 3594 | space_info->bytes_reserved -= num_bytes; | 3614 | space_info->bytes_reserved -= num_bytes; |
| 3595 | spin_unlock(&space_info->lock); | 3615 | spin_unlock(&space_info->lock); |
| @@ -4012,6 +4032,7 @@ void btrfs_delalloc_release_metadata(struct inode *inode, u64 num_bytes) | |||
| 4012 | 4032 | ||
| 4013 | num_bytes = ALIGN(num_bytes, root->sectorsize); | 4033 | num_bytes = ALIGN(num_bytes, root->sectorsize); |
| 4014 | atomic_dec(&BTRFS_I(inode)->outstanding_extents); | 4034 | atomic_dec(&BTRFS_I(inode)->outstanding_extents); |
| 4035 | WARN_ON(atomic_read(&BTRFS_I(inode)->outstanding_extents) < 0); | ||
| 4015 | 4036 | ||
| 4016 | spin_lock(&BTRFS_I(inode)->accounting_lock); | 4037 | spin_lock(&BTRFS_I(inode)->accounting_lock); |
| 4017 | nr_extents = atomic_read(&BTRFS_I(inode)->outstanding_extents); | 4038 | nr_extents = atomic_read(&BTRFS_I(inode)->outstanding_extents); |
| @@ -5633,6 +5654,7 @@ use_block_rsv(struct btrfs_trans_handle *trans, | |||
| 5633 | struct btrfs_root *root, u32 blocksize) | 5654 | struct btrfs_root *root, u32 blocksize) |
| 5634 | { | 5655 | { |
| 5635 | struct btrfs_block_rsv *block_rsv; | 5656 | struct btrfs_block_rsv *block_rsv; |
| 5657 | struct btrfs_block_rsv *global_rsv = &root->fs_info->global_block_rsv; | ||
| 5636 | int ret; | 5658 | int ret; |
| 5637 | 5659 | ||
| 5638 | block_rsv = get_block_rsv(trans, root); | 5660 | block_rsv = get_block_rsv(trans, root); |
| @@ -5640,14 +5662,39 @@ use_block_rsv(struct btrfs_trans_handle *trans, | |||
| 5640 | if (block_rsv->size == 0) { | 5662 | if (block_rsv->size == 0) { |
| 5641 | ret = reserve_metadata_bytes(trans, root, block_rsv, | 5663 | ret = reserve_metadata_bytes(trans, root, block_rsv, |
| 5642 | blocksize, 0); | 5664 | blocksize, 0); |
| 5643 | if (ret) | 5665 | /* |
| 5666 | * If we couldn't reserve metadata bytes try and use some from | ||
| 5667 | * the global reserve. | ||
| 5668 | */ | ||
| 5669 | if (ret && block_rsv != global_rsv) { | ||
| 5670 | ret = block_rsv_use_bytes(global_rsv, blocksize); | ||
| 5671 | if (!ret) | ||
| 5672 | return global_rsv; | ||
| 5673 | return ERR_PTR(ret); | ||
| 5674 | } else if (ret) { | ||
| 5644 | return ERR_PTR(ret); | 5675 | return ERR_PTR(ret); |
| 5676 | } | ||
| 5645 | return block_rsv; | 5677 | return block_rsv; |
| 5646 | } | 5678 | } |
| 5647 | 5679 | ||
| 5648 | ret = block_rsv_use_bytes(block_rsv, blocksize); | 5680 | ret = block_rsv_use_bytes(block_rsv, blocksize); |
| 5649 | if (!ret) | 5681 | if (!ret) |
| 5650 | return block_rsv; | 5682 | return block_rsv; |
| 5683 | if (ret) { | ||
| 5684 | WARN_ON(1); | ||
| 5685 | ret = reserve_metadata_bytes(trans, root, block_rsv, blocksize, | ||
| 5686 | 0); | ||
| 5687 | if (!ret) { | ||
| 5688 | spin_lock(&block_rsv->lock); | ||
| 5689 | block_rsv->size += blocksize; | ||
| 5690 | spin_unlock(&block_rsv->lock); | ||
| 5691 | return block_rsv; | ||
| 5692 | } else if (ret && block_rsv != global_rsv) { | ||
| 5693 | ret = block_rsv_use_bytes(global_rsv, blocksize); | ||
| 5694 | if (!ret) | ||
| 5695 | return global_rsv; | ||
| 5696 | } | ||
| 5697 | } | ||
| 5651 | 5698 | ||
| 5652 | return ERR_PTR(-ENOSPC); | 5699 | return ERR_PTR(-ENOSPC); |
| 5653 | } | 5700 | } |
| @@ -6221,6 +6268,8 @@ int btrfs_drop_snapshot(struct btrfs_root *root, | |||
| 6221 | BUG_ON(!wc); | 6268 | BUG_ON(!wc); |
| 6222 | 6269 | ||
| 6223 | trans = btrfs_start_transaction(tree_root, 0); | 6270 | trans = btrfs_start_transaction(tree_root, 0); |
| 6271 | BUG_ON(IS_ERR(trans)); | ||
| 6272 | |||
| 6224 | if (block_rsv) | 6273 | if (block_rsv) |
| 6225 | trans->block_rsv = block_rsv; | 6274 | trans->block_rsv = block_rsv; |
| 6226 | 6275 | ||
| @@ -6318,6 +6367,7 @@ int btrfs_drop_snapshot(struct btrfs_root *root, | |||
| 6318 | 6367 | ||
| 6319 | btrfs_end_transaction_throttle(trans, tree_root); | 6368 | btrfs_end_transaction_throttle(trans, tree_root); |
| 6320 | trans = btrfs_start_transaction(tree_root, 0); | 6369 | trans = btrfs_start_transaction(tree_root, 0); |
| 6370 | BUG_ON(IS_ERR(trans)); | ||
| 6321 | if (block_rsv) | 6371 | if (block_rsv) |
| 6322 | trans->block_rsv = block_rsv; | 6372 | trans->block_rsv = block_rsv; |
| 6323 | } | 6373 | } |
| @@ -6446,6 +6496,8 @@ static noinline int relocate_inode_pages(struct inode *inode, u64 start, | |||
| 6446 | int ret = 0; | 6496 | int ret = 0; |
| 6447 | 6497 | ||
| 6448 | ra = kzalloc(sizeof(*ra), GFP_NOFS); | 6498 | ra = kzalloc(sizeof(*ra), GFP_NOFS); |
| 6499 | if (!ra) | ||
| 6500 | return -ENOMEM; | ||
| 6449 | 6501 | ||
| 6450 | mutex_lock(&inode->i_mutex); | 6502 | mutex_lock(&inode->i_mutex); |
| 6451 | first_index = start >> PAGE_CACHE_SHIFT; | 6503 | first_index = start >> PAGE_CACHE_SHIFT; |
| @@ -7477,7 +7529,7 @@ int btrfs_drop_dead_reloc_roots(struct btrfs_root *root) | |||
| 7477 | BUG_ON(reloc_root->commit_root != NULL); | 7529 | BUG_ON(reloc_root->commit_root != NULL); |
| 7478 | while (1) { | 7530 | while (1) { |
| 7479 | trans = btrfs_join_transaction(root, 1); | 7531 | trans = btrfs_join_transaction(root, 1); |
| 7480 | BUG_ON(!trans); | 7532 | BUG_ON(IS_ERR(trans)); |
| 7481 | 7533 | ||
| 7482 | mutex_lock(&root->fs_info->drop_mutex); | 7534 | mutex_lock(&root->fs_info->drop_mutex); |
| 7483 | ret = btrfs_drop_snapshot(trans, reloc_root); | 7535 | ret = btrfs_drop_snapshot(trans, reloc_root); |
| @@ -7535,7 +7587,7 @@ int btrfs_cleanup_reloc_trees(struct btrfs_root *root) | |||
| 7535 | 7587 | ||
| 7536 | if (found) { | 7588 | if (found) { |
| 7537 | trans = btrfs_start_transaction(root, 1); | 7589 | trans = btrfs_start_transaction(root, 1); |
| 7538 | BUG_ON(!trans); | 7590 | BUG_ON(IS_ERR(trans)); |
| 7539 | ret = btrfs_commit_transaction(trans, root); | 7591 | ret = btrfs_commit_transaction(trans, root); |
| 7540 | BUG_ON(ret); | 7592 | BUG_ON(ret); |
| 7541 | } | 7593 | } |
| @@ -7779,7 +7831,7 @@ static noinline int relocate_one_extent(struct btrfs_root *extent_root, | |||
| 7779 | 7831 | ||
| 7780 | 7832 | ||
| 7781 | trans = btrfs_start_transaction(extent_root, 1); | 7833 | trans = btrfs_start_transaction(extent_root, 1); |
| 7782 | BUG_ON(!trans); | 7834 | BUG_ON(IS_ERR(trans)); |
| 7783 | 7835 | ||
| 7784 | if (extent_key->objectid == 0) { | 7836 | if (extent_key->objectid == 0) { |
| 7785 | ret = del_extent_zero(trans, extent_root, path, extent_key); | 7837 | ret = del_extent_zero(trans, extent_root, path, extent_key); |
| @@ -8270,6 +8322,13 @@ int btrfs_free_block_groups(struct btrfs_fs_info *info) | |||
| 8270 | if (block_group->cached == BTRFS_CACHE_STARTED) | 8322 | if (block_group->cached == BTRFS_CACHE_STARTED) |
| 8271 | wait_block_group_cache_done(block_group); | 8323 | wait_block_group_cache_done(block_group); |
| 8272 | 8324 | ||
| 8325 | /* | ||
| 8326 | * We haven't cached this block group, which means we could | ||
| 8327 | * possibly have excluded extents on this block group. | ||
| 8328 | */ | ||
| 8329 | if (block_group->cached == BTRFS_CACHE_NO) | ||
| 8330 | free_excluded_extents(info->extent_root, block_group); | ||
| 8331 | |||
| 8273 | btrfs_remove_free_space_cache(block_group); | 8332 | btrfs_remove_free_space_cache(block_group); |
| 8274 | btrfs_put_block_group(block_group); | 8333 | btrfs_put_block_group(block_group); |
| 8275 | 8334 | ||
| @@ -8385,6 +8444,13 @@ int btrfs_read_block_groups(struct btrfs_root *root) | |||
| 8385 | cache->sectorsize = root->sectorsize; | 8444 | cache->sectorsize = root->sectorsize; |
| 8386 | 8445 | ||
| 8387 | /* | 8446 | /* |
| 8447 | * We need to exclude the super stripes now so that the space | ||
| 8448 | * info has super bytes accounted for, otherwise we'll think | ||
| 8449 | * we have more space than we actually do. | ||
| 8450 | */ | ||
| 8451 | exclude_super_stripes(root, cache); | ||
| 8452 | |||
| 8453 | /* | ||
| 8388 | * check for two cases, either we are full, and therefore | 8454 | * check for two cases, either we are full, and therefore |
| 8389 | * don't need to bother with the caching work since we won't | 8455 | * don't need to bother with the caching work since we won't |
| 8390 | * find any space, or we are empty, and we can just add all | 8456 | * find any space, or we are empty, and we can just add all |
| @@ -8392,12 +8458,10 @@ int btrfs_read_block_groups(struct btrfs_root *root) | |||
| 8392 | * time, particularly in the full case. | 8458 | * time, particularly in the full case. |
| 8393 | */ | 8459 | */ |
| 8394 | if (found_key.offset == btrfs_block_group_used(&cache->item)) { | 8460 | if (found_key.offset == btrfs_block_group_used(&cache->item)) { |
| 8395 | exclude_super_stripes(root, cache); | ||
| 8396 | cache->last_byte_to_unpin = (u64)-1; | 8461 | cache->last_byte_to_unpin = (u64)-1; |
| 8397 | cache->cached = BTRFS_CACHE_FINISHED; | 8462 | cache->cached = BTRFS_CACHE_FINISHED; |
| 8398 | free_excluded_extents(root, cache); | 8463 | free_excluded_extents(root, cache); |
| 8399 | } else if (btrfs_block_group_used(&cache->item) == 0) { | 8464 | } else if (btrfs_block_group_used(&cache->item) == 0) { |
| 8400 | exclude_super_stripes(root, cache); | ||
| 8401 | cache->last_byte_to_unpin = (u64)-1; | 8465 | cache->last_byte_to_unpin = (u64)-1; |
| 8402 | cache->cached = BTRFS_CACHE_FINISHED; | 8466 | cache->cached = BTRFS_CACHE_FINISHED; |
| 8403 | add_new_free_space(cache, root->fs_info, | 8467 | add_new_free_space(cache, root->fs_info, |
diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c index 2e993cf1766e..5e76a474cb7e 100644 --- a/fs/btrfs/extent_io.c +++ b/fs/btrfs/extent_io.c | |||
| @@ -1865,7 +1865,7 @@ static int submit_one_bio(int rw, struct bio *bio, int mirror_num, | |||
| 1865 | bio_get(bio); | 1865 | bio_get(bio); |
| 1866 | 1866 | ||
| 1867 | if (tree->ops && tree->ops->submit_bio_hook) | 1867 | if (tree->ops && tree->ops->submit_bio_hook) |
| 1868 | tree->ops->submit_bio_hook(page->mapping->host, rw, bio, | 1868 | ret = tree->ops->submit_bio_hook(page->mapping->host, rw, bio, |
| 1869 | mirror_num, bio_flags, start); | 1869 | mirror_num, bio_flags, start); |
| 1870 | else | 1870 | else |
| 1871 | submit_bio(rw, bio); | 1871 | submit_bio(rw, bio); |
| @@ -1920,6 +1920,8 @@ static int submit_extent_page(int rw, struct extent_io_tree *tree, | |||
| 1920 | nr = bio_get_nr_vecs(bdev); | 1920 | nr = bio_get_nr_vecs(bdev); |
| 1921 | 1921 | ||
| 1922 | bio = btrfs_bio_alloc(bdev, sector, nr, GFP_NOFS | __GFP_HIGH); | 1922 | bio = btrfs_bio_alloc(bdev, sector, nr, GFP_NOFS | __GFP_HIGH); |
| 1923 | if (!bio) | ||
| 1924 | return -ENOMEM; | ||
| 1923 | 1925 | ||
| 1924 | bio_add_page(bio, page, page_size, offset); | 1926 | bio_add_page(bio, page, page_size, offset); |
| 1925 | bio->bi_end_io = end_io_func; | 1927 | bio->bi_end_io = end_io_func; |
| @@ -2126,7 +2128,7 @@ int extent_read_full_page(struct extent_io_tree *tree, struct page *page, | |||
| 2126 | ret = __extent_read_full_page(tree, page, get_extent, &bio, 0, | 2128 | ret = __extent_read_full_page(tree, page, get_extent, &bio, 0, |
| 2127 | &bio_flags); | 2129 | &bio_flags); |
| 2128 | if (bio) | 2130 | if (bio) |
| 2129 | submit_one_bio(READ, bio, 0, bio_flags); | 2131 | ret = submit_one_bio(READ, bio, 0, bio_flags); |
| 2130 | return ret; | 2132 | return ret; |
| 2131 | } | 2133 | } |
| 2132 | 2134 | ||
diff --git a/fs/btrfs/file-item.c b/fs/btrfs/file-item.c index a562a250ae77..4f19a3e1bf32 100644 --- a/fs/btrfs/file-item.c +++ b/fs/btrfs/file-item.c | |||
| @@ -536,6 +536,8 @@ int btrfs_del_csums(struct btrfs_trans_handle *trans, | |||
| 536 | root = root->fs_info->csum_root; | 536 | root = root->fs_info->csum_root; |
| 537 | 537 | ||
| 538 | path = btrfs_alloc_path(); | 538 | path = btrfs_alloc_path(); |
| 539 | if (!path) | ||
| 540 | return -ENOMEM; | ||
| 539 | 541 | ||
| 540 | while (1) { | 542 | while (1) { |
| 541 | key.objectid = BTRFS_EXTENT_CSUM_OBJECTID; | 543 | key.objectid = BTRFS_EXTENT_CSUM_OBJECTID; |
| @@ -548,7 +550,10 @@ int btrfs_del_csums(struct btrfs_trans_handle *trans, | |||
| 548 | if (path->slots[0] == 0) | 550 | if (path->slots[0] == 0) |
| 549 | goto out; | 551 | goto out; |
| 550 | path->slots[0]--; | 552 | path->slots[0]--; |
| 553 | } else if (ret < 0) { | ||
| 554 | goto out; | ||
| 551 | } | 555 | } |
| 556 | |||
| 552 | leaf = path->nodes[0]; | 557 | leaf = path->nodes[0]; |
| 553 | btrfs_item_key_to_cpu(leaf, &key, path->slots[0]); | 558 | btrfs_item_key_to_cpu(leaf, &key, path->slots[0]); |
| 554 | 559 | ||
diff --git a/fs/btrfs/file.c b/fs/btrfs/file.c index c800d58f3013..c1d3a818731a 100644 --- a/fs/btrfs/file.c +++ b/fs/btrfs/file.c | |||
| @@ -793,8 +793,12 @@ again: | |||
| 793 | for (i = 0; i < num_pages; i++) { | 793 | for (i = 0; i < num_pages; i++) { |
| 794 | pages[i] = grab_cache_page(inode->i_mapping, index + i); | 794 | pages[i] = grab_cache_page(inode->i_mapping, index + i); |
| 795 | if (!pages[i]) { | 795 | if (!pages[i]) { |
| 796 | err = -ENOMEM; | 796 | int c; |
| 797 | BUG_ON(1); | 797 | for (c = i - 1; c >= 0; c--) { |
| 798 | unlock_page(pages[c]); | ||
| 799 | page_cache_release(pages[c]); | ||
| 800 | } | ||
| 801 | return -ENOMEM; | ||
| 798 | } | 802 | } |
| 799 | wait_on_page_writeback(pages[i]); | 803 | wait_on_page_writeback(pages[i]); |
| 800 | } | 804 | } |
| @@ -946,6 +950,10 @@ static ssize_t btrfs_file_aio_write(struct kiocb *iocb, | |||
| 946 | PAGE_CACHE_SIZE, PAGE_CACHE_SIZE / | 950 | PAGE_CACHE_SIZE, PAGE_CACHE_SIZE / |
| 947 | (sizeof(struct page *))); | 951 | (sizeof(struct page *))); |
| 948 | pages = kmalloc(nrptrs * sizeof(struct page *), GFP_KERNEL); | 952 | pages = kmalloc(nrptrs * sizeof(struct page *), GFP_KERNEL); |
| 953 | if (!pages) { | ||
| 954 | ret = -ENOMEM; | ||
| 955 | goto out; | ||
| 956 | } | ||
| 949 | 957 | ||
| 950 | /* generic_write_checks can change our pos */ | 958 | /* generic_write_checks can change our pos */ |
| 951 | start_pos = pos; | 959 | start_pos = pos; |
| @@ -984,8 +992,8 @@ static ssize_t btrfs_file_aio_write(struct kiocb *iocb, | |||
| 984 | size_t write_bytes = min(iov_iter_count(&i), | 992 | size_t write_bytes = min(iov_iter_count(&i), |
| 985 | nrptrs * (size_t)PAGE_CACHE_SIZE - | 993 | nrptrs * (size_t)PAGE_CACHE_SIZE - |
| 986 | offset); | 994 | offset); |
| 987 | size_t num_pages = (write_bytes + PAGE_CACHE_SIZE - 1) >> | 995 | size_t num_pages = (write_bytes + offset + |
| 988 | PAGE_CACHE_SHIFT; | 996 | PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT; |
| 989 | 997 | ||
| 990 | WARN_ON(num_pages > nrptrs); | 998 | WARN_ON(num_pages > nrptrs); |
| 991 | memset(pages, 0, sizeof(struct page *) * nrptrs); | 999 | memset(pages, 0, sizeof(struct page *) * nrptrs); |
| @@ -1015,8 +1023,8 @@ static ssize_t btrfs_file_aio_write(struct kiocb *iocb, | |||
| 1015 | 1023 | ||
| 1016 | copied = btrfs_copy_from_user(pos, num_pages, | 1024 | copied = btrfs_copy_from_user(pos, num_pages, |
| 1017 | write_bytes, pages, &i); | 1025 | write_bytes, pages, &i); |
| 1018 | dirty_pages = (copied + PAGE_CACHE_SIZE - 1) >> | 1026 | dirty_pages = (copied + offset + PAGE_CACHE_SIZE - 1) >> |
| 1019 | PAGE_CACHE_SHIFT; | 1027 | PAGE_CACHE_SHIFT; |
| 1020 | 1028 | ||
| 1021 | if (num_pages > dirty_pages) { | 1029 | if (num_pages > dirty_pages) { |
| 1022 | if (copied > 0) | 1030 | if (copied > 0) |
diff --git a/fs/btrfs/free-space-cache.c b/fs/btrfs/free-space-cache.c index 60d684266959..a0390657451b 100644 --- a/fs/btrfs/free-space-cache.c +++ b/fs/btrfs/free-space-cache.c | |||
| @@ -987,11 +987,18 @@ tree_search_offset(struct btrfs_block_group_cache *block_group, | |||
| 987 | return entry; | 987 | return entry; |
| 988 | } | 988 | } |
| 989 | 989 | ||
| 990 | static void unlink_free_space(struct btrfs_block_group_cache *block_group, | 990 | static inline void |
| 991 | struct btrfs_free_space *info) | 991 | __unlink_free_space(struct btrfs_block_group_cache *block_group, |
| 992 | struct btrfs_free_space *info) | ||
| 992 | { | 993 | { |
| 993 | rb_erase(&info->offset_index, &block_group->free_space_offset); | 994 | rb_erase(&info->offset_index, &block_group->free_space_offset); |
| 994 | block_group->free_extents--; | 995 | block_group->free_extents--; |
| 996 | } | ||
| 997 | |||
| 998 | static void unlink_free_space(struct btrfs_block_group_cache *block_group, | ||
| 999 | struct btrfs_free_space *info) | ||
| 1000 | { | ||
| 1001 | __unlink_free_space(block_group, info); | ||
| 995 | block_group->free_space -= info->bytes; | 1002 | block_group->free_space -= info->bytes; |
| 996 | } | 1003 | } |
| 997 | 1004 | ||
| @@ -1016,14 +1023,18 @@ static void recalculate_thresholds(struct btrfs_block_group_cache *block_group) | |||
| 1016 | u64 max_bytes; | 1023 | u64 max_bytes; |
| 1017 | u64 bitmap_bytes; | 1024 | u64 bitmap_bytes; |
| 1018 | u64 extent_bytes; | 1025 | u64 extent_bytes; |
| 1026 | u64 size = block_group->key.offset; | ||
| 1019 | 1027 | ||
| 1020 | /* | 1028 | /* |
| 1021 | * The goal is to keep the total amount of memory used per 1gb of space | 1029 | * The goal is to keep the total amount of memory used per 1gb of space |
| 1022 | * at or below 32k, so we need to adjust how much memory we allow to be | 1030 | * at or below 32k, so we need to adjust how much memory we allow to be |
| 1023 | * used by extent based free space tracking | 1031 | * used by extent based free space tracking |
| 1024 | */ | 1032 | */ |
| 1025 | max_bytes = MAX_CACHE_BYTES_PER_GIG * | 1033 | if (size < 1024 * 1024 * 1024) |
| 1026 | (div64_u64(block_group->key.offset, 1024 * 1024 * 1024)); | 1034 | max_bytes = MAX_CACHE_BYTES_PER_GIG; |
| 1035 | else | ||
| 1036 | max_bytes = MAX_CACHE_BYTES_PER_GIG * | ||
| 1037 | div64_u64(size, 1024 * 1024 * 1024); | ||
| 1027 | 1038 | ||
| 1028 | /* | 1039 | /* |
| 1029 | * we want to account for 1 more bitmap than what we have so we can make | 1040 | * we want to account for 1 more bitmap than what we have so we can make |
| @@ -1171,6 +1182,16 @@ static void add_new_bitmap(struct btrfs_block_group_cache *block_group, | |||
| 1171 | recalculate_thresholds(block_group); | 1182 | recalculate_thresholds(block_group); |
| 1172 | } | 1183 | } |
| 1173 | 1184 | ||
| 1185 | static void free_bitmap(struct btrfs_block_group_cache *block_group, | ||
| 1186 | struct btrfs_free_space *bitmap_info) | ||
| 1187 | { | ||
| 1188 | unlink_free_space(block_group, bitmap_info); | ||
| 1189 | kfree(bitmap_info->bitmap); | ||
| 1190 | kfree(bitmap_info); | ||
| 1191 | block_group->total_bitmaps--; | ||
| 1192 | recalculate_thresholds(block_group); | ||
| 1193 | } | ||
| 1194 | |||
| 1174 | static noinline int remove_from_bitmap(struct btrfs_block_group_cache *block_group, | 1195 | static noinline int remove_from_bitmap(struct btrfs_block_group_cache *block_group, |
| 1175 | struct btrfs_free_space *bitmap_info, | 1196 | struct btrfs_free_space *bitmap_info, |
| 1176 | u64 *offset, u64 *bytes) | 1197 | u64 *offset, u64 *bytes) |
| @@ -1195,6 +1216,7 @@ again: | |||
| 1195 | */ | 1216 | */ |
| 1196 | search_start = *offset; | 1217 | search_start = *offset; |
| 1197 | search_bytes = *bytes; | 1218 | search_bytes = *bytes; |
| 1219 | search_bytes = min(search_bytes, end - search_start + 1); | ||
| 1198 | ret = search_bitmap(block_group, bitmap_info, &search_start, | 1220 | ret = search_bitmap(block_group, bitmap_info, &search_start, |
| 1199 | &search_bytes); | 1221 | &search_bytes); |
| 1200 | BUG_ON(ret < 0 || search_start != *offset); | 1222 | BUG_ON(ret < 0 || search_start != *offset); |
| @@ -1211,13 +1233,8 @@ again: | |||
| 1211 | 1233 | ||
| 1212 | if (*bytes) { | 1234 | if (*bytes) { |
| 1213 | struct rb_node *next = rb_next(&bitmap_info->offset_index); | 1235 | struct rb_node *next = rb_next(&bitmap_info->offset_index); |
| 1214 | if (!bitmap_info->bytes) { | 1236 | if (!bitmap_info->bytes) |
| 1215 | unlink_free_space(block_group, bitmap_info); | 1237 | free_bitmap(block_group, bitmap_info); |
| 1216 | kfree(bitmap_info->bitmap); | ||
| 1217 | kfree(bitmap_info); | ||
| 1218 | block_group->total_bitmaps--; | ||
| 1219 | recalculate_thresholds(block_group); | ||
| 1220 | } | ||
| 1221 | 1238 | ||
| 1222 | /* | 1239 | /* |
| 1223 | * no entry after this bitmap, but we still have bytes to | 1240 | * no entry after this bitmap, but we still have bytes to |
| @@ -1250,13 +1267,8 @@ again: | |||
| 1250 | return -EAGAIN; | 1267 | return -EAGAIN; |
| 1251 | 1268 | ||
| 1252 | goto again; | 1269 | goto again; |
| 1253 | } else if (!bitmap_info->bytes) { | 1270 | } else if (!bitmap_info->bytes) |
| 1254 | unlink_free_space(block_group, bitmap_info); | 1271 | free_bitmap(block_group, bitmap_info); |
| 1255 | kfree(bitmap_info->bitmap); | ||
| 1256 | kfree(bitmap_info); | ||
| 1257 | block_group->total_bitmaps--; | ||
| 1258 | recalculate_thresholds(block_group); | ||
| 1259 | } | ||
| 1260 | 1272 | ||
| 1261 | return 0; | 1273 | return 0; |
| 1262 | } | 1274 | } |
| @@ -1359,22 +1371,14 @@ out: | |||
| 1359 | return ret; | 1371 | return ret; |
| 1360 | } | 1372 | } |
| 1361 | 1373 | ||
| 1362 | int btrfs_add_free_space(struct btrfs_block_group_cache *block_group, | 1374 | bool try_merge_free_space(struct btrfs_block_group_cache *block_group, |
| 1363 | u64 offset, u64 bytes) | 1375 | struct btrfs_free_space *info, bool update_stat) |
| 1364 | { | 1376 | { |
| 1365 | struct btrfs_free_space *right_info = NULL; | 1377 | struct btrfs_free_space *left_info; |
| 1366 | struct btrfs_free_space *left_info = NULL; | 1378 | struct btrfs_free_space *right_info; |
| 1367 | struct btrfs_free_space *info = NULL; | 1379 | bool merged = false; |
| 1368 | int ret = 0; | 1380 | u64 offset = info->offset; |
| 1369 | 1381 | u64 bytes = info->bytes; | |
| 1370 | info = kzalloc(sizeof(struct btrfs_free_space), GFP_NOFS); | ||
| 1371 | if (!info) | ||
| 1372 | return -ENOMEM; | ||
| 1373 | |||
| 1374 | info->offset = offset; | ||
| 1375 | info->bytes = bytes; | ||
| 1376 | |||
| 1377 | spin_lock(&block_group->tree_lock); | ||
| 1378 | 1382 | ||
| 1379 | /* | 1383 | /* |
| 1380 | * first we want to see if there is free space adjacent to the range we | 1384 | * first we want to see if there is free space adjacent to the range we |
| @@ -1388,37 +1392,62 @@ int btrfs_add_free_space(struct btrfs_block_group_cache *block_group, | |||
| 1388 | else | 1392 | else |
| 1389 | left_info = tree_search_offset(block_group, offset - 1, 0, 0); | 1393 | left_info = tree_search_offset(block_group, offset - 1, 0, 0); |
| 1390 | 1394 | ||
| 1391 | /* | ||
| 1392 | * If there was no extent directly to the left or right of this new | ||
| 1393 | * extent then we know we're going to have to allocate a new extent, so | ||
| 1394 | * before we do that see if we need to drop this into a bitmap | ||
| 1395 | */ | ||
| 1396 | if ((!left_info || left_info->bitmap) && | ||
| 1397 | (!right_info || right_info->bitmap)) { | ||
| 1398 | ret = insert_into_bitmap(block_group, info); | ||
| 1399 | |||
| 1400 | if (ret < 0) { | ||
| 1401 | goto out; | ||
| 1402 | } else if (ret) { | ||
| 1403 | ret = 0; | ||
| 1404 | goto out; | ||
| 1405 | } | ||
| 1406 | } | ||
| 1407 | |||
| 1408 | if (right_info && !right_info->bitmap) { | 1395 | if (right_info && !right_info->bitmap) { |
| 1409 | unlink_free_space(block_group, right_info); | 1396 | if (update_stat) |
| 1397 | unlink_free_space(block_group, right_info); | ||
| 1398 | else | ||
| 1399 | __unlink_free_space(block_group, right_info); | ||
| 1410 | info->bytes += right_info->bytes; | 1400 | info->bytes += right_info->bytes; |
| 1411 | kfree(right_info); | 1401 | kfree(right_info); |
| 1402 | merged = true; | ||
| 1412 | } | 1403 | } |
| 1413 | 1404 | ||
| 1414 | if (left_info && !left_info->bitmap && | 1405 | if (left_info && !left_info->bitmap && |
| 1415 | left_info->offset + left_info->bytes == offset) { | 1406 | left_info->offset + left_info->bytes == offset) { |
| 1416 | unlink_free_space(block_group, left_info); | 1407 | if (update_stat) |
| 1408 | unlink_free_space(block_group, left_info); | ||
| 1409 | else | ||
| 1410 | __unlink_free_space(block_group, left_info); | ||
| 1417 | info->offset = left_info->offset; | 1411 | info->offset = left_info->offset; |
| 1418 | info->bytes += left_info->bytes; | 1412 | info->bytes += left_info->bytes; |
| 1419 | kfree(left_info); | 1413 | kfree(left_info); |
| 1414 | merged = true; | ||
| 1420 | } | 1415 | } |
| 1421 | 1416 | ||
| 1417 | return merged; | ||
| 1418 | } | ||
| 1419 | |||
| 1420 | int btrfs_add_free_space(struct btrfs_block_group_cache *block_group, | ||
| 1421 | u64 offset, u64 bytes) | ||
| 1422 | { | ||
| 1423 | struct btrfs_free_space *info; | ||
| 1424 | int ret = 0; | ||
| 1425 | |||
| 1426 | info = kzalloc(sizeof(struct btrfs_free_space), GFP_NOFS); | ||
| 1427 | if (!info) | ||
| 1428 | return -ENOMEM; | ||
| 1429 | |||
| 1430 | info->offset = offset; | ||
| 1431 | info->bytes = bytes; | ||
| 1432 | |||
| 1433 | spin_lock(&block_group->tree_lock); | ||
| 1434 | |||
| 1435 | if (try_merge_free_space(block_group, info, true)) | ||
| 1436 | goto link; | ||
| 1437 | |||
| 1438 | /* | ||
| 1439 | * There was no extent directly to the left or right of this new | ||
| 1440 | * extent then we know we're going to have to allocate a new extent, so | ||
| 1441 | * before we do that see if we need to drop this into a bitmap | ||
| 1442 | */ | ||
| 1443 | ret = insert_into_bitmap(block_group, info); | ||
| 1444 | if (ret < 0) { | ||
| 1445 | goto out; | ||
| 1446 | } else if (ret) { | ||
| 1447 | ret = 0; | ||
| 1448 | goto out; | ||
| 1449 | } | ||
| 1450 | link: | ||
| 1422 | ret = link_free_space(block_group, info); | 1451 | ret = link_free_space(block_group, info); |
| 1423 | if (ret) | 1452 | if (ret) |
| 1424 | kfree(info); | 1453 | kfree(info); |
| @@ -1621,6 +1650,7 @@ __btrfs_return_cluster_to_free_space( | |||
| 1621 | node = rb_next(&entry->offset_index); | 1650 | node = rb_next(&entry->offset_index); |
| 1622 | rb_erase(&entry->offset_index, &cluster->root); | 1651 | rb_erase(&entry->offset_index, &cluster->root); |
| 1623 | BUG_ON(entry->bitmap); | 1652 | BUG_ON(entry->bitmap); |
| 1653 | try_merge_free_space(block_group, entry, false); | ||
| 1624 | tree_insert_offset(&block_group->free_space_offset, | 1654 | tree_insert_offset(&block_group->free_space_offset, |
| 1625 | entry->offset, &entry->offset_index, 0); | 1655 | entry->offset, &entry->offset_index, 0); |
| 1626 | } | 1656 | } |
| @@ -1685,13 +1715,8 @@ u64 btrfs_find_space_for_alloc(struct btrfs_block_group_cache *block_group, | |||
| 1685 | ret = offset; | 1715 | ret = offset; |
| 1686 | if (entry->bitmap) { | 1716 | if (entry->bitmap) { |
| 1687 | bitmap_clear_bits(block_group, entry, offset, bytes); | 1717 | bitmap_clear_bits(block_group, entry, offset, bytes); |
| 1688 | if (!entry->bytes) { | 1718 | if (!entry->bytes) |
| 1689 | unlink_free_space(block_group, entry); | 1719 | free_bitmap(block_group, entry); |
| 1690 | kfree(entry->bitmap); | ||
| 1691 | kfree(entry); | ||
| 1692 | block_group->total_bitmaps--; | ||
| 1693 | recalculate_thresholds(block_group); | ||
| 1694 | } | ||
| 1695 | } else { | 1720 | } else { |
| 1696 | unlink_free_space(block_group, entry); | 1721 | unlink_free_space(block_group, entry); |
| 1697 | entry->offset += bytes; | 1722 | entry->offset += bytes; |
| @@ -1789,6 +1814,8 @@ static u64 btrfs_alloc_from_bitmap(struct btrfs_block_group_cache *block_group, | |||
| 1789 | 1814 | ||
| 1790 | ret = search_start; | 1815 | ret = search_start; |
| 1791 | bitmap_clear_bits(block_group, entry, ret, bytes); | 1816 | bitmap_clear_bits(block_group, entry, ret, bytes); |
| 1817 | if (entry->bytes == 0) | ||
| 1818 | free_bitmap(block_group, entry); | ||
| 1792 | out: | 1819 | out: |
| 1793 | spin_unlock(&cluster->lock); | 1820 | spin_unlock(&cluster->lock); |
| 1794 | spin_unlock(&block_group->tree_lock); | 1821 | spin_unlock(&block_group->tree_lock); |
| @@ -1842,15 +1869,26 @@ u64 btrfs_alloc_from_cluster(struct btrfs_block_group_cache *block_group, | |||
| 1842 | entry->offset += bytes; | 1869 | entry->offset += bytes; |
| 1843 | entry->bytes -= bytes; | 1870 | entry->bytes -= bytes; |
| 1844 | 1871 | ||
| 1845 | if (entry->bytes == 0) { | 1872 | if (entry->bytes == 0) |
| 1846 | rb_erase(&entry->offset_index, &cluster->root); | 1873 | rb_erase(&entry->offset_index, &cluster->root); |
| 1847 | kfree(entry); | ||
| 1848 | } | ||
| 1849 | break; | 1874 | break; |
| 1850 | } | 1875 | } |
| 1851 | out: | 1876 | out: |
| 1852 | spin_unlock(&cluster->lock); | 1877 | spin_unlock(&cluster->lock); |
| 1853 | 1878 | ||
| 1879 | if (!ret) | ||
| 1880 | return 0; | ||
| 1881 | |||
| 1882 | spin_lock(&block_group->tree_lock); | ||
| 1883 | |||
| 1884 | block_group->free_space -= bytes; | ||
| 1885 | if (entry->bytes == 0) { | ||
| 1886 | block_group->free_extents--; | ||
| 1887 | kfree(entry); | ||
| 1888 | } | ||
| 1889 | |||
| 1890 | spin_unlock(&block_group->tree_lock); | ||
| 1891 | |||
| 1854 | return ret; | 1892 | return ret; |
| 1855 | } | 1893 | } |
| 1856 | 1894 | ||
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index 160b55b3e132..bcc461a9695f 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c | |||
| @@ -416,7 +416,7 @@ again: | |||
| 416 | } | 416 | } |
| 417 | if (start == 0) { | 417 | if (start == 0) { |
| 418 | trans = btrfs_join_transaction(root, 1); | 418 | trans = btrfs_join_transaction(root, 1); |
| 419 | BUG_ON(!trans); | 419 | BUG_ON(IS_ERR(trans)); |
| 420 | btrfs_set_trans_block_group(trans, inode); | 420 | btrfs_set_trans_block_group(trans, inode); |
| 421 | trans->block_rsv = &root->fs_info->delalloc_block_rsv; | 421 | trans->block_rsv = &root->fs_info->delalloc_block_rsv; |
| 422 | 422 | ||
| @@ -612,6 +612,7 @@ retry: | |||
| 612 | GFP_NOFS); | 612 | GFP_NOFS); |
| 613 | 613 | ||
| 614 | trans = btrfs_join_transaction(root, 1); | 614 | trans = btrfs_join_transaction(root, 1); |
| 615 | BUG_ON(IS_ERR(trans)); | ||
| 615 | ret = btrfs_reserve_extent(trans, root, | 616 | ret = btrfs_reserve_extent(trans, root, |
| 616 | async_extent->compressed_size, | 617 | async_extent->compressed_size, |
| 617 | async_extent->compressed_size, | 618 | async_extent->compressed_size, |
| @@ -771,7 +772,7 @@ static noinline int cow_file_range(struct inode *inode, | |||
| 771 | 772 | ||
| 772 | BUG_ON(root == root->fs_info->tree_root); | 773 | BUG_ON(root == root->fs_info->tree_root); |
| 773 | trans = btrfs_join_transaction(root, 1); | 774 | trans = btrfs_join_transaction(root, 1); |
| 774 | BUG_ON(!trans); | 775 | BUG_ON(IS_ERR(trans)); |
| 775 | btrfs_set_trans_block_group(trans, inode); | 776 | btrfs_set_trans_block_group(trans, inode); |
| 776 | trans->block_rsv = &root->fs_info->delalloc_block_rsv; | 777 | trans->block_rsv = &root->fs_info->delalloc_block_rsv; |
| 777 | 778 | ||
| @@ -1049,7 +1050,7 @@ static noinline int run_delalloc_nocow(struct inode *inode, | |||
| 1049 | } else { | 1050 | } else { |
| 1050 | trans = btrfs_join_transaction(root, 1); | 1051 | trans = btrfs_join_transaction(root, 1); |
| 1051 | } | 1052 | } |
| 1052 | BUG_ON(!trans); | 1053 | BUG_ON(IS_ERR(trans)); |
| 1053 | 1054 | ||
| 1054 | cow_start = (u64)-1; | 1055 | cow_start = (u64)-1; |
| 1055 | cur_offset = start; | 1056 | cur_offset = start; |
| @@ -1557,6 +1558,7 @@ out: | |||
| 1557 | out_page: | 1558 | out_page: |
| 1558 | unlock_page(page); | 1559 | unlock_page(page); |
| 1559 | page_cache_release(page); | 1560 | page_cache_release(page); |
| 1561 | kfree(fixup); | ||
| 1560 | } | 1562 | } |
| 1561 | 1563 | ||
| 1562 | /* | 1564 | /* |
| @@ -1703,7 +1705,7 @@ static int btrfs_finish_ordered_io(struct inode *inode, u64 start, u64 end) | |||
| 1703 | trans = btrfs_join_transaction_nolock(root, 1); | 1705 | trans = btrfs_join_transaction_nolock(root, 1); |
| 1704 | else | 1706 | else |
| 1705 | trans = btrfs_join_transaction(root, 1); | 1707 | trans = btrfs_join_transaction(root, 1); |
| 1706 | BUG_ON(!trans); | 1708 | BUG_ON(IS_ERR(trans)); |
| 1707 | btrfs_set_trans_block_group(trans, inode); | 1709 | btrfs_set_trans_block_group(trans, inode); |
| 1708 | trans->block_rsv = &root->fs_info->delalloc_block_rsv; | 1710 | trans->block_rsv = &root->fs_info->delalloc_block_rsv; |
| 1709 | ret = btrfs_update_inode(trans, root, inode); | 1711 | ret = btrfs_update_inode(trans, root, inode); |
| @@ -1720,6 +1722,7 @@ static int btrfs_finish_ordered_io(struct inode *inode, u64 start, u64 end) | |||
| 1720 | trans = btrfs_join_transaction_nolock(root, 1); | 1722 | trans = btrfs_join_transaction_nolock(root, 1); |
| 1721 | else | 1723 | else |
| 1722 | trans = btrfs_join_transaction(root, 1); | 1724 | trans = btrfs_join_transaction(root, 1); |
| 1725 | BUG_ON(IS_ERR(trans)); | ||
| 1723 | btrfs_set_trans_block_group(trans, inode); | 1726 | btrfs_set_trans_block_group(trans, inode); |
| 1724 | trans->block_rsv = &root->fs_info->delalloc_block_rsv; | 1727 | trans->block_rsv = &root->fs_info->delalloc_block_rsv; |
| 1725 | 1728 | ||
| @@ -2354,6 +2357,7 @@ void btrfs_orphan_cleanup(struct btrfs_root *root) | |||
| 2354 | */ | 2357 | */ |
| 2355 | if (is_bad_inode(inode)) { | 2358 | if (is_bad_inode(inode)) { |
| 2356 | trans = btrfs_start_transaction(root, 0); | 2359 | trans = btrfs_start_transaction(root, 0); |
| 2360 | BUG_ON(IS_ERR(trans)); | ||
| 2357 | btrfs_orphan_del(trans, inode); | 2361 | btrfs_orphan_del(trans, inode); |
| 2358 | btrfs_end_transaction(trans, root); | 2362 | btrfs_end_transaction(trans, root); |
| 2359 | iput(inode); | 2363 | iput(inode); |
| @@ -2381,6 +2385,7 @@ void btrfs_orphan_cleanup(struct btrfs_root *root) | |||
| 2381 | 2385 | ||
| 2382 | if (root->orphan_block_rsv || root->orphan_item_inserted) { | 2386 | if (root->orphan_block_rsv || root->orphan_item_inserted) { |
| 2383 | trans = btrfs_join_transaction(root, 1); | 2387 | trans = btrfs_join_transaction(root, 1); |
| 2388 | BUG_ON(IS_ERR(trans)); | ||
| 2384 | btrfs_end_transaction(trans, root); | 2389 | btrfs_end_transaction(trans, root); |
| 2385 | } | 2390 | } |
| 2386 | 2391 | ||
| @@ -2641,7 +2646,7 @@ int btrfs_unlink_inode(struct btrfs_trans_handle *trans, | |||
| 2641 | path = btrfs_alloc_path(); | 2646 | path = btrfs_alloc_path(); |
| 2642 | if (!path) { | 2647 | if (!path) { |
| 2643 | ret = -ENOMEM; | 2648 | ret = -ENOMEM; |
| 2644 | goto err; | 2649 | goto out; |
| 2645 | } | 2650 | } |
| 2646 | 2651 | ||
| 2647 | path->leave_spinning = 1; | 2652 | path->leave_spinning = 1; |
| @@ -2714,9 +2719,10 @@ static int check_path_shared(struct btrfs_root *root, | |||
| 2714 | struct extent_buffer *eb; | 2719 | struct extent_buffer *eb; |
| 2715 | int level; | 2720 | int level; |
| 2716 | u64 refs = 1; | 2721 | u64 refs = 1; |
| 2717 | int uninitialized_var(ret); | ||
| 2718 | 2722 | ||
| 2719 | for (level = 0; level < BTRFS_MAX_LEVEL; level++) { | 2723 | for (level = 0; level < BTRFS_MAX_LEVEL; level++) { |
| 2724 | int ret; | ||
| 2725 | |||
| 2720 | if (!path->nodes[level]) | 2726 | if (!path->nodes[level]) |
| 2721 | break; | 2727 | break; |
| 2722 | eb = path->nodes[level]; | 2728 | eb = path->nodes[level]; |
| @@ -2727,7 +2733,7 @@ static int check_path_shared(struct btrfs_root *root, | |||
| 2727 | if (refs > 1) | 2733 | if (refs > 1) |
| 2728 | return 1; | 2734 | return 1; |
| 2729 | } | 2735 | } |
| 2730 | return ret; /* XXX callers? */ | 2736 | return 0; |
| 2731 | } | 2737 | } |
| 2732 | 2738 | ||
| 2733 | /* | 2739 | /* |
| @@ -4134,7 +4140,7 @@ struct inode *btrfs_lookup_dentry(struct inode *dir, struct dentry *dentry) | |||
| 4134 | } | 4140 | } |
| 4135 | srcu_read_unlock(&root->fs_info->subvol_srcu, index); | 4141 | srcu_read_unlock(&root->fs_info->subvol_srcu, index); |
| 4136 | 4142 | ||
| 4137 | if (root != sub_root) { | 4143 | if (!IS_ERR(inode) && root != sub_root) { |
| 4138 | down_read(&root->fs_info->cleanup_work_sem); | 4144 | down_read(&root->fs_info->cleanup_work_sem); |
| 4139 | if (!(inode->i_sb->s_flags & MS_RDONLY)) | 4145 | if (!(inode->i_sb->s_flags & MS_RDONLY)) |
| 4140 | btrfs_orphan_cleanup(sub_root); | 4146 | btrfs_orphan_cleanup(sub_root); |
| @@ -4347,6 +4353,8 @@ int btrfs_write_inode(struct inode *inode, struct writeback_control *wbc) | |||
| 4347 | trans = btrfs_join_transaction_nolock(root, 1); | 4353 | trans = btrfs_join_transaction_nolock(root, 1); |
| 4348 | else | 4354 | else |
| 4349 | trans = btrfs_join_transaction(root, 1); | 4355 | trans = btrfs_join_transaction(root, 1); |
| 4356 | if (IS_ERR(trans)) | ||
| 4357 | return PTR_ERR(trans); | ||
| 4350 | btrfs_set_trans_block_group(trans, inode); | 4358 | btrfs_set_trans_block_group(trans, inode); |
| 4351 | if (nolock) | 4359 | if (nolock) |
| 4352 | ret = btrfs_end_transaction_nolock(trans, root); | 4360 | ret = btrfs_end_transaction_nolock(trans, root); |
| @@ -4372,6 +4380,7 @@ void btrfs_dirty_inode(struct inode *inode) | |||
| 4372 | return; | 4380 | return; |
| 4373 | 4381 | ||
| 4374 | trans = btrfs_join_transaction(root, 1); | 4382 | trans = btrfs_join_transaction(root, 1); |
| 4383 | BUG_ON(IS_ERR(trans)); | ||
| 4375 | btrfs_set_trans_block_group(trans, inode); | 4384 | btrfs_set_trans_block_group(trans, inode); |
| 4376 | 4385 | ||
| 4377 | ret = btrfs_update_inode(trans, root, inode); | 4386 | ret = btrfs_update_inode(trans, root, inode); |
| @@ -5176,6 +5185,8 @@ again: | |||
| 5176 | em = NULL; | 5185 | em = NULL; |
| 5177 | btrfs_release_path(root, path); | 5186 | btrfs_release_path(root, path); |
| 5178 | trans = btrfs_join_transaction(root, 1); | 5187 | trans = btrfs_join_transaction(root, 1); |
| 5188 | if (IS_ERR(trans)) | ||
| 5189 | return ERR_CAST(trans); | ||
| 5179 | goto again; | 5190 | goto again; |
| 5180 | } | 5191 | } |
| 5181 | map = kmap(page); | 5192 | map = kmap(page); |
| @@ -5280,8 +5291,8 @@ static struct extent_map *btrfs_new_extent_direct(struct inode *inode, | |||
| 5280 | btrfs_drop_extent_cache(inode, start, start + len - 1, 0); | 5291 | btrfs_drop_extent_cache(inode, start, start + len - 1, 0); |
| 5281 | 5292 | ||
| 5282 | trans = btrfs_join_transaction(root, 0); | 5293 | trans = btrfs_join_transaction(root, 0); |
| 5283 | if (!trans) | 5294 | if (IS_ERR(trans)) |
| 5284 | return ERR_PTR(-ENOMEM); | 5295 | return ERR_CAST(trans); |
| 5285 | 5296 | ||
| 5286 | trans->block_rsv = &root->fs_info->delalloc_block_rsv; | 5297 | trans->block_rsv = &root->fs_info->delalloc_block_rsv; |
| 5287 | 5298 | ||
| @@ -5505,7 +5516,7 @@ static int btrfs_get_blocks_direct(struct inode *inode, sector_t iblock, | |||
| 5505 | * while we look for nocow cross refs | 5516 | * while we look for nocow cross refs |
| 5506 | */ | 5517 | */ |
| 5507 | trans = btrfs_join_transaction(root, 0); | 5518 | trans = btrfs_join_transaction(root, 0); |
| 5508 | if (!trans) | 5519 | if (IS_ERR(trans)) |
| 5509 | goto must_cow; | 5520 | goto must_cow; |
| 5510 | 5521 | ||
| 5511 | if (can_nocow_odirect(trans, inode, start, len) == 1) { | 5522 | if (can_nocow_odirect(trans, inode, start, len) == 1) { |
| @@ -5640,7 +5651,7 @@ again: | |||
| 5640 | BUG_ON(!ordered); | 5651 | BUG_ON(!ordered); |
| 5641 | 5652 | ||
| 5642 | trans = btrfs_join_transaction(root, 1); | 5653 | trans = btrfs_join_transaction(root, 1); |
| 5643 | if (!trans) { | 5654 | if (IS_ERR(trans)) { |
| 5644 | err = -ENOMEM; | 5655 | err = -ENOMEM; |
| 5645 | goto out; | 5656 | goto out; |
| 5646 | } | 5657 | } |
diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c index a506a22b522a..02d224e8c83f 100644 --- a/fs/btrfs/ioctl.c +++ b/fs/btrfs/ioctl.c | |||
| @@ -203,7 +203,7 @@ static int btrfs_ioctl_setflags(struct file *file, void __user *arg) | |||
| 203 | 203 | ||
| 204 | 204 | ||
| 205 | trans = btrfs_join_transaction(root, 1); | 205 | trans = btrfs_join_transaction(root, 1); |
| 206 | BUG_ON(!trans); | 206 | BUG_ON(IS_ERR(trans)); |
| 207 | 207 | ||
| 208 | ret = btrfs_update_inode(trans, root, inode); | 208 | ret = btrfs_update_inode(trans, root, inode); |
| 209 | BUG_ON(ret); | 209 | BUG_ON(ret); |
| @@ -907,6 +907,10 @@ static noinline int btrfs_ioctl_resize(struct btrfs_root *root, | |||
| 907 | 907 | ||
| 908 | if (new_size > old_size) { | 908 | if (new_size > old_size) { |
| 909 | trans = btrfs_start_transaction(root, 0); | 909 | trans = btrfs_start_transaction(root, 0); |
| 910 | if (IS_ERR(trans)) { | ||
| 911 | ret = PTR_ERR(trans); | ||
| 912 | goto out_unlock; | ||
| 913 | } | ||
| 910 | ret = btrfs_grow_device(trans, device, new_size); | 914 | ret = btrfs_grow_device(trans, device, new_size); |
| 911 | btrfs_commit_transaction(trans, root); | 915 | btrfs_commit_transaction(trans, root); |
| 912 | } else { | 916 | } else { |
| @@ -1898,7 +1902,10 @@ static noinline long btrfs_ioctl_clone(struct file *file, unsigned long srcfd, | |||
| 1898 | 1902 | ||
| 1899 | memcpy(&new_key, &key, sizeof(new_key)); | 1903 | memcpy(&new_key, &key, sizeof(new_key)); |
| 1900 | new_key.objectid = inode->i_ino; | 1904 | new_key.objectid = inode->i_ino; |
| 1901 | new_key.offset = key.offset + destoff - off; | 1905 | if (off <= key.offset) |
| 1906 | new_key.offset = key.offset + destoff - off; | ||
| 1907 | else | ||
| 1908 | new_key.offset = destoff; | ||
| 1902 | 1909 | ||
| 1903 | trans = btrfs_start_transaction(root, 1); | 1910 | trans = btrfs_start_transaction(root, 1); |
| 1904 | if (IS_ERR(trans)) { | 1911 | if (IS_ERR(trans)) { |
| @@ -2082,7 +2089,7 @@ static long btrfs_ioctl_trans_start(struct file *file) | |||
| 2082 | 2089 | ||
| 2083 | ret = -ENOMEM; | 2090 | ret = -ENOMEM; |
| 2084 | trans = btrfs_start_ioctl_transaction(root, 0); | 2091 | trans = btrfs_start_ioctl_transaction(root, 0); |
| 2085 | if (!trans) | 2092 | if (IS_ERR(trans)) |
| 2086 | goto out_drop; | 2093 | goto out_drop; |
| 2087 | 2094 | ||
| 2088 | file->private_data = trans; | 2095 | file->private_data = trans; |
| @@ -2138,9 +2145,9 @@ static long btrfs_ioctl_default_subvol(struct file *file, void __user *argp) | |||
| 2138 | path->leave_spinning = 1; | 2145 | path->leave_spinning = 1; |
| 2139 | 2146 | ||
| 2140 | trans = btrfs_start_transaction(root, 1); | 2147 | trans = btrfs_start_transaction(root, 1); |
| 2141 | if (!trans) { | 2148 | if (IS_ERR(trans)) { |
| 2142 | btrfs_free_path(path); | 2149 | btrfs_free_path(path); |
| 2143 | return -ENOMEM; | 2150 | return PTR_ERR(trans); |
| 2144 | } | 2151 | } |
| 2145 | 2152 | ||
| 2146 | dir_id = btrfs_super_root_dir(&root->fs_info->super_copy); | 2153 | dir_id = btrfs_super_root_dir(&root->fs_info->super_copy); |
| @@ -2334,6 +2341,8 @@ static noinline long btrfs_ioctl_start_sync(struct file *file, void __user *argp | |||
| 2334 | u64 transid; | 2341 | u64 transid; |
| 2335 | 2342 | ||
| 2336 | trans = btrfs_start_transaction(root, 0); | 2343 | trans = btrfs_start_transaction(root, 0); |
| 2344 | if (IS_ERR(trans)) | ||
| 2345 | return PTR_ERR(trans); | ||
| 2337 | transid = trans->transid; | 2346 | transid = trans->transid; |
| 2338 | btrfs_commit_transaction_async(trans, root, 0); | 2347 | btrfs_commit_transaction_async(trans, root, 0); |
| 2339 | 2348 | ||
diff --git a/fs/btrfs/ordered-data.c b/fs/btrfs/ordered-data.c index 2b61e1ddcd99..083a55477375 100644 --- a/fs/btrfs/ordered-data.c +++ b/fs/btrfs/ordered-data.c | |||
| @@ -141,7 +141,7 @@ static inline struct rb_node *tree_search(struct btrfs_ordered_inode_tree *tree, | |||
| 141 | u64 file_offset) | 141 | u64 file_offset) |
| 142 | { | 142 | { |
| 143 | struct rb_root *root = &tree->tree; | 143 | struct rb_root *root = &tree->tree; |
| 144 | struct rb_node *prev; | 144 | struct rb_node *prev = NULL; |
| 145 | struct rb_node *ret; | 145 | struct rb_node *ret; |
| 146 | struct btrfs_ordered_extent *entry; | 146 | struct btrfs_ordered_extent *entry; |
| 147 | 147 | ||
diff --git a/fs/btrfs/print-tree.c b/fs/btrfs/print-tree.c index 0d126be22b63..fb2605d998e9 100644 --- a/fs/btrfs/print-tree.c +++ b/fs/btrfs/print-tree.c | |||
| @@ -260,6 +260,7 @@ void btrfs_print_leaf(struct btrfs_root *root, struct extent_buffer *l) | |||
| 260 | #else | 260 | #else |
| 261 | BUG(); | 261 | BUG(); |
| 262 | #endif | 262 | #endif |
| 263 | break; | ||
| 263 | case BTRFS_BLOCK_GROUP_ITEM_KEY: | 264 | case BTRFS_BLOCK_GROUP_ITEM_KEY: |
| 264 | bi = btrfs_item_ptr(l, i, | 265 | bi = btrfs_item_ptr(l, i, |
| 265 | struct btrfs_block_group_item); | 266 | struct btrfs_block_group_item); |
diff --git a/fs/btrfs/relocation.c b/fs/btrfs/relocation.c index 045c9c2b2d7e..1f5556acb530 100644 --- a/fs/btrfs/relocation.c +++ b/fs/btrfs/relocation.c | |||
| @@ -2028,6 +2028,7 @@ static noinline_for_stack int merge_reloc_root(struct reloc_control *rc, | |||
| 2028 | 2028 | ||
| 2029 | while (1) { | 2029 | while (1) { |
| 2030 | trans = btrfs_start_transaction(root, 0); | 2030 | trans = btrfs_start_transaction(root, 0); |
| 2031 | BUG_ON(IS_ERR(trans)); | ||
| 2031 | trans->block_rsv = rc->block_rsv; | 2032 | trans->block_rsv = rc->block_rsv; |
| 2032 | 2033 | ||
| 2033 | ret = btrfs_block_rsv_check(trans, root, rc->block_rsv, | 2034 | ret = btrfs_block_rsv_check(trans, root, rc->block_rsv, |
| @@ -2147,6 +2148,12 @@ again: | |||
| 2147 | } | 2148 | } |
| 2148 | 2149 | ||
| 2149 | trans = btrfs_join_transaction(rc->extent_root, 1); | 2150 | trans = btrfs_join_transaction(rc->extent_root, 1); |
| 2151 | if (IS_ERR(trans)) { | ||
| 2152 | if (!err) | ||
| 2153 | btrfs_block_rsv_release(rc->extent_root, | ||
| 2154 | rc->block_rsv, num_bytes); | ||
| 2155 | return PTR_ERR(trans); | ||
| 2156 | } | ||
| 2150 | 2157 | ||
| 2151 | if (!err) { | 2158 | if (!err) { |
| 2152 | if (num_bytes != rc->merging_rsv_size) { | 2159 | if (num_bytes != rc->merging_rsv_size) { |
| @@ -3222,6 +3229,7 @@ truncate: | |||
| 3222 | trans = btrfs_join_transaction(root, 0); | 3229 | trans = btrfs_join_transaction(root, 0); |
| 3223 | if (IS_ERR(trans)) { | 3230 | if (IS_ERR(trans)) { |
| 3224 | btrfs_free_path(path); | 3231 | btrfs_free_path(path); |
| 3232 | ret = PTR_ERR(trans); | ||
| 3225 | goto out; | 3233 | goto out; |
| 3226 | } | 3234 | } |
| 3227 | 3235 | ||
| @@ -3628,6 +3636,7 @@ int prepare_to_relocate(struct reloc_control *rc) | |||
| 3628 | set_reloc_control(rc); | 3636 | set_reloc_control(rc); |
| 3629 | 3637 | ||
| 3630 | trans = btrfs_join_transaction(rc->extent_root, 1); | 3638 | trans = btrfs_join_transaction(rc->extent_root, 1); |
| 3639 | BUG_ON(IS_ERR(trans)); | ||
| 3631 | btrfs_commit_transaction(trans, rc->extent_root); | 3640 | btrfs_commit_transaction(trans, rc->extent_root); |
| 3632 | return 0; | 3641 | return 0; |
| 3633 | } | 3642 | } |
| @@ -3657,6 +3666,7 @@ static noinline_for_stack int relocate_block_group(struct reloc_control *rc) | |||
| 3657 | 3666 | ||
| 3658 | while (1) { | 3667 | while (1) { |
| 3659 | trans = btrfs_start_transaction(rc->extent_root, 0); | 3668 | trans = btrfs_start_transaction(rc->extent_root, 0); |
| 3669 | BUG_ON(IS_ERR(trans)); | ||
| 3660 | 3670 | ||
| 3661 | if (update_backref_cache(trans, &rc->backref_cache)) { | 3671 | if (update_backref_cache(trans, &rc->backref_cache)) { |
| 3662 | btrfs_end_transaction(trans, rc->extent_root); | 3672 | btrfs_end_transaction(trans, rc->extent_root); |
| @@ -3804,7 +3814,10 @@ static noinline_for_stack int relocate_block_group(struct reloc_control *rc) | |||
| 3804 | 3814 | ||
| 3805 | /* get rid of pinned extents */ | 3815 | /* get rid of pinned extents */ |
| 3806 | trans = btrfs_join_transaction(rc->extent_root, 1); | 3816 | trans = btrfs_join_transaction(rc->extent_root, 1); |
| 3807 | btrfs_commit_transaction(trans, rc->extent_root); | 3817 | if (IS_ERR(trans)) |
| 3818 | err = PTR_ERR(trans); | ||
| 3819 | else | ||
| 3820 | btrfs_commit_transaction(trans, rc->extent_root); | ||
| 3808 | out_free: | 3821 | out_free: |
| 3809 | btrfs_free_block_rsv(rc->extent_root, rc->block_rsv); | 3822 | btrfs_free_block_rsv(rc->extent_root, rc->block_rsv); |
| 3810 | btrfs_free_path(path); | 3823 | btrfs_free_path(path); |
| @@ -4022,6 +4035,7 @@ static noinline_for_stack int mark_garbage_root(struct btrfs_root *root) | |||
| 4022 | int ret; | 4035 | int ret; |
| 4023 | 4036 | ||
| 4024 | trans = btrfs_start_transaction(root->fs_info->tree_root, 0); | 4037 | trans = btrfs_start_transaction(root->fs_info->tree_root, 0); |
| 4038 | BUG_ON(IS_ERR(trans)); | ||
| 4025 | 4039 | ||
| 4026 | memset(&root->root_item.drop_progress, 0, | 4040 | memset(&root->root_item.drop_progress, 0, |
| 4027 | sizeof(root->root_item.drop_progress)); | 4041 | sizeof(root->root_item.drop_progress)); |
| @@ -4125,6 +4139,11 @@ int btrfs_recover_relocation(struct btrfs_root *root) | |||
| 4125 | set_reloc_control(rc); | 4139 | set_reloc_control(rc); |
| 4126 | 4140 | ||
| 4127 | trans = btrfs_join_transaction(rc->extent_root, 1); | 4141 | trans = btrfs_join_transaction(rc->extent_root, 1); |
| 4142 | if (IS_ERR(trans)) { | ||
| 4143 | unset_reloc_control(rc); | ||
| 4144 | err = PTR_ERR(trans); | ||
| 4145 | goto out_free; | ||
| 4146 | } | ||
| 4128 | 4147 | ||
| 4129 | rc->merge_reloc_tree = 1; | 4148 | rc->merge_reloc_tree = 1; |
| 4130 | 4149 | ||
| @@ -4154,9 +4173,13 @@ int btrfs_recover_relocation(struct btrfs_root *root) | |||
| 4154 | unset_reloc_control(rc); | 4173 | unset_reloc_control(rc); |
| 4155 | 4174 | ||
| 4156 | trans = btrfs_join_transaction(rc->extent_root, 1); | 4175 | trans = btrfs_join_transaction(rc->extent_root, 1); |
| 4157 | btrfs_commit_transaction(trans, rc->extent_root); | 4176 | if (IS_ERR(trans)) |
| 4158 | out: | 4177 | err = PTR_ERR(trans); |
| 4178 | else | ||
| 4179 | btrfs_commit_transaction(trans, rc->extent_root); | ||
| 4180 | out_free: | ||
| 4159 | kfree(rc); | 4181 | kfree(rc); |
| 4182 | out: | ||
| 4160 | while (!list_empty(&reloc_roots)) { | 4183 | while (!list_empty(&reloc_roots)) { |
| 4161 | reloc_root = list_entry(reloc_roots.next, | 4184 | reloc_root = list_entry(reloc_roots.next, |
| 4162 | struct btrfs_root, root_list); | 4185 | struct btrfs_root, root_list); |
diff --git a/fs/btrfs/super.c b/fs/btrfs/super.c index b2130c46fdb5..a004008f7d28 100644 --- a/fs/btrfs/super.c +++ b/fs/btrfs/super.c | |||
| @@ -383,7 +383,7 @@ static int btrfs_parse_early_options(const char *options, fmode_t flags, | |||
| 383 | struct btrfs_fs_devices **fs_devices) | 383 | struct btrfs_fs_devices **fs_devices) |
| 384 | { | 384 | { |
| 385 | substring_t args[MAX_OPT_ARGS]; | 385 | substring_t args[MAX_OPT_ARGS]; |
| 386 | char *opts, *p; | 386 | char *opts, *orig, *p; |
| 387 | int error = 0; | 387 | int error = 0; |
| 388 | int intarg; | 388 | int intarg; |
| 389 | 389 | ||
| @@ -397,6 +397,7 @@ static int btrfs_parse_early_options(const char *options, fmode_t flags, | |||
| 397 | opts = kstrdup(options, GFP_KERNEL); | 397 | opts = kstrdup(options, GFP_KERNEL); |
| 398 | if (!opts) | 398 | if (!opts) |
| 399 | return -ENOMEM; | 399 | return -ENOMEM; |
| 400 | orig = opts; | ||
| 400 | 401 | ||
| 401 | while ((p = strsep(&opts, ",")) != NULL) { | 402 | while ((p = strsep(&opts, ",")) != NULL) { |
| 402 | int token; | 403 | int token; |
| @@ -432,7 +433,7 @@ static int btrfs_parse_early_options(const char *options, fmode_t flags, | |||
| 432 | } | 433 | } |
| 433 | 434 | ||
| 434 | out_free_opts: | 435 | out_free_opts: |
| 435 | kfree(opts); | 436 | kfree(orig); |
| 436 | out: | 437 | out: |
| 437 | /* | 438 | /* |
| 438 | * If no subvolume name is specified we use the default one. Allocate | 439 | * If no subvolume name is specified we use the default one. Allocate |
| @@ -623,6 +624,8 @@ int btrfs_sync_fs(struct super_block *sb, int wait) | |||
| 623 | btrfs_wait_ordered_extents(root, 0, 0); | 624 | btrfs_wait_ordered_extents(root, 0, 0); |
| 624 | 625 | ||
| 625 | trans = btrfs_start_transaction(root, 0); | 626 | trans = btrfs_start_transaction(root, 0); |
| 627 | if (IS_ERR(trans)) | ||
| 628 | return PTR_ERR(trans); | ||
| 626 | ret = btrfs_commit_transaction(trans, root); | 629 | ret = btrfs_commit_transaction(trans, root); |
| 627 | return ret; | 630 | return ret; |
| 628 | } | 631 | } |
| @@ -761,6 +764,8 @@ static struct dentry *btrfs_mount(struct file_system_type *fs_type, int flags, | |||
| 761 | } | 764 | } |
| 762 | 765 | ||
| 763 | btrfs_close_devices(fs_devices); | 766 | btrfs_close_devices(fs_devices); |
| 767 | kfree(fs_info); | ||
| 768 | kfree(tree_root); | ||
| 764 | } else { | 769 | } else { |
| 765 | char b[BDEVNAME_SIZE]; | 770 | char b[BDEVNAME_SIZE]; |
| 766 | 771 | ||
diff --git a/fs/btrfs/transaction.c b/fs/btrfs/transaction.c index bae5c7b8bbe2..3d73c8d93bbb 100644 --- a/fs/btrfs/transaction.c +++ b/fs/btrfs/transaction.c | |||
| @@ -1161,6 +1161,11 @@ int btrfs_commit_transaction_async(struct btrfs_trans_handle *trans, | |||
| 1161 | INIT_DELAYED_WORK(&ac->work, do_async_commit); | 1161 | INIT_DELAYED_WORK(&ac->work, do_async_commit); |
| 1162 | ac->root = root; | 1162 | ac->root = root; |
| 1163 | ac->newtrans = btrfs_join_transaction(root, 0); | 1163 | ac->newtrans = btrfs_join_transaction(root, 0); |
| 1164 | if (IS_ERR(ac->newtrans)) { | ||
| 1165 | int err = PTR_ERR(ac->newtrans); | ||
| 1166 | kfree(ac); | ||
| 1167 | return err; | ||
| 1168 | } | ||
| 1164 | 1169 | ||
| 1165 | /* take transaction reference */ | 1170 | /* take transaction reference */ |
| 1166 | mutex_lock(&root->fs_info->trans_mutex); | 1171 | mutex_lock(&root->fs_info->trans_mutex); |
diff --git a/fs/btrfs/tree-log.c b/fs/btrfs/tree-log.c index 054744ac5719..a4bbb854dfd2 100644 --- a/fs/btrfs/tree-log.c +++ b/fs/btrfs/tree-log.c | |||
| @@ -338,6 +338,12 @@ static noinline int overwrite_item(struct btrfs_trans_handle *trans, | |||
| 338 | } | 338 | } |
| 339 | dst_copy = kmalloc(item_size, GFP_NOFS); | 339 | dst_copy = kmalloc(item_size, GFP_NOFS); |
| 340 | src_copy = kmalloc(item_size, GFP_NOFS); | 340 | src_copy = kmalloc(item_size, GFP_NOFS); |
| 341 | if (!dst_copy || !src_copy) { | ||
| 342 | btrfs_release_path(root, path); | ||
| 343 | kfree(dst_copy); | ||
| 344 | kfree(src_copy); | ||
| 345 | return -ENOMEM; | ||
| 346 | } | ||
| 341 | 347 | ||
| 342 | read_extent_buffer(eb, src_copy, src_ptr, item_size); | 348 | read_extent_buffer(eb, src_copy, src_ptr, item_size); |
| 343 | 349 | ||
| @@ -665,6 +671,9 @@ static noinline int drop_one_dir_item(struct btrfs_trans_handle *trans, | |||
| 665 | btrfs_dir_item_key_to_cpu(leaf, di, &location); | 671 | btrfs_dir_item_key_to_cpu(leaf, di, &location); |
| 666 | name_len = btrfs_dir_name_len(leaf, di); | 672 | name_len = btrfs_dir_name_len(leaf, di); |
| 667 | name = kmalloc(name_len, GFP_NOFS); | 673 | name = kmalloc(name_len, GFP_NOFS); |
| 674 | if (!name) | ||
| 675 | return -ENOMEM; | ||
| 676 | |||
| 668 | read_extent_buffer(leaf, name, (unsigned long)(di + 1), name_len); | 677 | read_extent_buffer(leaf, name, (unsigned long)(di + 1), name_len); |
| 669 | btrfs_release_path(root, path); | 678 | btrfs_release_path(root, path); |
| 670 | 679 | ||
| @@ -744,6 +753,9 @@ static noinline int backref_in_log(struct btrfs_root *log, | |||
| 744 | int match = 0; | 753 | int match = 0; |
| 745 | 754 | ||
| 746 | path = btrfs_alloc_path(); | 755 | path = btrfs_alloc_path(); |
| 756 | if (!path) | ||
| 757 | return -ENOMEM; | ||
| 758 | |||
| 747 | ret = btrfs_search_slot(NULL, log, key, path, 0, 0); | 759 | ret = btrfs_search_slot(NULL, log, key, path, 0, 0); |
| 748 | if (ret != 0) | 760 | if (ret != 0) |
| 749 | goto out; | 761 | goto out; |
| @@ -967,6 +979,8 @@ static noinline int fixup_inode_link_count(struct btrfs_trans_handle *trans, | |||
| 967 | key.offset = (u64)-1; | 979 | key.offset = (u64)-1; |
| 968 | 980 | ||
| 969 | path = btrfs_alloc_path(); | 981 | path = btrfs_alloc_path(); |
| 982 | if (!path) | ||
| 983 | return -ENOMEM; | ||
| 970 | 984 | ||
| 971 | while (1) { | 985 | while (1) { |
| 972 | ret = btrfs_search_slot(NULL, root, &key, path, 0, 0); | 986 | ret = btrfs_search_slot(NULL, root, &key, path, 0, 0); |
| @@ -1178,6 +1192,9 @@ static noinline int replay_one_name(struct btrfs_trans_handle *trans, | |||
| 1178 | 1192 | ||
| 1179 | name_len = btrfs_dir_name_len(eb, di); | 1193 | name_len = btrfs_dir_name_len(eb, di); |
| 1180 | name = kmalloc(name_len, GFP_NOFS); | 1194 | name = kmalloc(name_len, GFP_NOFS); |
| 1195 | if (!name) | ||
| 1196 | return -ENOMEM; | ||
| 1197 | |||
| 1181 | log_type = btrfs_dir_type(eb, di); | 1198 | log_type = btrfs_dir_type(eb, di); |
| 1182 | read_extent_buffer(eb, name, (unsigned long)(di + 1), | 1199 | read_extent_buffer(eb, name, (unsigned long)(di + 1), |
| 1183 | name_len); | 1200 | name_len); |
| @@ -1692,6 +1709,8 @@ static noinline int walk_down_log_tree(struct btrfs_trans_handle *trans, | |||
| 1692 | root_owner = btrfs_header_owner(parent); | 1709 | root_owner = btrfs_header_owner(parent); |
| 1693 | 1710 | ||
| 1694 | next = btrfs_find_create_tree_block(root, bytenr, blocksize); | 1711 | next = btrfs_find_create_tree_block(root, bytenr, blocksize); |
| 1712 | if (!next) | ||
| 1713 | return -ENOMEM; | ||
| 1695 | 1714 | ||
| 1696 | if (*level == 1) { | 1715 | if (*level == 1) { |
| 1697 | wc->process_func(root, next, wc, ptr_gen); | 1716 | wc->process_func(root, next, wc, ptr_gen); |
| @@ -2032,6 +2051,7 @@ int btrfs_sync_log(struct btrfs_trans_handle *trans, | |||
| 2032 | wait_log_commit(trans, log_root_tree, | 2051 | wait_log_commit(trans, log_root_tree, |
| 2033 | log_root_tree->log_transid); | 2052 | log_root_tree->log_transid); |
| 2034 | mutex_unlock(&log_root_tree->log_mutex); | 2053 | mutex_unlock(&log_root_tree->log_mutex); |
| 2054 | ret = 0; | ||
| 2035 | goto out; | 2055 | goto out; |
| 2036 | } | 2056 | } |
| 2037 | atomic_set(&log_root_tree->log_commit[index2], 1); | 2057 | atomic_set(&log_root_tree->log_commit[index2], 1); |
| @@ -2096,7 +2116,7 @@ out: | |||
| 2096 | smp_mb(); | 2116 | smp_mb(); |
| 2097 | if (waitqueue_active(&root->log_commit_wait[index1])) | 2117 | if (waitqueue_active(&root->log_commit_wait[index1])) |
| 2098 | wake_up(&root->log_commit_wait[index1]); | 2118 | wake_up(&root->log_commit_wait[index1]); |
| 2099 | return 0; | 2119 | return ret; |
| 2100 | } | 2120 | } |
| 2101 | 2121 | ||
| 2102 | static void free_log_tree(struct btrfs_trans_handle *trans, | 2122 | static void free_log_tree(struct btrfs_trans_handle *trans, |
| @@ -2194,6 +2214,9 @@ int btrfs_del_dir_entries_in_log(struct btrfs_trans_handle *trans, | |||
| 2194 | 2214 | ||
| 2195 | log = root->log_root; | 2215 | log = root->log_root; |
| 2196 | path = btrfs_alloc_path(); | 2216 | path = btrfs_alloc_path(); |
| 2217 | if (!path) | ||
| 2218 | return -ENOMEM; | ||
| 2219 | |||
| 2197 | di = btrfs_lookup_dir_item(trans, log, path, dir->i_ino, | 2220 | di = btrfs_lookup_dir_item(trans, log, path, dir->i_ino, |
| 2198 | name, name_len, -1); | 2221 | name, name_len, -1); |
| 2199 | if (IS_ERR(di)) { | 2222 | if (IS_ERR(di)) { |
| @@ -2594,6 +2617,9 @@ static noinline int copy_items(struct btrfs_trans_handle *trans, | |||
| 2594 | 2617 | ||
| 2595 | ins_data = kmalloc(nr * sizeof(struct btrfs_key) + | 2618 | ins_data = kmalloc(nr * sizeof(struct btrfs_key) + |
| 2596 | nr * sizeof(u32), GFP_NOFS); | 2619 | nr * sizeof(u32), GFP_NOFS); |
| 2620 | if (!ins_data) | ||
| 2621 | return -ENOMEM; | ||
| 2622 | |||
| 2597 | ins_sizes = (u32 *)ins_data; | 2623 | ins_sizes = (u32 *)ins_data; |
| 2598 | ins_keys = (struct btrfs_key *)(ins_data + nr * sizeof(u32)); | 2624 | ins_keys = (struct btrfs_key *)(ins_data + nr * sizeof(u32)); |
| 2599 | 2625 | ||
| @@ -2725,7 +2751,13 @@ static int btrfs_log_inode(struct btrfs_trans_handle *trans, | |||
| 2725 | log = root->log_root; | 2751 | log = root->log_root; |
| 2726 | 2752 | ||
| 2727 | path = btrfs_alloc_path(); | 2753 | path = btrfs_alloc_path(); |
| 2754 | if (!path) | ||
| 2755 | return -ENOMEM; | ||
| 2728 | dst_path = btrfs_alloc_path(); | 2756 | dst_path = btrfs_alloc_path(); |
| 2757 | if (!dst_path) { | ||
| 2758 | btrfs_free_path(path); | ||
| 2759 | return -ENOMEM; | ||
| 2760 | } | ||
| 2729 | 2761 | ||
| 2730 | min_key.objectid = inode->i_ino; | 2762 | min_key.objectid = inode->i_ino; |
| 2731 | min_key.type = BTRFS_INODE_ITEM_KEY; | 2763 | min_key.type = BTRFS_INODE_ITEM_KEY; |
| @@ -3080,6 +3112,7 @@ int btrfs_recover_log_trees(struct btrfs_root *log_root_tree) | |||
| 3080 | BUG_ON(!path); | 3112 | BUG_ON(!path); |
| 3081 | 3113 | ||
| 3082 | trans = btrfs_start_transaction(fs_info->tree_root, 0); | 3114 | trans = btrfs_start_transaction(fs_info->tree_root, 0); |
| 3115 | BUG_ON(IS_ERR(trans)); | ||
| 3083 | 3116 | ||
| 3084 | wc.trans = trans; | 3117 | wc.trans = trans; |
| 3085 | wc.pin = 1; | 3118 | wc.pin = 1; |
diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c index d158530233b7..2636a051e4b2 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; |
| @@ -1606,6 +1610,12 @@ int btrfs_init_new_device(struct btrfs_root *root, char *device_path) | |||
| 1606 | } | 1610 | } |
| 1607 | 1611 | ||
| 1608 | trans = btrfs_start_transaction(root, 0); | 1612 | trans = btrfs_start_transaction(root, 0); |
| 1613 | if (IS_ERR(trans)) { | ||
| 1614 | kfree(device); | ||
| 1615 | ret = PTR_ERR(trans); | ||
| 1616 | goto error; | ||
| 1617 | } | ||
| 1618 | |||
| 1609 | lock_chunks(root); | 1619 | lock_chunks(root); |
| 1610 | 1620 | ||
| 1611 | device->writeable = 1; | 1621 | device->writeable = 1; |
| @@ -1873,7 +1883,7 @@ static int btrfs_relocate_chunk(struct btrfs_root *root, | |||
| 1873 | return ret; | 1883 | return ret; |
| 1874 | 1884 | ||
| 1875 | trans = btrfs_start_transaction(root, 0); | 1885 | trans = btrfs_start_transaction(root, 0); |
| 1876 | BUG_ON(!trans); | 1886 | BUG_ON(IS_ERR(trans)); |
| 1877 | 1887 | ||
| 1878 | lock_chunks(root); | 1888 | lock_chunks(root); |
| 1879 | 1889 | ||
| @@ -2047,7 +2057,7 @@ int btrfs_balance(struct btrfs_root *dev_root) | |||
| 2047 | BUG_ON(ret); | 2057 | BUG_ON(ret); |
| 2048 | 2058 | ||
| 2049 | trans = btrfs_start_transaction(dev_root, 0); | 2059 | trans = btrfs_start_transaction(dev_root, 0); |
| 2050 | BUG_ON(!trans); | 2060 | BUG_ON(IS_ERR(trans)); |
| 2051 | 2061 | ||
| 2052 | ret = btrfs_grow_device(trans, device, old_size); | 2062 | ret = btrfs_grow_device(trans, device, old_size); |
| 2053 | BUG_ON(ret); | 2063 | BUG_ON(ret); |
| @@ -2213,6 +2223,11 @@ again: | |||
| 2213 | 2223 | ||
| 2214 | /* Shrinking succeeded, else we would be at "done". */ | 2224 | /* Shrinking succeeded, else we would be at "done". */ |
| 2215 | trans = btrfs_start_transaction(root, 0); | 2225 | trans = btrfs_start_transaction(root, 0); |
| 2226 | if (IS_ERR(trans)) { | ||
| 2227 | ret = PTR_ERR(trans); | ||
| 2228 | goto done; | ||
| 2229 | } | ||
| 2230 | |||
| 2216 | lock_chunks(root); | 2231 | lock_chunks(root); |
| 2217 | 2232 | ||
| 2218 | device->disk_total_bytes = new_size; | 2233 | device->disk_total_bytes = new_size; |
