diff options
Diffstat (limited to 'fs/btrfs')
| -rw-r--r-- | fs/btrfs/acl.c | 1 | ||||
| -rw-r--r-- | fs/btrfs/async-thread.c | 1 | ||||
| -rw-r--r-- | fs/btrfs/compression.c | 23 | ||||
| -rw-r--r-- | fs/btrfs/ctree.c | 5 | ||||
| -rw-r--r-- | fs/btrfs/ctree.h | 2 | ||||
| -rw-r--r-- | fs/btrfs/delayed-ref.c | 1 | ||||
| -rw-r--r-- | fs/btrfs/disk-io.c | 13 | ||||
| -rw-r--r-- | fs/btrfs/extent-tree.c | 24 | ||||
| -rw-r--r-- | fs/btrfs/extent_io.c | 16 | ||||
| -rw-r--r-- | fs/btrfs/extent_map.c | 1 | ||||
| -rw-r--r-- | fs/btrfs/file-item.c | 1 | ||||
| -rw-r--r-- | fs/btrfs/file.c | 1 | ||||
| -rw-r--r-- | fs/btrfs/free-space-cache.c | 1 | ||||
| -rw-r--r-- | fs/btrfs/inode.c | 60 | ||||
| -rw-r--r-- | fs/btrfs/ioctl.c | 8 | ||||
| -rw-r--r-- | fs/btrfs/locking.c | 1 | ||||
| -rw-r--r-- | fs/btrfs/ordered-data.c | 7 | ||||
| -rw-r--r-- | fs/btrfs/ref-cache.c | 1 | ||||
| -rw-r--r-- | fs/btrfs/relocation.c | 1 | ||||
| -rw-r--r-- | fs/btrfs/super.c | 24 | ||||
| -rw-r--r-- | fs/btrfs/transaction.c | 113 | ||||
| -rw-r--r-- | fs/btrfs/tree-log.c | 1 | ||||
| -rw-r--r-- | fs/btrfs/volumes.c | 11 |
23 files changed, 109 insertions, 208 deletions
diff --git a/fs/btrfs/acl.c b/fs/btrfs/acl.c index 6df6d6ed74fd..6ef7b26724ec 100644 --- a/fs/btrfs/acl.c +++ b/fs/btrfs/acl.c | |||
| @@ -22,6 +22,7 @@ | |||
| 22 | #include <linux/posix_acl_xattr.h> | 22 | #include <linux/posix_acl_xattr.h> |
| 23 | #include <linux/posix_acl.h> | 23 | #include <linux/posix_acl.h> |
| 24 | #include <linux/sched.h> | 24 | #include <linux/sched.h> |
| 25 | #include <linux/slab.h> | ||
| 25 | 26 | ||
| 26 | #include "ctree.h" | 27 | #include "ctree.h" |
| 27 | #include "btrfs_inode.h" | 28 | #include "btrfs_inode.h" |
diff --git a/fs/btrfs/async-thread.c b/fs/btrfs/async-thread.c index c0861e781cdb..462859a30141 100644 --- a/fs/btrfs/async-thread.c +++ b/fs/btrfs/async-thread.c | |||
| @@ -17,6 +17,7 @@ | |||
| 17 | */ | 17 | */ |
| 18 | 18 | ||
| 19 | #include <linux/kthread.h> | 19 | #include <linux/kthread.h> |
| 20 | #include <linux/slab.h> | ||
| 20 | #include <linux/list.h> | 21 | #include <linux/list.h> |
| 21 | #include <linux/spinlock.h> | 22 | #include <linux/spinlock.h> |
| 22 | #include <linux/freezer.h> | 23 | #include <linux/freezer.h> |
diff --git a/fs/btrfs/compression.c b/fs/btrfs/compression.c index 28b92a7218ab..396039b3a8a2 100644 --- a/fs/btrfs/compression.c +++ b/fs/btrfs/compression.c | |||
| @@ -31,7 +31,7 @@ | |||
| 31 | #include <linux/swap.h> | 31 | #include <linux/swap.h> |
| 32 | #include <linux/writeback.h> | 32 | #include <linux/writeback.h> |
| 33 | #include <linux/bit_spinlock.h> | 33 | #include <linux/bit_spinlock.h> |
| 34 | #include <linux/pagevec.h> | 34 | #include <linux/slab.h> |
| 35 | #include "compat.h" | 35 | #include "compat.h" |
| 36 | #include "ctree.h" | 36 | #include "ctree.h" |
| 37 | #include "disk-io.h" | 37 | #include "disk-io.h" |
| @@ -445,7 +445,6 @@ static noinline int add_ra_bio_pages(struct inode *inode, | |||
| 445 | unsigned long nr_pages = 0; | 445 | unsigned long nr_pages = 0; |
| 446 | struct extent_map *em; | 446 | struct extent_map *em; |
| 447 | struct address_space *mapping = inode->i_mapping; | 447 | struct address_space *mapping = inode->i_mapping; |
| 448 | struct pagevec pvec; | ||
| 449 | struct extent_map_tree *em_tree; | 448 | struct extent_map_tree *em_tree; |
| 450 | struct extent_io_tree *tree; | 449 | struct extent_io_tree *tree; |
| 451 | u64 end; | 450 | u64 end; |
| @@ -461,7 +460,6 @@ static noinline int add_ra_bio_pages(struct inode *inode, | |||
| 461 | 460 | ||
| 462 | end_index = (i_size_read(inode) - 1) >> PAGE_CACHE_SHIFT; | 461 | end_index = (i_size_read(inode) - 1) >> PAGE_CACHE_SHIFT; |
| 463 | 462 | ||
| 464 | pagevec_init(&pvec, 0); | ||
| 465 | while (last_offset < compressed_end) { | 463 | while (last_offset < compressed_end) { |
| 466 | page_index = last_offset >> PAGE_CACHE_SHIFT; | 464 | page_index = last_offset >> PAGE_CACHE_SHIFT; |
| 467 | 465 | ||
| @@ -478,26 +476,17 @@ static noinline int add_ra_bio_pages(struct inode *inode, | |||
| 478 | goto next; | 476 | goto next; |
| 479 | } | 477 | } |
| 480 | 478 | ||
| 481 | page = alloc_page(mapping_gfp_mask(mapping) & ~__GFP_FS); | 479 | page = __page_cache_alloc(mapping_gfp_mask(mapping) & |
| 480 | ~__GFP_FS); | ||
| 482 | if (!page) | 481 | if (!page) |
| 483 | break; | 482 | break; |
| 484 | 483 | ||
| 485 | page->index = page_index; | 484 | if (add_to_page_cache_lru(page, mapping, page_index, |
| 486 | /* | 485 | GFP_NOFS)) { |
| 487 | * what we want to do here is call add_to_page_cache_lru, | ||
| 488 | * but that isn't exported, so we reproduce it here | ||
| 489 | */ | ||
| 490 | if (add_to_page_cache(page, mapping, | ||
| 491 | page->index, GFP_NOFS)) { | ||
| 492 | page_cache_release(page); | 486 | page_cache_release(page); |
| 493 | goto next; | 487 | goto next; |
| 494 | } | 488 | } |
| 495 | 489 | ||
| 496 | /* open coding of lru_cache_add, also not exported */ | ||
| 497 | page_cache_get(page); | ||
| 498 | if (!pagevec_add(&pvec, page)) | ||
| 499 | __pagevec_lru_add_file(&pvec); | ||
| 500 | |||
| 501 | end = last_offset + PAGE_CACHE_SIZE - 1; | 490 | end = last_offset + PAGE_CACHE_SIZE - 1; |
| 502 | /* | 491 | /* |
| 503 | * at this point, we have a locked page in the page cache | 492 | * at this point, we have a locked page in the page cache |
| @@ -551,8 +540,6 @@ static noinline int add_ra_bio_pages(struct inode *inode, | |||
| 551 | next: | 540 | next: |
| 552 | last_offset += PAGE_CACHE_SIZE; | 541 | last_offset += PAGE_CACHE_SIZE; |
| 553 | } | 542 | } |
| 554 | if (pagevec_count(&pvec)) | ||
| 555 | __pagevec_lru_add_file(&pvec); | ||
| 556 | return 0; | 543 | return 0; |
| 557 | } | 544 | } |
| 558 | 545 | ||
diff --git a/fs/btrfs/ctree.c b/fs/btrfs/ctree.c index c4bc570a396e..6795a713b205 100644 --- a/fs/btrfs/ctree.c +++ b/fs/btrfs/ctree.c | |||
| @@ -17,6 +17,7 @@ | |||
| 17 | */ | 17 | */ |
| 18 | 18 | ||
| 19 | #include <linux/sched.h> | 19 | #include <linux/sched.h> |
| 20 | #include <linux/slab.h> | ||
| 20 | #include "ctree.h" | 21 | #include "ctree.h" |
| 21 | #include "disk-io.h" | 22 | #include "disk-io.h" |
| 22 | #include "transaction.h" | 23 | #include "transaction.h" |
| @@ -3040,6 +3041,10 @@ static noinline int setup_leaf_for_split(struct btrfs_trans_handle *trans, | |||
| 3040 | if (ret > 0 || item_size != btrfs_item_size_nr(leaf, path->slots[0])) | 3041 | if (ret > 0 || item_size != btrfs_item_size_nr(leaf, path->slots[0])) |
| 3041 | goto err; | 3042 | goto err; |
| 3042 | 3043 | ||
| 3044 | /* the leaf has changed, it now has room. return now */ | ||
| 3045 | if (btrfs_leaf_free_space(root, path->nodes[0]) >= ins_len) | ||
| 3046 | goto err; | ||
| 3047 | |||
| 3043 | if (key.type == BTRFS_EXTENT_DATA_KEY) { | 3048 | if (key.type == BTRFS_EXTENT_DATA_KEY) { |
| 3044 | fi = btrfs_item_ptr(leaf, path->slots[0], | 3049 | fi = btrfs_item_ptr(leaf, path->slots[0], |
| 3045 | struct btrfs_file_extent_item); | 3050 | struct btrfs_file_extent_item); |
diff --git a/fs/btrfs/ctree.h b/fs/btrfs/ctree.h index 0af2e3868573..746a7248678e 100644 --- a/fs/btrfs/ctree.h +++ b/fs/btrfs/ctree.h | |||
| @@ -26,6 +26,7 @@ | |||
| 26 | #include <linux/completion.h> | 26 | #include <linux/completion.h> |
| 27 | #include <linux/backing-dev.h> | 27 | #include <linux/backing-dev.h> |
| 28 | #include <linux/wait.h> | 28 | #include <linux/wait.h> |
| 29 | #include <linux/slab.h> | ||
| 29 | #include <asm/kmap_types.h> | 30 | #include <asm/kmap_types.h> |
| 30 | #include "extent_io.h" | 31 | #include "extent_io.h" |
| 31 | #include "extent_map.h" | 32 | #include "extent_map.h" |
| @@ -834,7 +835,6 @@ struct btrfs_fs_info { | |||
| 834 | u64 last_trans_log_full_commit; | 835 | u64 last_trans_log_full_commit; |
| 835 | u64 open_ioctl_trans; | 836 | u64 open_ioctl_trans; |
| 836 | unsigned long mount_opt; | 837 | unsigned long mount_opt; |
| 837 | u64 max_extent; | ||
| 838 | u64 max_inline; | 838 | u64 max_inline; |
| 839 | u64 alloc_start; | 839 | u64 alloc_start; |
| 840 | struct btrfs_transaction *running_transaction; | 840 | struct btrfs_transaction *running_transaction; |
diff --git a/fs/btrfs/delayed-ref.c b/fs/btrfs/delayed-ref.c index 84e6781413b1..902ce507c4e3 100644 --- a/fs/btrfs/delayed-ref.c +++ b/fs/btrfs/delayed-ref.c | |||
| @@ -17,6 +17,7 @@ | |||
| 17 | */ | 17 | */ |
| 18 | 18 | ||
| 19 | #include <linux/sched.h> | 19 | #include <linux/sched.h> |
| 20 | #include <linux/slab.h> | ||
| 20 | #include <linux/sort.h> | 21 | #include <linux/sort.h> |
| 21 | #include "ctree.h" | 22 | #include "ctree.h" |
| 22 | #include "delayed-ref.h" | 23 | #include "delayed-ref.h" |
diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c index 11d0ad30e203..e7b8f2c89ccb 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c | |||
| @@ -27,6 +27,7 @@ | |||
| 27 | #include <linux/kthread.h> | 27 | #include <linux/kthread.h> |
| 28 | #include <linux/freezer.h> | 28 | #include <linux/freezer.h> |
| 29 | #include <linux/crc32c.h> | 29 | #include <linux/crc32c.h> |
| 30 | #include <linux/slab.h> | ||
| 30 | #include "compat.h" | 31 | #include "compat.h" |
| 31 | #include "ctree.h" | 32 | #include "ctree.h" |
| 32 | #include "disk-io.h" | 33 | #include "disk-io.h" |
| @@ -1634,7 +1635,6 @@ struct btrfs_root *open_ctree(struct super_block *sb, | |||
| 1634 | atomic_set(&fs_info->async_submit_draining, 0); | 1635 | atomic_set(&fs_info->async_submit_draining, 0); |
| 1635 | atomic_set(&fs_info->nr_async_bios, 0); | 1636 | atomic_set(&fs_info->nr_async_bios, 0); |
| 1636 | fs_info->sb = sb; | 1637 | fs_info->sb = sb; |
| 1637 | fs_info->max_extent = (u64)-1; | ||
| 1638 | fs_info->max_inline = 8192 * 1024; | 1638 | fs_info->max_inline = 8192 * 1024; |
| 1639 | fs_info->metadata_ratio = 0; | 1639 | fs_info->metadata_ratio = 0; |
| 1640 | 1640 | ||
| @@ -1922,7 +1922,11 @@ struct btrfs_root *open_ctree(struct super_block *sb, | |||
| 1922 | 1922 | ||
| 1923 | csum_root->track_dirty = 1; | 1923 | csum_root->track_dirty = 1; |
| 1924 | 1924 | ||
| 1925 | btrfs_read_block_groups(extent_root); | 1925 | ret = btrfs_read_block_groups(extent_root); |
| 1926 | if (ret) { | ||
| 1927 | printk(KERN_ERR "Failed to read block groups: %d\n", ret); | ||
| 1928 | goto fail_block_groups; | ||
| 1929 | } | ||
| 1926 | 1930 | ||
| 1927 | fs_info->generation = generation; | 1931 | fs_info->generation = generation; |
| 1928 | fs_info->last_trans_committed = generation; | 1932 | fs_info->last_trans_committed = generation; |
| @@ -1932,7 +1936,7 @@ struct btrfs_root *open_ctree(struct super_block *sb, | |||
| 1932 | fs_info->cleaner_kthread = kthread_run(cleaner_kthread, tree_root, | 1936 | fs_info->cleaner_kthread = kthread_run(cleaner_kthread, tree_root, |
| 1933 | "btrfs-cleaner"); | 1937 | "btrfs-cleaner"); |
| 1934 | if (IS_ERR(fs_info->cleaner_kthread)) | 1938 | if (IS_ERR(fs_info->cleaner_kthread)) |
| 1935 | goto fail_csum_root; | 1939 | goto fail_block_groups; |
| 1936 | 1940 | ||
| 1937 | fs_info->transaction_kthread = kthread_run(transaction_kthread, | 1941 | fs_info->transaction_kthread = kthread_run(transaction_kthread, |
| 1938 | tree_root, | 1942 | tree_root, |
| @@ -2020,7 +2024,8 @@ fail_cleaner: | |||
| 2020 | filemap_write_and_wait(fs_info->btree_inode->i_mapping); | 2024 | filemap_write_and_wait(fs_info->btree_inode->i_mapping); |
| 2021 | invalidate_inode_pages2(fs_info->btree_inode->i_mapping); | 2025 | invalidate_inode_pages2(fs_info->btree_inode->i_mapping); |
| 2022 | 2026 | ||
| 2023 | fail_csum_root: | 2027 | fail_block_groups: |
| 2028 | btrfs_free_block_groups(fs_info); | ||
| 2024 | free_extent_buffer(csum_root->node); | 2029 | free_extent_buffer(csum_root->node); |
| 2025 | free_extent_buffer(csum_root->commit_root); | 2030 | free_extent_buffer(csum_root->commit_root); |
| 2026 | fail_dev_root: | 2031 | fail_dev_root: |
diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c index 1727b26fb194..9e23ffea7f54 100644 --- a/fs/btrfs/extent-tree.c +++ b/fs/btrfs/extent-tree.c | |||
| @@ -22,6 +22,7 @@ | |||
| 22 | #include <linux/sort.h> | 22 | #include <linux/sort.h> |
| 23 | #include <linux/rcupdate.h> | 23 | #include <linux/rcupdate.h> |
| 24 | #include <linux/kthread.h> | 24 | #include <linux/kthread.h> |
| 25 | #include <linux/slab.h> | ||
| 25 | #include "compat.h" | 26 | #include "compat.h" |
| 26 | #include "hash.h" | 27 | #include "hash.h" |
| 27 | #include "ctree.h" | 28 | #include "ctree.h" |
| @@ -2676,6 +2677,8 @@ static int update_space_info(struct btrfs_fs_info *info, u64 flags, | |||
| 2676 | 2677 | ||
| 2677 | INIT_LIST_HEAD(&found->block_groups); | 2678 | INIT_LIST_HEAD(&found->block_groups); |
| 2678 | init_rwsem(&found->groups_sem); | 2679 | init_rwsem(&found->groups_sem); |
| 2680 | init_waitqueue_head(&found->flush_wait); | ||
| 2681 | init_waitqueue_head(&found->allocate_wait); | ||
| 2679 | spin_lock_init(&found->lock); | 2682 | spin_lock_init(&found->lock); |
| 2680 | found->flags = flags; | 2683 | found->flags = flags; |
| 2681 | found->total_bytes = total_bytes; | 2684 | found->total_bytes = total_bytes; |
| @@ -2846,7 +2849,7 @@ int btrfs_unreserve_metadata_for_delalloc(struct btrfs_root *root, | |||
| 2846 | } | 2849 | } |
| 2847 | spin_unlock(&BTRFS_I(inode)->accounting_lock); | 2850 | spin_unlock(&BTRFS_I(inode)->accounting_lock); |
| 2848 | 2851 | ||
| 2849 | BTRFS_I(inode)->reserved_extents--; | 2852 | BTRFS_I(inode)->reserved_extents -= num_items; |
| 2850 | BUG_ON(BTRFS_I(inode)->reserved_extents < 0); | 2853 | BUG_ON(BTRFS_I(inode)->reserved_extents < 0); |
| 2851 | 2854 | ||
| 2852 | if (meta_sinfo->bytes_delalloc < num_bytes) { | 2855 | if (meta_sinfo->bytes_delalloc < num_bytes) { |
| @@ -2944,12 +2947,10 @@ static void flush_delalloc(struct btrfs_root *root, | |||
| 2944 | 2947 | ||
| 2945 | spin_lock(&info->lock); | 2948 | spin_lock(&info->lock); |
| 2946 | 2949 | ||
| 2947 | if (!info->flushing) { | 2950 | if (!info->flushing) |
| 2948 | info->flushing = 1; | 2951 | info->flushing = 1; |
| 2949 | init_waitqueue_head(&info->flush_wait); | 2952 | else |
| 2950 | } else { | ||
| 2951 | wait = true; | 2953 | wait = true; |
| 2952 | } | ||
| 2953 | 2954 | ||
| 2954 | spin_unlock(&info->lock); | 2955 | spin_unlock(&info->lock); |
| 2955 | 2956 | ||
| @@ -3011,7 +3012,6 @@ static int maybe_allocate_chunk(struct btrfs_root *root, | |||
| 3011 | if (!info->allocating_chunk) { | 3012 | if (!info->allocating_chunk) { |
| 3012 | info->force_alloc = 1; | 3013 | info->force_alloc = 1; |
| 3013 | info->allocating_chunk = 1; | 3014 | info->allocating_chunk = 1; |
| 3014 | init_waitqueue_head(&info->allocate_wait); | ||
| 3015 | } else { | 3015 | } else { |
| 3016 | wait = true; | 3016 | wait = true; |
| 3017 | } | 3017 | } |
| @@ -3111,7 +3111,7 @@ again: | |||
| 3111 | return -ENOSPC; | 3111 | return -ENOSPC; |
| 3112 | } | 3112 | } |
| 3113 | 3113 | ||
| 3114 | BTRFS_I(inode)->reserved_extents++; | 3114 | BTRFS_I(inode)->reserved_extents += num_items; |
| 3115 | check_force_delalloc(meta_sinfo); | 3115 | check_force_delalloc(meta_sinfo); |
| 3116 | spin_unlock(&meta_sinfo->lock); | 3116 | spin_unlock(&meta_sinfo->lock); |
| 3117 | 3117 | ||
| @@ -4170,6 +4170,10 @@ static noinline int find_free_extent(struct btrfs_trans_handle *trans, | |||
| 4170 | ins->offset = 0; | 4170 | ins->offset = 0; |
| 4171 | 4171 | ||
| 4172 | space_info = __find_space_info(root->fs_info, data); | 4172 | space_info = __find_space_info(root->fs_info, data); |
| 4173 | if (!space_info) { | ||
| 4174 | printk(KERN_ERR "No space info for %d\n", data); | ||
| 4175 | return -ENOSPC; | ||
| 4176 | } | ||
| 4173 | 4177 | ||
| 4174 | if (orig_root->ref_cows || empty_size) | 4178 | if (orig_root->ref_cows || empty_size) |
| 4175 | allowed_chunk_alloc = 1; | 4179 | allowed_chunk_alloc = 1; |
| @@ -5205,6 +5209,8 @@ static noinline int do_walk_down(struct btrfs_trans_handle *trans, | |||
| 5205 | next = btrfs_find_tree_block(root, bytenr, blocksize); | 5209 | next = btrfs_find_tree_block(root, bytenr, blocksize); |
| 5206 | if (!next) { | 5210 | if (!next) { |
| 5207 | next = btrfs_find_create_tree_block(root, bytenr, blocksize); | 5211 | next = btrfs_find_create_tree_block(root, bytenr, blocksize); |
| 5212 | if (!next) | ||
| 5213 | return -ENOMEM; | ||
| 5208 | reada = 1; | 5214 | reada = 1; |
| 5209 | } | 5215 | } |
| 5210 | btrfs_tree_lock(next); | 5216 | btrfs_tree_lock(next); |
| @@ -5417,7 +5423,8 @@ static noinline int walk_down_tree(struct btrfs_trans_handle *trans, | |||
| 5417 | if (ret > 0) { | 5423 | if (ret > 0) { |
| 5418 | path->slots[level]++; | 5424 | path->slots[level]++; |
| 5419 | continue; | 5425 | continue; |
| 5420 | } | 5426 | } else if (ret < 0) |
| 5427 | return ret; | ||
| 5421 | level = wc->level; | 5428 | level = wc->level; |
| 5422 | } | 5429 | } |
| 5423 | return 0; | 5430 | return 0; |
| @@ -7369,7 +7376,6 @@ static int find_first_block_group(struct btrfs_root *root, | |||
| 7369 | } | 7376 | } |
| 7370 | path->slots[0]++; | 7377 | path->slots[0]++; |
| 7371 | } | 7378 | } |
| 7372 | ret = -ENOENT; | ||
| 7373 | out: | 7379 | out: |
| 7374 | return ret; | 7380 | return ret; |
| 7375 | } | 7381 | } |
diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c index c99121ac5d6b..d2d03684fab2 100644 --- a/fs/btrfs/extent_io.c +++ b/fs/btrfs/extent_io.c | |||
| @@ -2,7 +2,6 @@ | |||
| 2 | #include <linux/slab.h> | 2 | #include <linux/slab.h> |
| 3 | #include <linux/bio.h> | 3 | #include <linux/bio.h> |
| 4 | #include <linux/mm.h> | 4 | #include <linux/mm.h> |
| 5 | #include <linux/gfp.h> | ||
| 6 | #include <linux/pagemap.h> | 5 | #include <linux/pagemap.h> |
| 7 | #include <linux/page-flags.h> | 6 | #include <linux/page-flags.h> |
| 8 | #include <linux/module.h> | 7 | #include <linux/module.h> |
| @@ -2679,33 +2678,20 @@ int extent_readpages(struct extent_io_tree *tree, | |||
| 2679 | { | 2678 | { |
| 2680 | struct bio *bio = NULL; | 2679 | struct bio *bio = NULL; |
| 2681 | unsigned page_idx; | 2680 | unsigned page_idx; |
| 2682 | struct pagevec pvec; | ||
| 2683 | unsigned long bio_flags = 0; | 2681 | unsigned long bio_flags = 0; |
| 2684 | 2682 | ||
| 2685 | pagevec_init(&pvec, 0); | ||
| 2686 | for (page_idx = 0; page_idx < nr_pages; page_idx++) { | 2683 | for (page_idx = 0; page_idx < nr_pages; page_idx++) { |
| 2687 | struct page *page = list_entry(pages->prev, struct page, lru); | 2684 | struct page *page = list_entry(pages->prev, struct page, lru); |
| 2688 | 2685 | ||
| 2689 | prefetchw(&page->flags); | 2686 | prefetchw(&page->flags); |
| 2690 | list_del(&page->lru); | 2687 | list_del(&page->lru); |
| 2691 | /* | 2688 | if (!add_to_page_cache_lru(page, mapping, |
| 2692 | * what we want to do here is call add_to_page_cache_lru, | ||
| 2693 | * but that isn't exported, so we reproduce it here | ||
| 2694 | */ | ||
| 2695 | if (!add_to_page_cache(page, mapping, | ||
| 2696 | page->index, GFP_KERNEL)) { | 2689 | page->index, GFP_KERNEL)) { |
| 2697 | |||
| 2698 | /* open coding of lru_cache_add, also not exported */ | ||
| 2699 | page_cache_get(page); | ||
| 2700 | if (!pagevec_add(&pvec, page)) | ||
| 2701 | __pagevec_lru_add_file(&pvec); | ||
| 2702 | __extent_read_full_page(tree, page, get_extent, | 2690 | __extent_read_full_page(tree, page, get_extent, |
| 2703 | &bio, 0, &bio_flags); | 2691 | &bio, 0, &bio_flags); |
| 2704 | } | 2692 | } |
| 2705 | page_cache_release(page); | 2693 | page_cache_release(page); |
| 2706 | } | 2694 | } |
| 2707 | if (pagevec_count(&pvec)) | ||
| 2708 | __pagevec_lru_add_file(&pvec); | ||
| 2709 | BUG_ON(!list_empty(pages)); | 2695 | BUG_ON(!list_empty(pages)); |
| 2710 | if (bio) | 2696 | if (bio) |
| 2711 | submit_one_bio(READ, bio, 0, bio_flags); | 2697 | submit_one_bio(READ, bio, 0, bio_flags); |
diff --git a/fs/btrfs/extent_map.c b/fs/btrfs/extent_map.c index 28d87ba60ce8..454ca52d6451 100644 --- a/fs/btrfs/extent_map.c +++ b/fs/btrfs/extent_map.c | |||
| @@ -1,5 +1,4 @@ | |||
| 1 | #include <linux/err.h> | 1 | #include <linux/err.h> |
| 2 | #include <linux/gfp.h> | ||
| 3 | #include <linux/slab.h> | 2 | #include <linux/slab.h> |
| 4 | #include <linux/module.h> | 3 | #include <linux/module.h> |
| 5 | #include <linux/spinlock.h> | 4 | #include <linux/spinlock.h> |
diff --git a/fs/btrfs/file-item.c b/fs/btrfs/file-item.c index 9b99886562d0..54a255065aa3 100644 --- a/fs/btrfs/file-item.c +++ b/fs/btrfs/file-item.c | |||
| @@ -17,6 +17,7 @@ | |||
| 17 | */ | 17 | */ |
| 18 | 18 | ||
| 19 | #include <linux/bio.h> | 19 | #include <linux/bio.h> |
| 20 | #include <linux/slab.h> | ||
| 20 | #include <linux/pagemap.h> | 21 | #include <linux/pagemap.h> |
| 21 | #include <linux/highmem.h> | 22 | #include <linux/highmem.h> |
| 22 | #include "ctree.h" | 23 | #include "ctree.h" |
diff --git a/fs/btrfs/file.c b/fs/btrfs/file.c index ee3323c7fc1c..29ff749ff4ca 100644 --- a/fs/btrfs/file.c +++ b/fs/btrfs/file.c | |||
| @@ -28,6 +28,7 @@ | |||
| 28 | #include <linux/writeback.h> | 28 | #include <linux/writeback.h> |
| 29 | #include <linux/statfs.h> | 29 | #include <linux/statfs.h> |
| 30 | #include <linux/compat.h> | 30 | #include <linux/compat.h> |
| 31 | #include <linux/slab.h> | ||
| 31 | #include "ctree.h" | 32 | #include "ctree.h" |
| 32 | #include "disk-io.h" | 33 | #include "disk-io.h" |
| 33 | #include "transaction.h" | 34 | #include "transaction.h" |
diff --git a/fs/btrfs/free-space-cache.c b/fs/btrfs/free-space-cache.c index dd831ed31eea..f488fac04d99 100644 --- a/fs/btrfs/free-space-cache.c +++ b/fs/btrfs/free-space-cache.c | |||
| @@ -18,6 +18,7 @@ | |||
| 18 | 18 | ||
| 19 | #include <linux/pagemap.h> | 19 | #include <linux/pagemap.h> |
| 20 | #include <linux/sched.h> | 20 | #include <linux/sched.h> |
| 21 | #include <linux/slab.h> | ||
| 21 | #include <linux/math64.h> | 22 | #include <linux/math64.h> |
| 22 | #include "ctree.h" | 23 | #include "ctree.h" |
| 23 | #include "free-space-cache.h" | 24 | #include "free-space-cache.h" |
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index 02bb099845fd..2bfdc641d4e3 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c | |||
| @@ -36,6 +36,7 @@ | |||
| 36 | #include <linux/xattr.h> | 36 | #include <linux/xattr.h> |
| 37 | #include <linux/posix_acl.h> | 37 | #include <linux/posix_acl.h> |
| 38 | #include <linux/falloc.h> | 38 | #include <linux/falloc.h> |
| 39 | #include <linux/slab.h> | ||
| 39 | #include "compat.h" | 40 | #include "compat.h" |
| 40 | #include "ctree.h" | 41 | #include "ctree.h" |
| 41 | #include "disk-io.h" | 42 | #include "disk-io.h" |
| @@ -796,7 +797,7 @@ static noinline int cow_file_range(struct inode *inode, | |||
| 796 | while (disk_num_bytes > 0) { | 797 | while (disk_num_bytes > 0) { |
| 797 | unsigned long op; | 798 | unsigned long op; |
| 798 | 799 | ||
| 799 | cur_alloc_size = min(disk_num_bytes, root->fs_info->max_extent); | 800 | cur_alloc_size = disk_num_bytes; |
| 800 | ret = btrfs_reserve_extent(trans, root, cur_alloc_size, | 801 | ret = btrfs_reserve_extent(trans, root, cur_alloc_size, |
| 801 | root->sectorsize, 0, alloc_hint, | 802 | root->sectorsize, 0, alloc_hint, |
| 802 | (u64)-1, &ins, 1); | 803 | (u64)-1, &ins, 1); |
| @@ -1227,30 +1228,9 @@ static int run_delalloc_range(struct inode *inode, struct page *locked_page, | |||
| 1227 | static int btrfs_split_extent_hook(struct inode *inode, | 1228 | static int btrfs_split_extent_hook(struct inode *inode, |
| 1228 | struct extent_state *orig, u64 split) | 1229 | struct extent_state *orig, u64 split) |
| 1229 | { | 1230 | { |
| 1230 | struct btrfs_root *root = BTRFS_I(inode)->root; | ||
| 1231 | u64 size; | ||
| 1232 | |||
| 1233 | if (!(orig->state & EXTENT_DELALLOC)) | 1231 | if (!(orig->state & EXTENT_DELALLOC)) |
| 1234 | return 0; | 1232 | return 0; |
| 1235 | 1233 | ||
| 1236 | size = orig->end - orig->start + 1; | ||
| 1237 | if (size > root->fs_info->max_extent) { | ||
| 1238 | u64 num_extents; | ||
| 1239 | u64 new_size; | ||
| 1240 | |||
| 1241 | new_size = orig->end - split + 1; | ||
| 1242 | num_extents = div64_u64(size + root->fs_info->max_extent - 1, | ||
| 1243 | root->fs_info->max_extent); | ||
| 1244 | |||
| 1245 | /* | ||
| 1246 | * if we break a large extent up then leave oustanding_extents | ||
| 1247 | * be, since we've already accounted for the large extent. | ||
| 1248 | */ | ||
| 1249 | if (div64_u64(new_size + root->fs_info->max_extent - 1, | ||
| 1250 | root->fs_info->max_extent) < num_extents) | ||
| 1251 | return 0; | ||
| 1252 | } | ||
| 1253 | |||
| 1254 | spin_lock(&BTRFS_I(inode)->accounting_lock); | 1234 | spin_lock(&BTRFS_I(inode)->accounting_lock); |
| 1255 | BTRFS_I(inode)->outstanding_extents++; | 1235 | BTRFS_I(inode)->outstanding_extents++; |
| 1256 | spin_unlock(&BTRFS_I(inode)->accounting_lock); | 1236 | spin_unlock(&BTRFS_I(inode)->accounting_lock); |
| @@ -1268,38 +1248,10 @@ static int btrfs_merge_extent_hook(struct inode *inode, | |||
| 1268 | struct extent_state *new, | 1248 | struct extent_state *new, |
| 1269 | struct extent_state *other) | 1249 | struct extent_state *other) |
| 1270 | { | 1250 | { |
| 1271 | struct btrfs_root *root = BTRFS_I(inode)->root; | ||
| 1272 | u64 new_size, old_size; | ||
| 1273 | u64 num_extents; | ||
| 1274 | |||
| 1275 | /* not delalloc, ignore it */ | 1251 | /* not delalloc, ignore it */ |
| 1276 | if (!(other->state & EXTENT_DELALLOC)) | 1252 | if (!(other->state & EXTENT_DELALLOC)) |
| 1277 | return 0; | 1253 | return 0; |
| 1278 | 1254 | ||
| 1279 | old_size = other->end - other->start + 1; | ||
| 1280 | if (new->start < other->start) | ||
| 1281 | new_size = other->end - new->start + 1; | ||
| 1282 | else | ||
| 1283 | new_size = new->end - other->start + 1; | ||
| 1284 | |||
| 1285 | /* we're not bigger than the max, unreserve the space and go */ | ||
| 1286 | if (new_size <= root->fs_info->max_extent) { | ||
| 1287 | spin_lock(&BTRFS_I(inode)->accounting_lock); | ||
| 1288 | BTRFS_I(inode)->outstanding_extents--; | ||
| 1289 | spin_unlock(&BTRFS_I(inode)->accounting_lock); | ||
| 1290 | return 0; | ||
| 1291 | } | ||
| 1292 | |||
| 1293 | /* | ||
| 1294 | * If we grew by another max_extent, just return, we want to keep that | ||
| 1295 | * reserved amount. | ||
| 1296 | */ | ||
| 1297 | num_extents = div64_u64(old_size + root->fs_info->max_extent - 1, | ||
| 1298 | root->fs_info->max_extent); | ||
| 1299 | if (div64_u64(new_size + root->fs_info->max_extent - 1, | ||
| 1300 | root->fs_info->max_extent) > num_extents) | ||
| 1301 | return 0; | ||
| 1302 | |||
| 1303 | spin_lock(&BTRFS_I(inode)->accounting_lock); | 1255 | spin_lock(&BTRFS_I(inode)->accounting_lock); |
| 1304 | BTRFS_I(inode)->outstanding_extents--; | 1256 | BTRFS_I(inode)->outstanding_extents--; |
| 1305 | spin_unlock(&BTRFS_I(inode)->accounting_lock); | 1257 | spin_unlock(&BTRFS_I(inode)->accounting_lock); |
| @@ -1328,6 +1280,7 @@ static int btrfs_set_bit_hook(struct inode *inode, u64 start, u64 end, | |||
| 1328 | BTRFS_I(inode)->outstanding_extents++; | 1280 | BTRFS_I(inode)->outstanding_extents++; |
| 1329 | spin_unlock(&BTRFS_I(inode)->accounting_lock); | 1281 | spin_unlock(&BTRFS_I(inode)->accounting_lock); |
| 1330 | btrfs_delalloc_reserve_space(root, inode, end - start + 1); | 1282 | btrfs_delalloc_reserve_space(root, inode, end - start + 1); |
| 1283 | |||
| 1331 | spin_lock(&root->fs_info->delalloc_lock); | 1284 | spin_lock(&root->fs_info->delalloc_lock); |
| 1332 | BTRFS_I(inode)->delalloc_bytes += end - start + 1; | 1285 | BTRFS_I(inode)->delalloc_bytes += end - start + 1; |
| 1333 | root->fs_info->delalloc_bytes += end - start + 1; | 1286 | root->fs_info->delalloc_bytes += end - start + 1; |
| @@ -1356,6 +1309,7 @@ static int btrfs_clear_bit_hook(struct inode *inode, | |||
| 1356 | 1309 | ||
| 1357 | if (bits & EXTENT_DO_ACCOUNTING) { | 1310 | if (bits & EXTENT_DO_ACCOUNTING) { |
| 1358 | spin_lock(&BTRFS_I(inode)->accounting_lock); | 1311 | spin_lock(&BTRFS_I(inode)->accounting_lock); |
| 1312 | WARN_ON(!BTRFS_I(inode)->outstanding_extents); | ||
| 1359 | BTRFS_I(inode)->outstanding_extents--; | 1313 | BTRFS_I(inode)->outstanding_extents--; |
| 1360 | spin_unlock(&BTRFS_I(inode)->accounting_lock); | 1314 | spin_unlock(&BTRFS_I(inode)->accounting_lock); |
| 1361 | btrfs_unreserve_metadata_for_delalloc(root, inode, 1); | 1315 | btrfs_unreserve_metadata_for_delalloc(root, inode, 1); |
| @@ -5384,7 +5338,6 @@ free: | |||
| 5384 | void btrfs_drop_inode(struct inode *inode) | 5338 | void btrfs_drop_inode(struct inode *inode) |
| 5385 | { | 5339 | { |
| 5386 | struct btrfs_root *root = BTRFS_I(inode)->root; | 5340 | struct btrfs_root *root = BTRFS_I(inode)->root; |
| 5387 | |||
| 5388 | if (inode->i_nlink > 0 && btrfs_root_refs(&root->root_item) == 0) | 5341 | if (inode->i_nlink > 0 && btrfs_root_refs(&root->root_item) == 0) |
| 5389 | generic_delete_inode(inode); | 5342 | generic_delete_inode(inode); |
| 5390 | else | 5343 | else |
| @@ -5788,18 +5741,15 @@ static int prealloc_file_range(struct inode *inode, u64 start, u64 end, | |||
| 5788 | struct btrfs_trans_handle *trans; | 5741 | struct btrfs_trans_handle *trans; |
| 5789 | struct btrfs_root *root = BTRFS_I(inode)->root; | 5742 | struct btrfs_root *root = BTRFS_I(inode)->root; |
| 5790 | struct btrfs_key ins; | 5743 | struct btrfs_key ins; |
| 5791 | u64 alloc_size; | ||
| 5792 | u64 cur_offset = start; | 5744 | u64 cur_offset = start; |
| 5793 | u64 num_bytes = end - start; | 5745 | u64 num_bytes = end - start; |
| 5794 | int ret = 0; | 5746 | int ret = 0; |
| 5795 | u64 i_size; | 5747 | u64 i_size; |
| 5796 | 5748 | ||
| 5797 | while (num_bytes > 0) { | 5749 | while (num_bytes > 0) { |
| 5798 | alloc_size = min(num_bytes, root->fs_info->max_extent); | ||
| 5799 | |||
| 5800 | trans = btrfs_start_transaction(root, 1); | 5750 | trans = btrfs_start_transaction(root, 1); |
| 5801 | 5751 | ||
| 5802 | ret = btrfs_reserve_extent(trans, root, alloc_size, | 5752 | ret = btrfs_reserve_extent(trans, root, num_bytes, |
| 5803 | root->sectorsize, 0, alloc_hint, | 5753 | root->sectorsize, 0, alloc_hint, |
| 5804 | (u64)-1, &ins, 1); | 5754 | (u64)-1, &ins, 1); |
| 5805 | if (ret) { | 5755 | if (ret) { |
diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c index 2845c6ceecd2..e84ef60ffe35 100644 --- a/fs/btrfs/ioctl.c +++ b/fs/btrfs/ioctl.c | |||
| @@ -39,6 +39,7 @@ | |||
| 39 | #include <linux/security.h> | 39 | #include <linux/security.h> |
| 40 | #include <linux/xattr.h> | 40 | #include <linux/xattr.h> |
| 41 | #include <linux/vmalloc.h> | 41 | #include <linux/vmalloc.h> |
| 42 | #include <linux/slab.h> | ||
| 42 | #include "compat.h" | 43 | #include "compat.h" |
| 43 | #include "ctree.h" | 44 | #include "ctree.h" |
| 44 | #include "disk-io.h" | 45 | #include "disk-io.h" |
| @@ -48,7 +49,6 @@ | |||
| 48 | #include "print-tree.h" | 49 | #include "print-tree.h" |
| 49 | #include "volumes.h" | 50 | #include "volumes.h" |
| 50 | #include "locking.h" | 51 | #include "locking.h" |
| 51 | #include "ctree.h" | ||
| 52 | 52 | ||
| 53 | /* Mask out flags that are inappropriate for the given type of inode. */ | 53 | /* Mask out flags that are inappropriate for the given type of inode. */ |
| 54 | static inline __u32 btrfs_mask_flags(umode_t mode, __u32 flags) | 54 | static inline __u32 btrfs_mask_flags(umode_t mode, __u32 flags) |
| @@ -511,7 +511,7 @@ static int should_defrag_range(struct inode *inode, u64 start, u64 len, | |||
| 511 | em = btrfs_get_extent(inode, NULL, 0, start, len, 0); | 511 | em = btrfs_get_extent(inode, NULL, 0, start, len, 0); |
| 512 | unlock_extent(io_tree, start, start + len - 1, GFP_NOFS); | 512 | unlock_extent(io_tree, start, start + len - 1, GFP_NOFS); |
| 513 | 513 | ||
| 514 | if (!em) | 514 | if (IS_ERR(em)) |
| 515 | return 0; | 515 | return 0; |
| 516 | } | 516 | } |
| 517 | 517 | ||
| @@ -1212,6 +1212,9 @@ static noinline int btrfs_ioctl_ino_lookup(struct file *file, | |||
| 1212 | return -EPERM; | 1212 | return -EPERM; |
| 1213 | 1213 | ||
| 1214 | args = kmalloc(sizeof(*args), GFP_KERNEL); | 1214 | args = kmalloc(sizeof(*args), GFP_KERNEL); |
| 1215 | if (!args) | ||
| 1216 | return -ENOMEM; | ||
| 1217 | |||
| 1215 | if (copy_from_user(args, argp, sizeof(*args))) { | 1218 | if (copy_from_user(args, argp, sizeof(*args))) { |
| 1216 | kfree(args); | 1219 | kfree(args); |
| 1217 | return -EFAULT; | 1220 | return -EFAULT; |
| @@ -1375,6 +1378,7 @@ static int btrfs_ioctl_defrag(struct file *file, void __user *argp) | |||
| 1375 | sizeof(*range))) { | 1378 | sizeof(*range))) { |
| 1376 | ret = -EFAULT; | 1379 | ret = -EFAULT; |
| 1377 | kfree(range); | 1380 | kfree(range); |
| 1381 | goto out; | ||
| 1378 | } | 1382 | } |
| 1379 | /* compression requires us to start the IO */ | 1383 | /* compression requires us to start the IO */ |
| 1380 | if ((range->flags & BTRFS_DEFRAG_RANGE_COMPRESS)) { | 1384 | if ((range->flags & BTRFS_DEFRAG_RANGE_COMPRESS)) { |
diff --git a/fs/btrfs/locking.c b/fs/btrfs/locking.c index 1c36e5cd8f55..6151f2ea38bb 100644 --- a/fs/btrfs/locking.c +++ b/fs/btrfs/locking.c | |||
| @@ -16,7 +16,6 @@ | |||
| 16 | * Boston, MA 021110-1307, USA. | 16 | * Boston, MA 021110-1307, USA. |
| 17 | */ | 17 | */ |
| 18 | #include <linux/sched.h> | 18 | #include <linux/sched.h> |
| 19 | #include <linux/gfp.h> | ||
| 20 | #include <linux/pagemap.h> | 19 | #include <linux/pagemap.h> |
| 21 | #include <linux/spinlock.h> | 20 | #include <linux/spinlock.h> |
| 22 | #include <linux/page-flags.h> | 21 | #include <linux/page-flags.h> |
diff --git a/fs/btrfs/ordered-data.c b/fs/btrfs/ordered-data.c index a8ffecd0b491..a127c0ebb2dc 100644 --- a/fs/btrfs/ordered-data.c +++ b/fs/btrfs/ordered-data.c | |||
| @@ -16,7 +16,6 @@ | |||
| 16 | * Boston, MA 021110-1307, USA. | 16 | * Boston, MA 021110-1307, USA. |
| 17 | */ | 17 | */ |
| 18 | 18 | ||
| 19 | #include <linux/gfp.h> | ||
| 20 | #include <linux/slab.h> | 19 | #include <linux/slab.h> |
| 21 | #include <linux/blkdev.h> | 20 | #include <linux/blkdev.h> |
| 22 | #include <linux/writeback.h> | 21 | #include <linux/writeback.h> |
| @@ -303,6 +302,7 @@ static int __btrfs_remove_ordered_extent(struct inode *inode, | |||
| 303 | struct btrfs_ordered_extent *entry) | 302 | struct btrfs_ordered_extent *entry) |
| 304 | { | 303 | { |
| 305 | struct btrfs_ordered_inode_tree *tree; | 304 | struct btrfs_ordered_inode_tree *tree; |
| 305 | struct btrfs_root *root = BTRFS_I(inode)->root; | ||
| 306 | struct rb_node *node; | 306 | struct rb_node *node; |
| 307 | 307 | ||
| 308 | tree = &BTRFS_I(inode)->ordered_tree; | 308 | tree = &BTRFS_I(inode)->ordered_tree; |
| @@ -312,12 +312,13 @@ static int __btrfs_remove_ordered_extent(struct inode *inode, | |||
| 312 | set_bit(BTRFS_ORDERED_COMPLETE, &entry->flags); | 312 | set_bit(BTRFS_ORDERED_COMPLETE, &entry->flags); |
| 313 | 313 | ||
| 314 | spin_lock(&BTRFS_I(inode)->accounting_lock); | 314 | spin_lock(&BTRFS_I(inode)->accounting_lock); |
| 315 | WARN_ON(!BTRFS_I(inode)->outstanding_extents); | ||
| 315 | BTRFS_I(inode)->outstanding_extents--; | 316 | BTRFS_I(inode)->outstanding_extents--; |
| 316 | spin_unlock(&BTRFS_I(inode)->accounting_lock); | 317 | spin_unlock(&BTRFS_I(inode)->accounting_lock); |
| 317 | btrfs_unreserve_metadata_for_delalloc(BTRFS_I(inode)->root, | 318 | btrfs_unreserve_metadata_for_delalloc(BTRFS_I(inode)->root, |
| 318 | inode, 1); | 319 | inode, 1); |
| 319 | 320 | ||
| 320 | spin_lock(&BTRFS_I(inode)->root->fs_info->ordered_extent_lock); | 321 | spin_lock(&root->fs_info->ordered_extent_lock); |
| 321 | list_del_init(&entry->root_extent_list); | 322 | list_del_init(&entry->root_extent_list); |
| 322 | 323 | ||
| 323 | /* | 324 | /* |
| @@ -329,7 +330,7 @@ static int __btrfs_remove_ordered_extent(struct inode *inode, | |||
| 329 | !mapping_tagged(inode->i_mapping, PAGECACHE_TAG_DIRTY)) { | 330 | !mapping_tagged(inode->i_mapping, PAGECACHE_TAG_DIRTY)) { |
| 330 | list_del_init(&BTRFS_I(inode)->ordered_operations); | 331 | list_del_init(&BTRFS_I(inode)->ordered_operations); |
| 331 | } | 332 | } |
| 332 | spin_unlock(&BTRFS_I(inode)->root->fs_info->ordered_extent_lock); | 333 | spin_unlock(&root->fs_info->ordered_extent_lock); |
| 333 | 334 | ||
| 334 | return 0; | 335 | return 0; |
| 335 | } | 336 | } |
diff --git a/fs/btrfs/ref-cache.c b/fs/btrfs/ref-cache.c index d0cc62bccb94..a97314cf6bd6 100644 --- a/fs/btrfs/ref-cache.c +++ b/fs/btrfs/ref-cache.c | |||
| @@ -17,6 +17,7 @@ | |||
| 17 | */ | 17 | */ |
| 18 | 18 | ||
| 19 | #include <linux/sched.h> | 19 | #include <linux/sched.h> |
| 20 | #include <linux/slab.h> | ||
| 20 | #include <linux/sort.h> | 21 | #include <linux/sort.h> |
| 21 | #include "ctree.h" | 22 | #include "ctree.h" |
| 22 | #include "ref-cache.h" | 23 | #include "ref-cache.h" |
diff --git a/fs/btrfs/relocation.c b/fs/btrfs/relocation.c index 0b23942cbc0d..e558dd941ded 100644 --- a/fs/btrfs/relocation.c +++ b/fs/btrfs/relocation.c | |||
| @@ -21,6 +21,7 @@ | |||
| 21 | #include <linux/writeback.h> | 21 | #include <linux/writeback.h> |
| 22 | #include <linux/blkdev.h> | 22 | #include <linux/blkdev.h> |
| 23 | #include <linux/rbtree.h> | 23 | #include <linux/rbtree.h> |
| 24 | #include <linux/slab.h> | ||
| 24 | #include "ctree.h" | 25 | #include "ctree.h" |
| 25 | #include "disk-io.h" | 26 | #include "disk-io.h" |
| 26 | #include "transaction.h" | 27 | #include "transaction.h" |
diff --git a/fs/btrfs/super.c b/fs/btrfs/super.c index 9ac612e6ca60..1866dff0538e 100644 --- a/fs/btrfs/super.c +++ b/fs/btrfs/super.c | |||
| @@ -38,6 +38,7 @@ | |||
| 38 | #include <linux/namei.h> | 38 | #include <linux/namei.h> |
| 39 | #include <linux/miscdevice.h> | 39 | #include <linux/miscdevice.h> |
| 40 | #include <linux/magic.h> | 40 | #include <linux/magic.h> |
| 41 | #include <linux/slab.h> | ||
| 41 | #include "compat.h" | 42 | #include "compat.h" |
| 42 | #include "ctree.h" | 43 | #include "ctree.h" |
| 43 | #include "disk-io.h" | 44 | #include "disk-io.h" |
| @@ -64,10 +65,9 @@ static void btrfs_put_super(struct super_block *sb) | |||
| 64 | 65 | ||
| 65 | enum { | 66 | enum { |
| 66 | Opt_degraded, Opt_subvol, Opt_subvolid, Opt_device, Opt_nodatasum, | 67 | Opt_degraded, Opt_subvol, Opt_subvolid, Opt_device, Opt_nodatasum, |
| 67 | Opt_nodatacow, Opt_max_extent, Opt_max_inline, Opt_alloc_start, | 68 | Opt_nodatacow, Opt_max_inline, Opt_alloc_start, Opt_nobarrier, Opt_ssd, |
| 68 | Opt_nobarrier, Opt_ssd, Opt_nossd, Opt_ssd_spread, Opt_thread_pool, | 69 | Opt_nossd, Opt_ssd_spread, Opt_thread_pool, Opt_noacl, Opt_compress, |
| 69 | Opt_noacl, Opt_compress, Opt_compress_force, Opt_notreelog, Opt_ratio, | 70 | Opt_compress_force, Opt_notreelog, Opt_ratio, Opt_flushoncommit, |
| 70 | Opt_flushoncommit, | ||
| 71 | Opt_discard, Opt_err, | 71 | Opt_discard, Opt_err, |
| 72 | }; | 72 | }; |
| 73 | 73 | ||
| @@ -79,7 +79,6 @@ static match_table_t tokens = { | |||
| 79 | {Opt_nodatasum, "nodatasum"}, | 79 | {Opt_nodatasum, "nodatasum"}, |
| 80 | {Opt_nodatacow, "nodatacow"}, | 80 | {Opt_nodatacow, "nodatacow"}, |
| 81 | {Opt_nobarrier, "nobarrier"}, | 81 | {Opt_nobarrier, "nobarrier"}, |
| 82 | {Opt_max_extent, "max_extent=%s"}, | ||
| 83 | {Opt_max_inline, "max_inline=%s"}, | 82 | {Opt_max_inline, "max_inline=%s"}, |
| 84 | {Opt_alloc_start, "alloc_start=%s"}, | 83 | {Opt_alloc_start, "alloc_start=%s"}, |
| 85 | {Opt_thread_pool, "thread_pool=%d"}, | 84 | {Opt_thread_pool, "thread_pool=%d"}, |
| @@ -188,18 +187,6 @@ int btrfs_parse_options(struct btrfs_root *root, char *options) | |||
| 188 | info->thread_pool_size); | 187 | info->thread_pool_size); |
| 189 | } | 188 | } |
| 190 | break; | 189 | break; |
| 191 | case Opt_max_extent: | ||
| 192 | num = match_strdup(&args[0]); | ||
| 193 | if (num) { | ||
| 194 | info->max_extent = memparse(num, NULL); | ||
| 195 | kfree(num); | ||
| 196 | |||
| 197 | info->max_extent = max_t(u64, | ||
| 198 | info->max_extent, root->sectorsize); | ||
| 199 | printk(KERN_INFO "btrfs: max_extent at %llu\n", | ||
| 200 | (unsigned long long)info->max_extent); | ||
| 201 | } | ||
| 202 | break; | ||
| 203 | case Opt_max_inline: | 190 | case Opt_max_inline: |
| 204 | num = match_strdup(&args[0]); | 191 | num = match_strdup(&args[0]); |
| 205 | if (num) { | 192 | if (num) { |
| @@ -529,9 +516,6 @@ static int btrfs_show_options(struct seq_file *seq, struct vfsmount *vfs) | |||
| 529 | seq_puts(seq, ",nodatacow"); | 516 | seq_puts(seq, ",nodatacow"); |
| 530 | if (btrfs_test_opt(root, NOBARRIER)) | 517 | if (btrfs_test_opt(root, NOBARRIER)) |
| 531 | seq_puts(seq, ",nobarrier"); | 518 | seq_puts(seq, ",nobarrier"); |
| 532 | if (info->max_extent != (u64)-1) | ||
| 533 | seq_printf(seq, ",max_extent=%llu", | ||
| 534 | (unsigned long long)info->max_extent); | ||
| 535 | if (info->max_inline != 8192 * 1024) | 519 | if (info->max_inline != 8192 * 1024) |
| 536 | seq_printf(seq, ",max_inline=%llu", | 520 | seq_printf(seq, ",max_inline=%llu", |
| 537 | (unsigned long long)info->max_inline); | 521 | (unsigned long long)info->max_inline); |
diff --git a/fs/btrfs/transaction.c b/fs/btrfs/transaction.c index 2d654c1c794d..2cb116099b90 100644 --- a/fs/btrfs/transaction.c +++ b/fs/btrfs/transaction.c | |||
| @@ -17,6 +17,7 @@ | |||
| 17 | */ | 17 | */ |
| 18 | 18 | ||
| 19 | #include <linux/fs.h> | 19 | #include <linux/fs.h> |
| 20 | #include <linux/slab.h> | ||
| 20 | #include <linux/sched.h> | 21 | #include <linux/sched.h> |
| 21 | #include <linux/writeback.h> | 22 | #include <linux/writeback.h> |
| 22 | #include <linux/pagemap.h> | 23 | #include <linux/pagemap.h> |
| @@ -147,18 +148,13 @@ static void wait_current_trans(struct btrfs_root *root) | |||
| 147 | while (1) { | 148 | while (1) { |
| 148 | prepare_to_wait(&root->fs_info->transaction_wait, &wait, | 149 | prepare_to_wait(&root->fs_info->transaction_wait, &wait, |
| 149 | TASK_UNINTERRUPTIBLE); | 150 | TASK_UNINTERRUPTIBLE); |
| 150 | if (cur_trans->blocked) { | 151 | if (!cur_trans->blocked) |
| 151 | mutex_unlock(&root->fs_info->trans_mutex); | ||
| 152 | schedule(); | ||
| 153 | mutex_lock(&root->fs_info->trans_mutex); | ||
| 154 | finish_wait(&root->fs_info->transaction_wait, | ||
| 155 | &wait); | ||
| 156 | } else { | ||
| 157 | finish_wait(&root->fs_info->transaction_wait, | ||
| 158 | &wait); | ||
| 159 | break; | 152 | break; |
| 160 | } | 153 | mutex_unlock(&root->fs_info->trans_mutex); |
| 154 | schedule(); | ||
| 155 | mutex_lock(&root->fs_info->trans_mutex); | ||
| 161 | } | 156 | } |
| 157 | finish_wait(&root->fs_info->transaction_wait, &wait); | ||
| 162 | put_transaction(cur_trans); | 158 | put_transaction(cur_trans); |
| 163 | } | 159 | } |
| 164 | } | 160 | } |
| @@ -760,10 +756,17 @@ static noinline int create_pending_snapshot(struct btrfs_trans_handle *trans, | |||
| 760 | struct btrfs_root_item *new_root_item; | 756 | struct btrfs_root_item *new_root_item; |
| 761 | struct btrfs_root *tree_root = fs_info->tree_root; | 757 | struct btrfs_root *tree_root = fs_info->tree_root; |
| 762 | struct btrfs_root *root = pending->root; | 758 | struct btrfs_root *root = pending->root; |
| 759 | struct btrfs_root *parent_root; | ||
| 760 | struct inode *parent_inode; | ||
| 763 | struct extent_buffer *tmp; | 761 | struct extent_buffer *tmp; |
| 764 | struct extent_buffer *old; | 762 | struct extent_buffer *old; |
| 765 | int ret; | 763 | int ret; |
| 766 | u64 objectid; | 764 | u64 objectid; |
| 765 | int namelen; | ||
| 766 | u64 index = 0; | ||
| 767 | |||
| 768 | parent_inode = pending->dentry->d_parent->d_inode; | ||
| 769 | parent_root = BTRFS_I(parent_inode)->root; | ||
| 767 | 770 | ||
| 768 | new_root_item = kmalloc(sizeof(*new_root_item), GFP_NOFS); | 771 | new_root_item = kmalloc(sizeof(*new_root_item), GFP_NOFS); |
| 769 | if (!new_root_item) { | 772 | if (!new_root_item) { |
| @@ -774,79 +777,59 @@ static noinline int create_pending_snapshot(struct btrfs_trans_handle *trans, | |||
| 774 | if (ret) | 777 | if (ret) |
| 775 | goto fail; | 778 | goto fail; |
| 776 | 779 | ||
| 777 | record_root_in_trans(trans, root); | ||
| 778 | btrfs_set_root_last_snapshot(&root->root_item, trans->transid); | ||
| 779 | memcpy(new_root_item, &root->root_item, sizeof(*new_root_item)); | ||
| 780 | |||
| 781 | key.objectid = objectid; | 780 | key.objectid = objectid; |
| 782 | /* record when the snapshot was created in key.offset */ | 781 | /* record when the snapshot was created in key.offset */ |
| 783 | key.offset = trans->transid; | 782 | key.offset = trans->transid; |
| 784 | btrfs_set_key_type(&key, BTRFS_ROOT_ITEM_KEY); | 783 | btrfs_set_key_type(&key, BTRFS_ROOT_ITEM_KEY); |
| 785 | 784 | ||
| 786 | old = btrfs_lock_root_node(root); | ||
| 787 | btrfs_cow_block(trans, root, old, NULL, 0, &old); | ||
| 788 | btrfs_set_lock_blocking(old); | ||
| 789 | |||
| 790 | btrfs_copy_root(trans, root, old, &tmp, objectid); | ||
| 791 | btrfs_tree_unlock(old); | ||
| 792 | free_extent_buffer(old); | ||
| 793 | |||
| 794 | btrfs_set_root_node(new_root_item, tmp); | ||
| 795 | ret = btrfs_insert_root(trans, root->fs_info->tree_root, &key, | ||
| 796 | new_root_item); | ||
| 797 | btrfs_tree_unlock(tmp); | ||
| 798 | free_extent_buffer(tmp); | ||
| 799 | if (ret) | ||
| 800 | goto fail; | ||
| 801 | |||
| 802 | key.offset = (u64)-1; | ||
| 803 | memcpy(&pending->root_key, &key, sizeof(key)); | 785 | memcpy(&pending->root_key, &key, sizeof(key)); |
| 804 | fail: | 786 | pending->root_key.offset = (u64)-1; |
| 805 | kfree(new_root_item); | ||
| 806 | return ret; | ||
| 807 | } | ||
| 808 | |||
| 809 | static noinline int finish_pending_snapshot(struct btrfs_fs_info *fs_info, | ||
| 810 | struct btrfs_pending_snapshot *pending) | ||
| 811 | { | ||
| 812 | int ret; | ||
| 813 | int namelen; | ||
| 814 | u64 index = 0; | ||
| 815 | struct btrfs_trans_handle *trans; | ||
| 816 | struct inode *parent_inode; | ||
| 817 | struct btrfs_root *parent_root; | ||
| 818 | |||
| 819 | parent_inode = pending->dentry->d_parent->d_inode; | ||
| 820 | parent_root = BTRFS_I(parent_inode)->root; | ||
| 821 | trans = btrfs_join_transaction(parent_root, 1); | ||
| 822 | 787 | ||
| 788 | record_root_in_trans(trans, parent_root); | ||
| 823 | /* | 789 | /* |
| 824 | * insert the directory item | 790 | * insert the directory item |
| 825 | */ | 791 | */ |
| 826 | namelen = strlen(pending->name); | 792 | namelen = strlen(pending->name); |
| 827 | ret = btrfs_set_inode_index(parent_inode, &index); | 793 | ret = btrfs_set_inode_index(parent_inode, &index); |
| 794 | BUG_ON(ret); | ||
| 828 | ret = btrfs_insert_dir_item(trans, parent_root, | 795 | ret = btrfs_insert_dir_item(trans, parent_root, |
| 829 | pending->name, namelen, | 796 | pending->name, namelen, |
| 830 | parent_inode->i_ino, | 797 | parent_inode->i_ino, |
| 831 | &pending->root_key, BTRFS_FT_DIR, index); | 798 | &pending->root_key, BTRFS_FT_DIR, index); |
| 832 | 799 | BUG_ON(ret); | |
| 833 | if (ret) | ||
| 834 | goto fail; | ||
| 835 | 800 | ||
| 836 | btrfs_i_size_write(parent_inode, parent_inode->i_size + namelen * 2); | 801 | btrfs_i_size_write(parent_inode, parent_inode->i_size + namelen * 2); |
| 837 | ret = btrfs_update_inode(trans, parent_root, parent_inode); | 802 | ret = btrfs_update_inode(trans, parent_root, parent_inode); |
| 838 | BUG_ON(ret); | 803 | BUG_ON(ret); |
| 839 | 804 | ||
| 805 | record_root_in_trans(trans, root); | ||
| 806 | btrfs_set_root_last_snapshot(&root->root_item, trans->transid); | ||
| 807 | memcpy(new_root_item, &root->root_item, sizeof(*new_root_item)); | ||
| 808 | |||
| 809 | old = btrfs_lock_root_node(root); | ||
| 810 | btrfs_cow_block(trans, root, old, NULL, 0, &old); | ||
| 811 | btrfs_set_lock_blocking(old); | ||
| 812 | |||
| 813 | btrfs_copy_root(trans, root, old, &tmp, objectid); | ||
| 814 | btrfs_tree_unlock(old); | ||
| 815 | free_extent_buffer(old); | ||
| 816 | |||
| 817 | btrfs_set_root_node(new_root_item, tmp); | ||
| 818 | ret = btrfs_insert_root(trans, root->fs_info->tree_root, &key, | ||
| 819 | new_root_item); | ||
| 820 | BUG_ON(ret); | ||
| 821 | btrfs_tree_unlock(tmp); | ||
| 822 | free_extent_buffer(tmp); | ||
| 823 | |||
| 840 | ret = btrfs_add_root_ref(trans, parent_root->fs_info->tree_root, | 824 | ret = btrfs_add_root_ref(trans, parent_root->fs_info->tree_root, |
| 841 | pending->root_key.objectid, | 825 | pending->root_key.objectid, |
| 842 | parent_root->root_key.objectid, | 826 | parent_root->root_key.objectid, |
| 843 | parent_inode->i_ino, index, pending->name, | 827 | parent_inode->i_ino, index, pending->name, |
| 844 | namelen); | 828 | namelen); |
| 845 | |||
| 846 | BUG_ON(ret); | 829 | BUG_ON(ret); |
| 847 | 830 | ||
| 848 | fail: | 831 | fail: |
| 849 | btrfs_end_transaction(trans, fs_info->fs_root); | 832 | kfree(new_root_item); |
| 850 | return ret; | 833 | return ret; |
| 851 | } | 834 | } |
| 852 | 835 | ||
| @@ -867,25 +850,6 @@ static noinline int create_pending_snapshots(struct btrfs_trans_handle *trans, | |||
| 867 | return 0; | 850 | return 0; |
| 868 | } | 851 | } |
| 869 | 852 | ||
| 870 | static noinline int finish_pending_snapshots(struct btrfs_trans_handle *trans, | ||
| 871 | struct btrfs_fs_info *fs_info) | ||
| 872 | { | ||
| 873 | struct btrfs_pending_snapshot *pending; | ||
| 874 | struct list_head *head = &trans->transaction->pending_snapshots; | ||
| 875 | int ret; | ||
| 876 | |||
| 877 | while (!list_empty(head)) { | ||
| 878 | pending = list_entry(head->next, | ||
| 879 | struct btrfs_pending_snapshot, list); | ||
| 880 | ret = finish_pending_snapshot(fs_info, pending); | ||
| 881 | BUG_ON(ret); | ||
| 882 | list_del(&pending->list); | ||
| 883 | kfree(pending->name); | ||
| 884 | kfree(pending); | ||
| 885 | } | ||
| 886 | return 0; | ||
| 887 | } | ||
| 888 | |||
| 889 | static void update_super_roots(struct btrfs_root *root) | 853 | static void update_super_roots(struct btrfs_root *root) |
| 890 | { | 854 | { |
| 891 | struct btrfs_root_item *root_item; | 855 | struct btrfs_root_item *root_item; |
| @@ -1097,9 +1061,6 @@ int btrfs_commit_transaction(struct btrfs_trans_handle *trans, | |||
| 1097 | 1061 | ||
| 1098 | btrfs_finish_extent_commit(trans, root); | 1062 | btrfs_finish_extent_commit(trans, root); |
| 1099 | 1063 | ||
| 1100 | /* do the directory inserts of any pending snapshot creations */ | ||
| 1101 | finish_pending_snapshots(trans, root->fs_info); | ||
| 1102 | |||
| 1103 | mutex_lock(&root->fs_info->trans_mutex); | 1064 | mutex_lock(&root->fs_info->trans_mutex); |
| 1104 | 1065 | ||
| 1105 | cur_trans->commit_done = 1; | 1066 | cur_trans->commit_done = 1; |
diff --git a/fs/btrfs/tree-log.c b/fs/btrfs/tree-log.c index 1255fcc8ade5..af57dd2b43d4 100644 --- a/fs/btrfs/tree-log.c +++ b/fs/btrfs/tree-log.c | |||
| @@ -17,6 +17,7 @@ | |||
| 17 | */ | 17 | */ |
| 18 | 18 | ||
| 19 | #include <linux/sched.h> | 19 | #include <linux/sched.h> |
| 20 | #include <linux/slab.h> | ||
| 20 | #include "ctree.h" | 21 | #include "ctree.h" |
| 21 | #include "transaction.h" | 22 | #include "transaction.h" |
| 22 | #include "disk-io.h" | 23 | #include "disk-io.h" |
diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c index 9df8e3f1ccab..aa7dc36dac78 100644 --- a/fs/btrfs/volumes.c +++ b/fs/btrfs/volumes.c | |||
| @@ -17,6 +17,7 @@ | |||
| 17 | */ | 17 | */ |
| 18 | #include <linux/sched.h> | 18 | #include <linux/sched.h> |
| 19 | #include <linux/bio.h> | 19 | #include <linux/bio.h> |
| 20 | #include <linux/slab.h> | ||
| 20 | #include <linux/buffer_head.h> | 21 | #include <linux/buffer_head.h> |
| 21 | #include <linux/blkdev.h> | 22 | #include <linux/blkdev.h> |
| 22 | #include <linux/random.h> | 23 | #include <linux/random.h> |
| @@ -2198,9 +2199,9 @@ static int __btrfs_alloc_chunk(struct btrfs_trans_handle *trans, | |||
| 2198 | min_stripes = 2; | 2199 | min_stripes = 2; |
| 2199 | } | 2200 | } |
| 2200 | if (type & (BTRFS_BLOCK_GROUP_RAID1)) { | 2201 | if (type & (BTRFS_BLOCK_GROUP_RAID1)) { |
| 2201 | num_stripes = min_t(u64, 2, fs_devices->rw_devices); | 2202 | if (fs_devices->rw_devices < 2) |
| 2202 | if (num_stripes < 2) | ||
| 2203 | return -ENOSPC; | 2203 | return -ENOSPC; |
| 2204 | num_stripes = 2; | ||
| 2204 | min_stripes = 2; | 2205 | min_stripes = 2; |
| 2205 | } | 2206 | } |
| 2206 | if (type & (BTRFS_BLOCK_GROUP_RAID10)) { | 2207 | if (type & (BTRFS_BLOCK_GROUP_RAID10)) { |
| @@ -2244,8 +2245,10 @@ again: | |||
| 2244 | do_div(calc_size, stripe_len); | 2245 | do_div(calc_size, stripe_len); |
| 2245 | calc_size *= stripe_len; | 2246 | calc_size *= stripe_len; |
| 2246 | } | 2247 | } |
| 2248 | |||
| 2247 | /* we don't want tiny stripes */ | 2249 | /* we don't want tiny stripes */ |
| 2248 | calc_size = max_t(u64, min_stripe_size, calc_size); | 2250 | if (!looped) |
| 2251 | calc_size = max_t(u64, min_stripe_size, calc_size); | ||
| 2249 | 2252 | ||
| 2250 | do_div(calc_size, stripe_len); | 2253 | do_div(calc_size, stripe_len); |
| 2251 | calc_size *= stripe_len; | 2254 | calc_size *= stripe_len; |
| @@ -3389,6 +3392,8 @@ int btrfs_read_chunk_tree(struct btrfs_root *root) | |||
| 3389 | key.type = 0; | 3392 | key.type = 0; |
| 3390 | again: | 3393 | again: |
| 3391 | ret = btrfs_search_slot(NULL, root, &key, path, 0, 0); | 3394 | ret = btrfs_search_slot(NULL, root, &key, path, 0, 0); |
| 3395 | if (ret < 0) | ||
| 3396 | goto error; | ||
| 3392 | while (1) { | 3397 | while (1) { |
| 3393 | leaf = path->nodes[0]; | 3398 | leaf = path->nodes[0]; |
| 3394 | slot = path->slots[0]; | 3399 | slot = path->slots[0]; |
