diff options
Diffstat (limited to 'fs/btrfs')
| -rw-r--r-- | fs/btrfs/backref.c | 14 | ||||
| -rw-r--r-- | fs/btrfs/btrfs_inode.h | 6 | ||||
| -rw-r--r-- | fs/btrfs/ctree.c | 20 | ||||
| -rw-r--r-- | fs/btrfs/ctree.h | 4 | ||||
| -rw-r--r-- | fs/btrfs/disk-io.c | 32 | ||||
| -rw-r--r-- | fs/btrfs/extent-tree.c | 285 | ||||
| -rw-r--r-- | fs/btrfs/file-item.c | 2 | ||||
| -rw-r--r-- | fs/btrfs/file.c | 26 | ||||
| -rw-r--r-- | fs/btrfs/inode.c | 71 | ||||
| -rw-r--r-- | fs/btrfs/ordered-data.c | 123 | ||||
| -rw-r--r-- | fs/btrfs/ordered-data.h | 5 | ||||
| -rw-r--r-- | fs/btrfs/qgroup.c | 169 | ||||
| -rw-r--r-- | fs/btrfs/qgroup.h | 1 | ||||
| -rw-r--r-- | fs/btrfs/super.c | 60 | ||||
| -rw-r--r-- | fs/btrfs/transaction.c | 33 | ||||
| -rw-r--r-- | fs/btrfs/transaction.h | 1 | ||||
| -rw-r--r-- | fs/btrfs/ulist.h | 15 |
17 files changed, 553 insertions, 314 deletions
diff --git a/fs/btrfs/backref.c b/fs/btrfs/backref.c index e25564bfcb46..54a201dac7f9 100644 --- a/fs/btrfs/backref.c +++ b/fs/btrfs/backref.c | |||
| @@ -276,9 +276,8 @@ static int add_all_parents(struct btrfs_root *root, struct btrfs_path *path, | |||
| 276 | } | 276 | } |
| 277 | if (ret > 0) | 277 | if (ret > 0) |
| 278 | goto next; | 278 | goto next; |
| 279 | ret = ulist_add_merge(parents, eb->start, | 279 | ret = ulist_add_merge_ptr(parents, eb->start, |
| 280 | (uintptr_t)eie, | 280 | eie, (void **)&old, GFP_NOFS); |
| 281 | (u64 *)&old, GFP_NOFS); | ||
| 282 | if (ret < 0) | 281 | if (ret < 0) |
| 283 | break; | 282 | break; |
| 284 | if (!ret && extent_item_pos) { | 283 | if (!ret && extent_item_pos) { |
| @@ -1001,16 +1000,19 @@ again: | |||
| 1001 | ret = -EIO; | 1000 | ret = -EIO; |
| 1002 | goto out; | 1001 | goto out; |
| 1003 | } | 1002 | } |
| 1003 | btrfs_tree_read_lock(eb); | ||
| 1004 | btrfs_set_lock_blocking_rw(eb, BTRFS_READ_LOCK); | ||
| 1004 | ret = find_extent_in_eb(eb, bytenr, | 1005 | ret = find_extent_in_eb(eb, bytenr, |
| 1005 | *extent_item_pos, &eie); | 1006 | *extent_item_pos, &eie); |
| 1007 | btrfs_tree_read_unlock_blocking(eb); | ||
| 1006 | free_extent_buffer(eb); | 1008 | free_extent_buffer(eb); |
| 1007 | if (ret < 0) | 1009 | if (ret < 0) |
| 1008 | goto out; | 1010 | goto out; |
| 1009 | ref->inode_list = eie; | 1011 | ref->inode_list = eie; |
| 1010 | } | 1012 | } |
| 1011 | ret = ulist_add_merge(refs, ref->parent, | 1013 | ret = ulist_add_merge_ptr(refs, ref->parent, |
| 1012 | (uintptr_t)ref->inode_list, | 1014 | ref->inode_list, |
| 1013 | (u64 *)&eie, GFP_NOFS); | 1015 | (void **)&eie, GFP_NOFS); |
| 1014 | if (ret < 0) | 1016 | if (ret < 0) |
| 1015 | goto out; | 1017 | goto out; |
| 1016 | if (!ret && extent_item_pos) { | 1018 | if (!ret && extent_item_pos) { |
diff --git a/fs/btrfs/btrfs_inode.h b/fs/btrfs/btrfs_inode.h index 4794923c410c..43527fd78825 100644 --- a/fs/btrfs/btrfs_inode.h +++ b/fs/btrfs/btrfs_inode.h | |||
| @@ -84,12 +84,6 @@ struct btrfs_inode { | |||
| 84 | */ | 84 | */ |
| 85 | struct list_head delalloc_inodes; | 85 | struct list_head delalloc_inodes; |
| 86 | 86 | ||
| 87 | /* | ||
| 88 | * list for tracking inodes that must be sent to disk before a | ||
| 89 | * rename or truncate commit | ||
| 90 | */ | ||
| 91 | struct list_head ordered_operations; | ||
| 92 | |||
| 93 | /* node for the red-black tree that links inodes in subvolume root */ | 87 | /* node for the red-black tree that links inodes in subvolume root */ |
| 94 | struct rb_node rb_node; | 88 | struct rb_node rb_node; |
| 95 | 89 | ||
diff --git a/fs/btrfs/ctree.c b/fs/btrfs/ctree.c index aeab453b8e24..44ee5d2e52a4 100644 --- a/fs/btrfs/ctree.c +++ b/fs/btrfs/ctree.c | |||
| @@ -280,9 +280,9 @@ int btrfs_copy_root(struct btrfs_trans_handle *trans, | |||
| 280 | 280 | ||
| 281 | WARN_ON(btrfs_header_generation(buf) > trans->transid); | 281 | WARN_ON(btrfs_header_generation(buf) > trans->transid); |
| 282 | if (new_root_objectid == BTRFS_TREE_RELOC_OBJECTID) | 282 | if (new_root_objectid == BTRFS_TREE_RELOC_OBJECTID) |
| 283 | ret = btrfs_inc_ref(trans, root, cow, 1, 1); | 283 | ret = btrfs_inc_ref(trans, root, cow, 1); |
| 284 | else | 284 | else |
| 285 | ret = btrfs_inc_ref(trans, root, cow, 0, 1); | 285 | ret = btrfs_inc_ref(trans, root, cow, 0); |
| 286 | 286 | ||
| 287 | if (ret) | 287 | if (ret) |
| 288 | return ret; | 288 | return ret; |
| @@ -1035,14 +1035,14 @@ static noinline int update_ref_for_cow(struct btrfs_trans_handle *trans, | |||
| 1035 | if ((owner == root->root_key.objectid || | 1035 | if ((owner == root->root_key.objectid || |
| 1036 | root->root_key.objectid == BTRFS_TREE_RELOC_OBJECTID) && | 1036 | root->root_key.objectid == BTRFS_TREE_RELOC_OBJECTID) && |
| 1037 | !(flags & BTRFS_BLOCK_FLAG_FULL_BACKREF)) { | 1037 | !(flags & BTRFS_BLOCK_FLAG_FULL_BACKREF)) { |
| 1038 | ret = btrfs_inc_ref(trans, root, buf, 1, 1); | 1038 | ret = btrfs_inc_ref(trans, root, buf, 1); |
| 1039 | BUG_ON(ret); /* -ENOMEM */ | 1039 | BUG_ON(ret); /* -ENOMEM */ |
| 1040 | 1040 | ||
| 1041 | if (root->root_key.objectid == | 1041 | if (root->root_key.objectid == |
| 1042 | BTRFS_TREE_RELOC_OBJECTID) { | 1042 | BTRFS_TREE_RELOC_OBJECTID) { |
| 1043 | ret = btrfs_dec_ref(trans, root, buf, 0, 1); | 1043 | ret = btrfs_dec_ref(trans, root, buf, 0); |
| 1044 | BUG_ON(ret); /* -ENOMEM */ | 1044 | BUG_ON(ret); /* -ENOMEM */ |
| 1045 | ret = btrfs_inc_ref(trans, root, cow, 1, 1); | 1045 | ret = btrfs_inc_ref(trans, root, cow, 1); |
| 1046 | BUG_ON(ret); /* -ENOMEM */ | 1046 | BUG_ON(ret); /* -ENOMEM */ |
| 1047 | } | 1047 | } |
| 1048 | new_flags |= BTRFS_BLOCK_FLAG_FULL_BACKREF; | 1048 | new_flags |= BTRFS_BLOCK_FLAG_FULL_BACKREF; |
| @@ -1050,9 +1050,9 @@ static noinline int update_ref_for_cow(struct btrfs_trans_handle *trans, | |||
| 1050 | 1050 | ||
| 1051 | if (root->root_key.objectid == | 1051 | if (root->root_key.objectid == |
| 1052 | BTRFS_TREE_RELOC_OBJECTID) | 1052 | BTRFS_TREE_RELOC_OBJECTID) |
| 1053 | ret = btrfs_inc_ref(trans, root, cow, 1, 1); | 1053 | ret = btrfs_inc_ref(trans, root, cow, 1); |
| 1054 | else | 1054 | else |
| 1055 | ret = btrfs_inc_ref(trans, root, cow, 0, 1); | 1055 | ret = btrfs_inc_ref(trans, root, cow, 0); |
| 1056 | BUG_ON(ret); /* -ENOMEM */ | 1056 | BUG_ON(ret); /* -ENOMEM */ |
| 1057 | } | 1057 | } |
| 1058 | if (new_flags != 0) { | 1058 | if (new_flags != 0) { |
| @@ -1069,11 +1069,11 @@ static noinline int update_ref_for_cow(struct btrfs_trans_handle *trans, | |||
| 1069 | if (flags & BTRFS_BLOCK_FLAG_FULL_BACKREF) { | 1069 | if (flags & BTRFS_BLOCK_FLAG_FULL_BACKREF) { |
| 1070 | if (root->root_key.objectid == | 1070 | if (root->root_key.objectid == |
| 1071 | BTRFS_TREE_RELOC_OBJECTID) | 1071 | BTRFS_TREE_RELOC_OBJECTID) |
| 1072 | ret = btrfs_inc_ref(trans, root, cow, 1, 1); | 1072 | ret = btrfs_inc_ref(trans, root, cow, 1); |
| 1073 | else | 1073 | else |
| 1074 | ret = btrfs_inc_ref(trans, root, cow, 0, 1); | 1074 | ret = btrfs_inc_ref(trans, root, cow, 0); |
| 1075 | BUG_ON(ret); /* -ENOMEM */ | 1075 | BUG_ON(ret); /* -ENOMEM */ |
| 1076 | ret = btrfs_dec_ref(trans, root, buf, 1, 1); | 1076 | ret = btrfs_dec_ref(trans, root, buf, 1); |
| 1077 | BUG_ON(ret); /* -ENOMEM */ | 1077 | BUG_ON(ret); /* -ENOMEM */ |
| 1078 | } | 1078 | } |
| 1079 | clean_tree_block(trans, root, buf); | 1079 | clean_tree_block(trans, root, buf); |
diff --git a/fs/btrfs/ctree.h b/fs/btrfs/ctree.h index be91397f4e92..8e29b614fe93 100644 --- a/fs/btrfs/ctree.h +++ b/fs/btrfs/ctree.h | |||
| @@ -3326,9 +3326,9 @@ int btrfs_reserve_extent(struct btrfs_root *root, u64 num_bytes, | |||
| 3326 | u64 min_alloc_size, u64 empty_size, u64 hint_byte, | 3326 | u64 min_alloc_size, u64 empty_size, u64 hint_byte, |
| 3327 | struct btrfs_key *ins, int is_data, int delalloc); | 3327 | struct btrfs_key *ins, int is_data, int delalloc); |
| 3328 | int btrfs_inc_ref(struct btrfs_trans_handle *trans, struct btrfs_root *root, | 3328 | int btrfs_inc_ref(struct btrfs_trans_handle *trans, struct btrfs_root *root, |
| 3329 | struct extent_buffer *buf, int full_backref, int no_quota); | 3329 | struct extent_buffer *buf, int full_backref); |
| 3330 | int btrfs_dec_ref(struct btrfs_trans_handle *trans, struct btrfs_root *root, | 3330 | int btrfs_dec_ref(struct btrfs_trans_handle *trans, struct btrfs_root *root, |
| 3331 | struct extent_buffer *buf, int full_backref, int no_quota); | 3331 | struct extent_buffer *buf, int full_backref); |
| 3332 | int btrfs_set_disk_extent_flags(struct btrfs_trans_handle *trans, | 3332 | int btrfs_set_disk_extent_flags(struct btrfs_trans_handle *trans, |
| 3333 | struct btrfs_root *root, | 3333 | struct btrfs_root *root, |
| 3334 | u64 bytenr, u64 num_bytes, u64 flags, | 3334 | u64 bytenr, u64 num_bytes, u64 flags, |
diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c index 08e65e9cf2aa..d0ed9e664f7d 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c | |||
| @@ -60,8 +60,6 @@ static void end_workqueue_fn(struct btrfs_work *work); | |||
| 60 | static void free_fs_root(struct btrfs_root *root); | 60 | static void free_fs_root(struct btrfs_root *root); |
| 61 | static int btrfs_check_super_valid(struct btrfs_fs_info *fs_info, | 61 | static int btrfs_check_super_valid(struct btrfs_fs_info *fs_info, |
| 62 | int read_only); | 62 | int read_only); |
| 63 | static void btrfs_destroy_ordered_operations(struct btrfs_transaction *t, | ||
| 64 | struct btrfs_root *root); | ||
| 65 | static void btrfs_destroy_ordered_extents(struct btrfs_root *root); | 63 | static void btrfs_destroy_ordered_extents(struct btrfs_root *root); |
| 66 | static int btrfs_destroy_delayed_refs(struct btrfs_transaction *trans, | 64 | static int btrfs_destroy_delayed_refs(struct btrfs_transaction *trans, |
| 67 | struct btrfs_root *root); | 65 | struct btrfs_root *root); |
| @@ -3829,34 +3827,6 @@ static void btrfs_error_commit_super(struct btrfs_root *root) | |||
| 3829 | btrfs_cleanup_transaction(root); | 3827 | btrfs_cleanup_transaction(root); |
| 3830 | } | 3828 | } |
| 3831 | 3829 | ||
| 3832 | static void btrfs_destroy_ordered_operations(struct btrfs_transaction *t, | ||
| 3833 | struct btrfs_root *root) | ||
| 3834 | { | ||
| 3835 | struct btrfs_inode *btrfs_inode; | ||
| 3836 | struct list_head splice; | ||
| 3837 | |||
| 3838 | INIT_LIST_HEAD(&splice); | ||
| 3839 | |||
| 3840 | mutex_lock(&root->fs_info->ordered_operations_mutex); | ||
| 3841 | spin_lock(&root->fs_info->ordered_root_lock); | ||
| 3842 | |||
| 3843 | list_splice_init(&t->ordered_operations, &splice); | ||
| 3844 | while (!list_empty(&splice)) { | ||
| 3845 | btrfs_inode = list_entry(splice.next, struct btrfs_inode, | ||
| 3846 | ordered_operations); | ||
| 3847 | |||
| 3848 | list_del_init(&btrfs_inode->ordered_operations); | ||
| 3849 | spin_unlock(&root->fs_info->ordered_root_lock); | ||
| 3850 | |||
| 3851 | btrfs_invalidate_inodes(btrfs_inode->root); | ||
| 3852 | |||
| 3853 | spin_lock(&root->fs_info->ordered_root_lock); | ||
| 3854 | } | ||
| 3855 | |||
| 3856 | spin_unlock(&root->fs_info->ordered_root_lock); | ||
| 3857 | mutex_unlock(&root->fs_info->ordered_operations_mutex); | ||
| 3858 | } | ||
| 3859 | |||
| 3860 | static void btrfs_destroy_ordered_extents(struct btrfs_root *root) | 3830 | static void btrfs_destroy_ordered_extents(struct btrfs_root *root) |
| 3861 | { | 3831 | { |
| 3862 | struct btrfs_ordered_extent *ordered; | 3832 | struct btrfs_ordered_extent *ordered; |
| @@ -4093,8 +4063,6 @@ again: | |||
| 4093 | void btrfs_cleanup_one_transaction(struct btrfs_transaction *cur_trans, | 4063 | void btrfs_cleanup_one_transaction(struct btrfs_transaction *cur_trans, |
| 4094 | struct btrfs_root *root) | 4064 | struct btrfs_root *root) |
| 4095 | { | 4065 | { |
| 4096 | btrfs_destroy_ordered_operations(cur_trans, root); | ||
| 4097 | |||
| 4098 | btrfs_destroy_delayed_refs(cur_trans, root); | 4066 | btrfs_destroy_delayed_refs(cur_trans, root); |
| 4099 | 4067 | ||
| 4100 | cur_trans->state = TRANS_STATE_COMMIT_START; | 4068 | cur_trans->state = TRANS_STATE_COMMIT_START; |
diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c index 813537f362f9..102ed3143976 100644 --- a/fs/btrfs/extent-tree.c +++ b/fs/btrfs/extent-tree.c | |||
| @@ -3057,7 +3057,7 @@ out: | |||
| 3057 | static int __btrfs_mod_ref(struct btrfs_trans_handle *trans, | 3057 | static int __btrfs_mod_ref(struct btrfs_trans_handle *trans, |
| 3058 | struct btrfs_root *root, | 3058 | struct btrfs_root *root, |
| 3059 | struct extent_buffer *buf, | 3059 | struct extent_buffer *buf, |
| 3060 | int full_backref, int inc, int no_quota) | 3060 | int full_backref, int inc) |
| 3061 | { | 3061 | { |
| 3062 | u64 bytenr; | 3062 | u64 bytenr; |
| 3063 | u64 num_bytes; | 3063 | u64 num_bytes; |
| @@ -3111,7 +3111,7 @@ static int __btrfs_mod_ref(struct btrfs_trans_handle *trans, | |||
| 3111 | key.offset -= btrfs_file_extent_offset(buf, fi); | 3111 | key.offset -= btrfs_file_extent_offset(buf, fi); |
| 3112 | ret = process_func(trans, root, bytenr, num_bytes, | 3112 | ret = process_func(trans, root, bytenr, num_bytes, |
| 3113 | parent, ref_root, key.objectid, | 3113 | parent, ref_root, key.objectid, |
| 3114 | key.offset, no_quota); | 3114 | key.offset, 1); |
| 3115 | if (ret) | 3115 | if (ret) |
| 3116 | goto fail; | 3116 | goto fail; |
| 3117 | } else { | 3117 | } else { |
| @@ -3119,7 +3119,7 @@ static int __btrfs_mod_ref(struct btrfs_trans_handle *trans, | |||
| 3119 | num_bytes = btrfs_level_size(root, level - 1); | 3119 | num_bytes = btrfs_level_size(root, level - 1); |
| 3120 | ret = process_func(trans, root, bytenr, num_bytes, | 3120 | ret = process_func(trans, root, bytenr, num_bytes, |
| 3121 | parent, ref_root, level - 1, 0, | 3121 | parent, ref_root, level - 1, 0, |
| 3122 | no_quota); | 3122 | 1); |
| 3123 | if (ret) | 3123 | if (ret) |
| 3124 | goto fail; | 3124 | goto fail; |
| 3125 | } | 3125 | } |
| @@ -3130,15 +3130,15 @@ fail: | |||
| 3130 | } | 3130 | } |
| 3131 | 3131 | ||
| 3132 | int btrfs_inc_ref(struct btrfs_trans_handle *trans, struct btrfs_root *root, | 3132 | int btrfs_inc_ref(struct btrfs_trans_handle *trans, struct btrfs_root *root, |
| 3133 | struct extent_buffer *buf, int full_backref, int no_quota) | 3133 | struct extent_buffer *buf, int full_backref) |
| 3134 | { | 3134 | { |
| 3135 | return __btrfs_mod_ref(trans, root, buf, full_backref, 1, no_quota); | 3135 | return __btrfs_mod_ref(trans, root, buf, full_backref, 1); |
| 3136 | } | 3136 | } |
| 3137 | 3137 | ||
| 3138 | int btrfs_dec_ref(struct btrfs_trans_handle *trans, struct btrfs_root *root, | 3138 | int btrfs_dec_ref(struct btrfs_trans_handle *trans, struct btrfs_root *root, |
| 3139 | struct extent_buffer *buf, int full_backref, int no_quota) | 3139 | struct extent_buffer *buf, int full_backref) |
| 3140 | { | 3140 | { |
| 3141 | return __btrfs_mod_ref(trans, root, buf, full_backref, 0, no_quota); | 3141 | return __btrfs_mod_ref(trans, root, buf, full_backref, 0); |
| 3142 | } | 3142 | } |
| 3143 | 3143 | ||
| 3144 | static int write_one_cache_group(struct btrfs_trans_handle *trans, | 3144 | static int write_one_cache_group(struct btrfs_trans_handle *trans, |
| @@ -7478,6 +7478,220 @@ reada: | |||
| 7478 | wc->reada_slot = slot; | 7478 | wc->reada_slot = slot; |
| 7479 | } | 7479 | } |
| 7480 | 7480 | ||
| 7481 | static int account_leaf_items(struct btrfs_trans_handle *trans, | ||
| 7482 | struct btrfs_root *root, | ||
| 7483 | struct extent_buffer *eb) | ||
| 7484 | { | ||
| 7485 | int nr = btrfs_header_nritems(eb); | ||
| 7486 | int i, extent_type, ret; | ||
| 7487 | struct btrfs_key key; | ||
| 7488 | struct btrfs_file_extent_item *fi; | ||
| 7489 | u64 bytenr, num_bytes; | ||
| 7490 | |||
| 7491 | for (i = 0; i < nr; i++) { | ||
| 7492 | btrfs_item_key_to_cpu(eb, &key, i); | ||
| 7493 | |||
| 7494 | if (key.type != BTRFS_EXTENT_DATA_KEY) | ||
| 7495 | continue; | ||
| 7496 | |||
| 7497 | fi = btrfs_item_ptr(eb, i, struct btrfs_file_extent_item); | ||
| 7498 | /* filter out non qgroup-accountable extents */ | ||
| 7499 | extent_type = btrfs_file_extent_type(eb, fi); | ||
| 7500 | |||
| 7501 | if (extent_type == BTRFS_FILE_EXTENT_INLINE) | ||
| 7502 | continue; | ||
| 7503 | |||
| 7504 | bytenr = btrfs_file_extent_disk_bytenr(eb, fi); | ||
| 7505 | if (!bytenr) | ||
| 7506 | continue; | ||
| 7507 | |||
| 7508 | num_bytes = btrfs_file_extent_disk_num_bytes(eb, fi); | ||
| 7509 | |||
| 7510 | ret = btrfs_qgroup_record_ref(trans, root->fs_info, | ||
| 7511 | root->objectid, | ||
| 7512 | bytenr, num_bytes, | ||
| 7513 | BTRFS_QGROUP_OPER_SUB_SUBTREE, 0); | ||
| 7514 | if (ret) | ||
| 7515 | return ret; | ||
| 7516 | } | ||
| 7517 | return 0; | ||
| 7518 | } | ||
| 7519 | |||
| 7520 | /* | ||
| 7521 | * Walk up the tree from the bottom, freeing leaves and any interior | ||
| 7522 | * nodes which have had all slots visited. If a node (leaf or | ||
| 7523 | * interior) is freed, the node above it will have it's slot | ||
| 7524 | * incremented. The root node will never be freed. | ||
| 7525 | * | ||
| 7526 | * At the end of this function, we should have a path which has all | ||
| 7527 | * slots incremented to the next position for a search. If we need to | ||
| 7528 | * read a new node it will be NULL and the node above it will have the | ||
| 7529 | * correct slot selected for a later read. | ||
| 7530 | * | ||
| 7531 | * If we increment the root nodes slot counter past the number of | ||
| 7532 | * elements, 1 is returned to signal completion of the search. | ||
| 7533 | */ | ||
| 7534 | static int adjust_slots_upwards(struct btrfs_root *root, | ||
| 7535 | struct btrfs_path *path, int root_level) | ||
| 7536 | { | ||
| 7537 | int level = 0; | ||
| 7538 | int nr, slot; | ||
| 7539 | struct extent_buffer *eb; | ||
| 7540 | |||
| 7541 | if (root_level == 0) | ||
| 7542 | return 1; | ||
| 7543 | |||
| 7544 | while (level <= root_level) { | ||
| 7545 | eb = path->nodes[level]; | ||
| 7546 | nr = btrfs_header_nritems(eb); | ||
| 7547 | path->slots[level]++; | ||
| 7548 | slot = path->slots[level]; | ||
| 7549 | if (slot >= nr || level == 0) { | ||
| 7550 | /* | ||
| 7551 | * Don't free the root - we will detect this | ||
| 7552 | * condition after our loop and return a | ||
| 7553 | * positive value for caller to stop walking the tree. | ||
| 7554 | */ | ||
| 7555 | if (level != root_level) { | ||
| 7556 | btrfs_tree_unlock_rw(eb, path->locks[level]); | ||
| 7557 | path->locks[level] = 0; | ||
| 7558 | |||
| 7559 | free_extent_buffer(eb); | ||
| 7560 | path->nodes[level] = NULL; | ||
| 7561 | path->slots[level] = 0; | ||
| 7562 | } | ||
| 7563 | } else { | ||
| 7564 | /* | ||
| 7565 | * We have a valid slot to walk back down | ||
| 7566 | * from. Stop here so caller can process these | ||
| 7567 | * new nodes. | ||
| 7568 | */ | ||
| 7569 | break; | ||
| 7570 | } | ||
| 7571 | |||
| 7572 | level++; | ||
| 7573 | } | ||
| 7574 | |||
| 7575 | eb = path->nodes[root_level]; | ||
| 7576 | if (path->slots[root_level] >= btrfs_header_nritems(eb)) | ||
| 7577 | return 1; | ||
| 7578 | |||
| 7579 | return 0; | ||
| 7580 | } | ||
| 7581 | |||
| 7582 | /* | ||
| 7583 | * root_eb is the subtree root and is locked before this function is called. | ||
| 7584 | */ | ||
| 7585 | static int account_shared_subtree(struct btrfs_trans_handle *trans, | ||
| 7586 | struct btrfs_root *root, | ||
| 7587 | struct extent_buffer *root_eb, | ||
| 7588 | u64 root_gen, | ||
| 7589 | int root_level) | ||
| 7590 | { | ||
| 7591 | int ret = 0; | ||
| 7592 | int level; | ||
| 7593 | struct extent_buffer *eb = root_eb; | ||
| 7594 | struct btrfs_path *path = NULL; | ||
| 7595 | |||
| 7596 | BUG_ON(root_level < 0 || root_level > BTRFS_MAX_LEVEL); | ||
| 7597 | BUG_ON(root_eb == NULL); | ||
| 7598 | |||
| 7599 | if (!root->fs_info->quota_enabled) | ||
| 7600 | return 0; | ||
| 7601 | |||
| 7602 | if (!extent_buffer_uptodate(root_eb)) { | ||
| 7603 | ret = btrfs_read_buffer(root_eb, root_gen); | ||
| 7604 | if (ret) | ||
| 7605 | goto out; | ||
| 7606 | } | ||
| 7607 | |||
| 7608 | if (root_level == 0) { | ||
| 7609 | ret = account_leaf_items(trans, root, root_eb); | ||
| 7610 | goto out; | ||
| 7611 | } | ||
| 7612 | |||
| 7613 | path = btrfs_alloc_path(); | ||
| 7614 | if (!path) | ||
| 7615 | return -ENOMEM; | ||
| 7616 | |||
| 7617 | /* | ||
| 7618 | * Walk down the tree. Missing extent blocks are filled in as | ||
| 7619 | * we go. Metadata is accounted every time we read a new | ||
| 7620 | * extent block. | ||
| 7621 | * | ||
| 7622 | * When we reach a leaf, we account for file extent items in it, | ||
| 7623 | * walk back up the tree (adjusting slot pointers as we go) | ||
| 7624 | * and restart the search process. | ||
| 7625 | */ | ||
| 7626 | extent_buffer_get(root_eb); /* For path */ | ||
| 7627 | path->nodes[root_level] = root_eb; | ||
| 7628 | path->slots[root_level] = 0; | ||
| 7629 | path->locks[root_level] = 0; /* so release_path doesn't try to unlock */ | ||
| 7630 | walk_down: | ||
| 7631 | level = root_level; | ||
| 7632 | while (level >= 0) { | ||
| 7633 | if (path->nodes[level] == NULL) { | ||
| 7634 | int child_bsize = root->nodesize; | ||
| 7635 | int parent_slot; | ||
| 7636 | u64 child_gen; | ||
| 7637 | u64 child_bytenr; | ||
| 7638 | |||
| 7639 | /* We need to get child blockptr/gen from | ||
| 7640 | * parent before we can read it. */ | ||
| 7641 | eb = path->nodes[level + 1]; | ||
| 7642 | parent_slot = path->slots[level + 1]; | ||
| 7643 | child_bytenr = btrfs_node_blockptr(eb, parent_slot); | ||
| 7644 | child_gen = btrfs_node_ptr_generation(eb, parent_slot); | ||
| 7645 | |||
| 7646 | eb = read_tree_block(root, child_bytenr, child_bsize, | ||
| 7647 | child_gen); | ||
| 7648 | if (!eb || !extent_buffer_uptodate(eb)) { | ||
| 7649 | ret = -EIO; | ||
| 7650 | goto out; | ||
| 7651 | } | ||
| 7652 | |||
| 7653 | path->nodes[level] = eb; | ||
| 7654 | path->slots[level] = 0; | ||
| 7655 | |||
| 7656 | btrfs_tree_read_lock(eb); | ||
| 7657 | btrfs_set_lock_blocking_rw(eb, BTRFS_READ_LOCK); | ||
| 7658 | path->locks[level] = BTRFS_READ_LOCK_BLOCKING; | ||
| 7659 | |||
| 7660 | ret = btrfs_qgroup_record_ref(trans, root->fs_info, | ||
| 7661 | root->objectid, | ||
| 7662 | child_bytenr, | ||
| 7663 | child_bsize, | ||
| 7664 | BTRFS_QGROUP_OPER_SUB_SUBTREE, | ||
| 7665 | 0); | ||
| 7666 | if (ret) | ||
| 7667 | goto out; | ||
| 7668 | |||
| 7669 | } | ||
| 7670 | |||
| 7671 | if (level == 0) { | ||
| 7672 | ret = account_leaf_items(trans, root, path->nodes[level]); | ||
| 7673 | if (ret) | ||
| 7674 | goto out; | ||
| 7675 | |||
| 7676 | /* Nonzero return here means we completed our search */ | ||
| 7677 | ret = adjust_slots_upwards(root, path, root_level); | ||
| 7678 | if (ret) | ||
| 7679 | break; | ||
| 7680 | |||
| 7681 | /* Restart search with new slots */ | ||
| 7682 | goto walk_down; | ||
| 7683 | } | ||
| 7684 | |||
| 7685 | level--; | ||
| 7686 | } | ||
| 7687 | |||
| 7688 | ret = 0; | ||
| 7689 | out: | ||
| 7690 | btrfs_free_path(path); | ||
| 7691 | |||
| 7692 | return ret; | ||
| 7693 | } | ||
| 7694 | |||
| 7481 | /* | 7695 | /* |
| 7482 | * helper to process tree block while walking down the tree. | 7696 | * helper to process tree block while walking down the tree. |
| 7483 | * | 7697 | * |
| @@ -7532,9 +7746,9 @@ static noinline int walk_down_proc(struct btrfs_trans_handle *trans, | |||
| 7532 | /* wc->stage == UPDATE_BACKREF */ | 7746 | /* wc->stage == UPDATE_BACKREF */ |
| 7533 | if (!(wc->flags[level] & flag)) { | 7747 | if (!(wc->flags[level] & flag)) { |
| 7534 | BUG_ON(!path->locks[level]); | 7748 | BUG_ON(!path->locks[level]); |
| 7535 | ret = btrfs_inc_ref(trans, root, eb, 1, wc->for_reloc); | 7749 | ret = btrfs_inc_ref(trans, root, eb, 1); |
| 7536 | BUG_ON(ret); /* -ENOMEM */ | 7750 | BUG_ON(ret); /* -ENOMEM */ |
| 7537 | ret = btrfs_dec_ref(trans, root, eb, 0, wc->for_reloc); | 7751 | ret = btrfs_dec_ref(trans, root, eb, 0); |
| 7538 | BUG_ON(ret); /* -ENOMEM */ | 7752 | BUG_ON(ret); /* -ENOMEM */ |
| 7539 | ret = btrfs_set_disk_extent_flags(trans, root, eb->start, | 7753 | ret = btrfs_set_disk_extent_flags(trans, root, eb->start, |
| 7540 | eb->len, flag, | 7754 | eb->len, flag, |
| @@ -7581,6 +7795,7 @@ static noinline int do_walk_down(struct btrfs_trans_handle *trans, | |||
| 7581 | int level = wc->level; | 7795 | int level = wc->level; |
| 7582 | int reada = 0; | 7796 | int reada = 0; |
| 7583 | int ret = 0; | 7797 | int ret = 0; |
| 7798 | bool need_account = false; | ||
| 7584 | 7799 | ||
| 7585 | generation = btrfs_node_ptr_generation(path->nodes[level], | 7800 | generation = btrfs_node_ptr_generation(path->nodes[level], |
| 7586 | path->slots[level]); | 7801 | path->slots[level]); |
| @@ -7626,6 +7841,7 @@ static noinline int do_walk_down(struct btrfs_trans_handle *trans, | |||
| 7626 | 7841 | ||
| 7627 | if (wc->stage == DROP_REFERENCE) { | 7842 | if (wc->stage == DROP_REFERENCE) { |
| 7628 | if (wc->refs[level - 1] > 1) { | 7843 | if (wc->refs[level - 1] > 1) { |
| 7844 | need_account = true; | ||
| 7629 | if (level == 1 && | 7845 | if (level == 1 && |
| 7630 | (wc->flags[0] & BTRFS_BLOCK_FLAG_FULL_BACKREF)) | 7846 | (wc->flags[0] & BTRFS_BLOCK_FLAG_FULL_BACKREF)) |
| 7631 | goto skip; | 7847 | goto skip; |
| @@ -7689,6 +7905,16 @@ skip: | |||
| 7689 | parent = 0; | 7905 | parent = 0; |
| 7690 | } | 7906 | } |
| 7691 | 7907 | ||
| 7908 | if (need_account) { | ||
| 7909 | ret = account_shared_subtree(trans, root, next, | ||
| 7910 | generation, level - 1); | ||
| 7911 | if (ret) { | ||
| 7912 | printk_ratelimited(KERN_ERR "BTRFS: %s Error " | ||
| 7913 | "%d accounting shared subtree. Quota " | ||
| 7914 | "is out of sync, rescan required.\n", | ||
| 7915 | root->fs_info->sb->s_id, ret); | ||
| 7916 | } | ||
| 7917 | } | ||
| 7692 | ret = btrfs_free_extent(trans, root, bytenr, blocksize, parent, | 7918 | ret = btrfs_free_extent(trans, root, bytenr, blocksize, parent, |
| 7693 | root->root_key.objectid, level - 1, 0, 0); | 7919 | root->root_key.objectid, level - 1, 0, 0); |
| 7694 | BUG_ON(ret); /* -ENOMEM */ | 7920 | BUG_ON(ret); /* -ENOMEM */ |
| @@ -7769,12 +7995,17 @@ static noinline int walk_up_proc(struct btrfs_trans_handle *trans, | |||
| 7769 | if (wc->refs[level] == 1) { | 7995 | if (wc->refs[level] == 1) { |
| 7770 | if (level == 0) { | 7996 | if (level == 0) { |
| 7771 | if (wc->flags[level] & BTRFS_BLOCK_FLAG_FULL_BACKREF) | 7997 | if (wc->flags[level] & BTRFS_BLOCK_FLAG_FULL_BACKREF) |
| 7772 | ret = btrfs_dec_ref(trans, root, eb, 1, | 7998 | ret = btrfs_dec_ref(trans, root, eb, 1); |
| 7773 | wc->for_reloc); | ||
| 7774 | else | 7999 | else |
| 7775 | ret = btrfs_dec_ref(trans, root, eb, 0, | 8000 | ret = btrfs_dec_ref(trans, root, eb, 0); |
| 7776 | wc->for_reloc); | ||
| 7777 | BUG_ON(ret); /* -ENOMEM */ | 8001 | BUG_ON(ret); /* -ENOMEM */ |
| 8002 | ret = account_leaf_items(trans, root, eb); | ||
| 8003 | if (ret) { | ||
| 8004 | printk_ratelimited(KERN_ERR "BTRFS: %s Error " | ||
| 8005 | "%d accounting leaf items. Quota " | ||
| 8006 | "is out of sync, rescan required.\n", | ||
| 8007 | root->fs_info->sb->s_id, ret); | ||
| 8008 | } | ||
| 7778 | } | 8009 | } |
| 7779 | /* make block locked assertion in clean_tree_block happy */ | 8010 | /* make block locked assertion in clean_tree_block happy */ |
| 7780 | if (!path->locks[level] && | 8011 | if (!path->locks[level] && |
| @@ -7900,6 +8131,8 @@ int btrfs_drop_snapshot(struct btrfs_root *root, | |||
| 7900 | int level; | 8131 | int level; |
| 7901 | bool root_dropped = false; | 8132 | bool root_dropped = false; |
| 7902 | 8133 | ||
| 8134 | btrfs_debug(root->fs_info, "Drop subvolume %llu", root->objectid); | ||
| 8135 | |||
| 7903 | path = btrfs_alloc_path(); | 8136 | path = btrfs_alloc_path(); |
| 7904 | if (!path) { | 8137 | if (!path) { |
| 7905 | err = -ENOMEM; | 8138 | err = -ENOMEM; |
| @@ -8025,6 +8258,24 @@ int btrfs_drop_snapshot(struct btrfs_root *root, | |||
| 8025 | goto out_end_trans; | 8258 | goto out_end_trans; |
| 8026 | } | 8259 | } |
| 8027 | 8260 | ||
| 8261 | /* | ||
| 8262 | * Qgroup update accounting is run from | ||
| 8263 | * delayed ref handling. This usually works | ||
| 8264 | * out because delayed refs are normally the | ||
| 8265 | * only way qgroup updates are added. However, | ||
| 8266 | * we may have added updates during our tree | ||
| 8267 | * walk so run qgroups here to make sure we | ||
| 8268 | * don't lose any updates. | ||
| 8269 | */ | ||
| 8270 | ret = btrfs_delayed_qgroup_accounting(trans, | ||
| 8271 | root->fs_info); | ||
| 8272 | if (ret) | ||
| 8273 | printk_ratelimited(KERN_ERR "BTRFS: Failure %d " | ||
| 8274 | "running qgroup updates " | ||
| 8275 | "during snapshot delete. " | ||
| 8276 | "Quota is out of sync, " | ||
| 8277 | "rescan required.\n", ret); | ||
| 8278 | |||
| 8028 | btrfs_end_transaction_throttle(trans, tree_root); | 8279 | btrfs_end_transaction_throttle(trans, tree_root); |
| 8029 | if (!for_reloc && btrfs_need_cleaner_sleep(root)) { | 8280 | if (!for_reloc && btrfs_need_cleaner_sleep(root)) { |
| 8030 | pr_debug("BTRFS: drop snapshot early exit\n"); | 8281 | pr_debug("BTRFS: drop snapshot early exit\n"); |
| @@ -8078,6 +8329,14 @@ int btrfs_drop_snapshot(struct btrfs_root *root, | |||
| 8078 | } | 8329 | } |
| 8079 | root_dropped = true; | 8330 | root_dropped = true; |
| 8080 | out_end_trans: | 8331 | out_end_trans: |
| 8332 | ret = btrfs_delayed_qgroup_accounting(trans, tree_root->fs_info); | ||
| 8333 | if (ret) | ||
| 8334 | printk_ratelimited(KERN_ERR "BTRFS: Failure %d " | ||
| 8335 | "running qgroup updates " | ||
| 8336 | "during snapshot delete. " | ||
| 8337 | "Quota is out of sync, " | ||
| 8338 | "rescan required.\n", ret); | ||
| 8339 | |||
| 8081 | btrfs_end_transaction_throttle(trans, tree_root); | 8340 | btrfs_end_transaction_throttle(trans, tree_root); |
| 8082 | out_free: | 8341 | out_free: |
| 8083 | kfree(wc); | 8342 | kfree(wc); |
diff --git a/fs/btrfs/file-item.c b/fs/btrfs/file-item.c index f46cfe45d686..54c84daec9b5 100644 --- a/fs/btrfs/file-item.c +++ b/fs/btrfs/file-item.c | |||
| @@ -756,7 +756,7 @@ again: | |||
| 756 | found_next = 1; | 756 | found_next = 1; |
| 757 | if (ret != 0) | 757 | if (ret != 0) |
| 758 | goto insert; | 758 | goto insert; |
| 759 | slot = 0; | 759 | slot = path->slots[0]; |
| 760 | } | 760 | } |
| 761 | btrfs_item_key_to_cpu(path->nodes[0], &found_key, slot); | 761 | btrfs_item_key_to_cpu(path->nodes[0], &found_key, slot); |
| 762 | if (found_key.objectid != BTRFS_EXTENT_CSUM_OBJECTID || | 762 | if (found_key.objectid != BTRFS_EXTENT_CSUM_OBJECTID || |
diff --git a/fs/btrfs/file.c b/fs/btrfs/file.c index 1f2b99cb55ea..d3afac292d67 100644 --- a/fs/btrfs/file.c +++ b/fs/btrfs/file.c | |||
| @@ -1838,33 +1838,9 @@ out: | |||
| 1838 | 1838 | ||
| 1839 | int btrfs_release_file(struct inode *inode, struct file *filp) | 1839 | int btrfs_release_file(struct inode *inode, struct file *filp) |
| 1840 | { | 1840 | { |
| 1841 | /* | ||
| 1842 | * ordered_data_close is set by settattr when we are about to truncate | ||
| 1843 | * a file from a non-zero size to a zero size. This tries to | ||
| 1844 | * flush down new bytes that may have been written if the | ||
| 1845 | * application were using truncate to replace a file in place. | ||
| 1846 | */ | ||
| 1847 | if (test_and_clear_bit(BTRFS_INODE_ORDERED_DATA_CLOSE, | ||
| 1848 | &BTRFS_I(inode)->runtime_flags)) { | ||
| 1849 | struct btrfs_trans_handle *trans; | ||
| 1850 | struct btrfs_root *root = BTRFS_I(inode)->root; | ||
| 1851 | |||
| 1852 | /* | ||
| 1853 | * We need to block on a committing transaction to keep us from | ||
| 1854 | * throwing a ordered operation on to the list and causing | ||
| 1855 | * something like sync to deadlock trying to flush out this | ||
| 1856 | * inode. | ||
| 1857 | */ | ||
| 1858 | trans = btrfs_start_transaction(root, 0); | ||
| 1859 | if (IS_ERR(trans)) | ||
| 1860 | return PTR_ERR(trans); | ||
| 1861 | btrfs_add_ordered_operation(trans, BTRFS_I(inode)->root, inode); | ||
| 1862 | btrfs_end_transaction(trans, root); | ||
| 1863 | if (inode->i_size > BTRFS_ORDERED_OPERATIONS_FLUSH_LIMIT) | ||
| 1864 | filemap_flush(inode->i_mapping); | ||
| 1865 | } | ||
| 1866 | if (filp->private_data) | 1841 | if (filp->private_data) |
| 1867 | btrfs_ioctl_trans_end(filp); | 1842 | btrfs_ioctl_trans_end(filp); |
| 1843 | filemap_flush(inode->i_mapping); | ||
| 1868 | return 0; | 1844 | return 0; |
| 1869 | } | 1845 | } |
| 1870 | 1846 | ||
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index 3668048e16f8..03708ef3deef 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c | |||
| @@ -709,6 +709,18 @@ retry: | |||
| 709 | unlock_extent(io_tree, async_extent->start, | 709 | unlock_extent(io_tree, async_extent->start, |
| 710 | async_extent->start + | 710 | async_extent->start + |
| 711 | async_extent->ram_size - 1); | 711 | async_extent->ram_size - 1); |
| 712 | |||
| 713 | /* | ||
| 714 | * we need to redirty the pages if we decide to | ||
| 715 | * fallback to uncompressed IO, otherwise we | ||
| 716 | * will not submit these pages down to lower | ||
| 717 | * layers. | ||
| 718 | */ | ||
| 719 | extent_range_redirty_for_io(inode, | ||
| 720 | async_extent->start, | ||
| 721 | async_extent->start + | ||
| 722 | async_extent->ram_size - 1); | ||
| 723 | |||
| 712 | goto retry; | 724 | goto retry; |
| 713 | } | 725 | } |
| 714 | goto out_free; | 726 | goto out_free; |
| @@ -7939,27 +7951,6 @@ static int btrfs_truncate(struct inode *inode) | |||
| 7939 | BUG_ON(ret); | 7951 | BUG_ON(ret); |
| 7940 | 7952 | ||
| 7941 | /* | 7953 | /* |
| 7942 | * setattr is responsible for setting the ordered_data_close flag, | ||
| 7943 | * but that is only tested during the last file release. That | ||
| 7944 | * could happen well after the next commit, leaving a great big | ||
| 7945 | * window where new writes may get lost if someone chooses to write | ||
| 7946 | * to this file after truncating to zero | ||
| 7947 | * | ||
| 7948 | * The inode doesn't have any dirty data here, and so if we commit | ||
| 7949 | * this is a noop. If someone immediately starts writing to the inode | ||
| 7950 | * it is very likely we'll catch some of their writes in this | ||
| 7951 | * transaction, and the commit will find this file on the ordered | ||
| 7952 | * data list with good things to send down. | ||
| 7953 | * | ||
| 7954 | * This is a best effort solution, there is still a window where | ||
| 7955 | * using truncate to replace the contents of the file will | ||
| 7956 | * end up with a zero length file after a crash. | ||
| 7957 | */ | ||
| 7958 | if (inode->i_size == 0 && test_bit(BTRFS_INODE_ORDERED_DATA_CLOSE, | ||
| 7959 | &BTRFS_I(inode)->runtime_flags)) | ||
| 7960 | btrfs_add_ordered_operation(trans, root, inode); | ||
| 7961 | |||
| 7962 | /* | ||
| 7963 | * So if we truncate and then write and fsync we normally would just | 7954 | * So if we truncate and then write and fsync we normally would just |
| 7964 | * write the extents that changed, which is a problem if we need to | 7955 | * write the extents that changed, which is a problem if we need to |
| 7965 | * first truncate that entire inode. So set this flag so we write out | 7956 | * first truncate that entire inode. So set this flag so we write out |
| @@ -8106,7 +8097,6 @@ struct inode *btrfs_alloc_inode(struct super_block *sb) | |||
| 8106 | mutex_init(&ei->delalloc_mutex); | 8097 | mutex_init(&ei->delalloc_mutex); |
| 8107 | btrfs_ordered_inode_tree_init(&ei->ordered_tree); | 8098 | btrfs_ordered_inode_tree_init(&ei->ordered_tree); |
| 8108 | INIT_LIST_HEAD(&ei->delalloc_inodes); | 8099 | INIT_LIST_HEAD(&ei->delalloc_inodes); |
| 8109 | INIT_LIST_HEAD(&ei->ordered_operations); | ||
| 8110 | RB_CLEAR_NODE(&ei->rb_node); | 8100 | RB_CLEAR_NODE(&ei->rb_node); |
| 8111 | 8101 | ||
| 8112 | return inode; | 8102 | return inode; |
| @@ -8146,17 +8136,6 @@ void btrfs_destroy_inode(struct inode *inode) | |||
| 8146 | if (!root) | 8136 | if (!root) |
| 8147 | goto free; | 8137 | goto free; |
| 8148 | 8138 | ||
| 8149 | /* | ||
| 8150 | * Make sure we're properly removed from the ordered operation | ||
| 8151 | * lists. | ||
| 8152 | */ | ||
| 8153 | smp_mb(); | ||
| 8154 | if (!list_empty(&BTRFS_I(inode)->ordered_operations)) { | ||
| 8155 | spin_lock(&root->fs_info->ordered_root_lock); | ||
| 8156 | list_del_init(&BTRFS_I(inode)->ordered_operations); | ||
| 8157 | spin_unlock(&root->fs_info->ordered_root_lock); | ||
| 8158 | } | ||
| 8159 | |||
| 8160 | if (test_bit(BTRFS_INODE_HAS_ORPHAN_ITEM, | 8139 | if (test_bit(BTRFS_INODE_HAS_ORPHAN_ITEM, |
| 8161 | &BTRFS_I(inode)->runtime_flags)) { | 8140 | &BTRFS_I(inode)->runtime_flags)) { |
| 8162 | btrfs_info(root->fs_info, "inode %llu still on the orphan list", | 8141 | btrfs_info(root->fs_info, "inode %llu still on the orphan list", |
| @@ -8338,12 +8317,10 @@ static int btrfs_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
| 8338 | ret = 0; | 8317 | ret = 0; |
| 8339 | 8318 | ||
| 8340 | /* | 8319 | /* |
| 8341 | * we're using rename to replace one file with another. | 8320 | * we're using rename to replace one file with another. Start IO on it |
| 8342 | * and the replacement file is large. Start IO on it now so | 8321 | * now so we don't add too much work to the end of the transaction |
| 8343 | * we don't add too much work to the end of the transaction | ||
| 8344 | */ | 8322 | */ |
| 8345 | if (new_inode && S_ISREG(old_inode->i_mode) && new_inode->i_size && | 8323 | if (new_inode && S_ISREG(old_inode->i_mode) && new_inode->i_size) |
| 8346 | old_inode->i_size > BTRFS_ORDERED_OPERATIONS_FLUSH_LIMIT) | ||
| 8347 | filemap_flush(old_inode->i_mapping); | 8324 | filemap_flush(old_inode->i_mapping); |
| 8348 | 8325 | ||
| 8349 | /* close the racy window with snapshot create/destroy ioctl */ | 8326 | /* close the racy window with snapshot create/destroy ioctl */ |
| @@ -8391,12 +8368,6 @@ static int btrfs_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
| 8391 | */ | 8368 | */ |
| 8392 | btrfs_pin_log_trans(root); | 8369 | btrfs_pin_log_trans(root); |
| 8393 | } | 8370 | } |
| 8394 | /* | ||
| 8395 | * make sure the inode gets flushed if it is replacing | ||
| 8396 | * something. | ||
| 8397 | */ | ||
| 8398 | if (new_inode && new_inode->i_size && S_ISREG(old_inode->i_mode)) | ||
| 8399 | btrfs_add_ordered_operation(trans, root, old_inode); | ||
| 8400 | 8371 | ||
| 8401 | inode_inc_iversion(old_dir); | 8372 | inode_inc_iversion(old_dir); |
| 8402 | inode_inc_iversion(new_dir); | 8373 | inode_inc_iversion(new_dir); |
| @@ -8476,6 +8447,16 @@ out_notrans: | |||
| 8476 | return ret; | 8447 | return ret; |
| 8477 | } | 8448 | } |
| 8478 | 8449 | ||
| 8450 | static int btrfs_rename2(struct inode *old_dir, struct dentry *old_dentry, | ||
| 8451 | struct inode *new_dir, struct dentry *new_dentry, | ||
| 8452 | unsigned int flags) | ||
| 8453 | { | ||
| 8454 | if (flags & ~RENAME_NOREPLACE) | ||
| 8455 | return -EINVAL; | ||
| 8456 | |||
| 8457 | return btrfs_rename(old_dir, old_dentry, new_dir, new_dentry); | ||
| 8458 | } | ||
| 8459 | |||
| 8479 | static void btrfs_run_delalloc_work(struct btrfs_work *work) | 8460 | static void btrfs_run_delalloc_work(struct btrfs_work *work) |
| 8480 | { | 8461 | { |
| 8481 | struct btrfs_delalloc_work *delalloc_work; | 8462 | struct btrfs_delalloc_work *delalloc_work; |
| @@ -9019,7 +9000,7 @@ static const struct inode_operations btrfs_dir_inode_operations = { | |||
| 9019 | .link = btrfs_link, | 9000 | .link = btrfs_link, |
| 9020 | .mkdir = btrfs_mkdir, | 9001 | .mkdir = btrfs_mkdir, |
| 9021 | .rmdir = btrfs_rmdir, | 9002 | .rmdir = btrfs_rmdir, |
| 9022 | .rename = btrfs_rename, | 9003 | .rename2 = btrfs_rename2, |
| 9023 | .symlink = btrfs_symlink, | 9004 | .symlink = btrfs_symlink, |
| 9024 | .setattr = btrfs_setattr, | 9005 | .setattr = btrfs_setattr, |
| 9025 | .mknod = btrfs_mknod, | 9006 | .mknod = btrfs_mknod, |
diff --git a/fs/btrfs/ordered-data.c b/fs/btrfs/ordered-data.c index 7187b14faa6c..963895c1f801 100644 --- a/fs/btrfs/ordered-data.c +++ b/fs/btrfs/ordered-data.c | |||
| @@ -571,18 +571,6 @@ void btrfs_remove_ordered_extent(struct inode *inode, | |||
| 571 | 571 | ||
| 572 | trace_btrfs_ordered_extent_remove(inode, entry); | 572 | trace_btrfs_ordered_extent_remove(inode, entry); |
| 573 | 573 | ||
| 574 | /* | ||
| 575 | * we have no more ordered extents for this inode and | ||
| 576 | * no dirty pages. We can safely remove it from the | ||
| 577 | * list of ordered extents | ||
| 578 | */ | ||
| 579 | if (RB_EMPTY_ROOT(&tree->tree) && | ||
| 580 | !mapping_tagged(inode->i_mapping, PAGECACHE_TAG_DIRTY)) { | ||
| 581 | spin_lock(&root->fs_info->ordered_root_lock); | ||
| 582 | list_del_init(&BTRFS_I(inode)->ordered_operations); | ||
| 583 | spin_unlock(&root->fs_info->ordered_root_lock); | ||
| 584 | } | ||
| 585 | |||
| 586 | if (!root->nr_ordered_extents) { | 574 | if (!root->nr_ordered_extents) { |
| 587 | spin_lock(&root->fs_info->ordered_root_lock); | 575 | spin_lock(&root->fs_info->ordered_root_lock); |
| 588 | BUG_ON(list_empty(&root->ordered_root)); | 576 | BUG_ON(list_empty(&root->ordered_root)); |
| @@ -687,81 +675,6 @@ void btrfs_wait_ordered_roots(struct btrfs_fs_info *fs_info, int nr) | |||
| 687 | } | 675 | } |
| 688 | 676 | ||
| 689 | /* | 677 | /* |
| 690 | * this is used during transaction commit to write all the inodes | ||
| 691 | * added to the ordered operation list. These files must be fully on | ||
| 692 | * disk before the transaction commits. | ||
| 693 | * | ||
| 694 | * we have two modes here, one is to just start the IO via filemap_flush | ||
| 695 | * and the other is to wait for all the io. When we wait, we have an | ||
| 696 | * extra check to make sure the ordered operation list really is empty | ||
| 697 | * before we return | ||
| 698 | */ | ||
| 699 | int btrfs_run_ordered_operations(struct btrfs_trans_handle *trans, | ||
| 700 | struct btrfs_root *root, int wait) | ||
| 701 | { | ||
| 702 | struct btrfs_inode *btrfs_inode; | ||
| 703 | struct inode *inode; | ||
| 704 | struct btrfs_transaction *cur_trans = trans->transaction; | ||
| 705 | struct list_head splice; | ||
| 706 | struct list_head works; | ||
| 707 | struct btrfs_delalloc_work *work, *next; | ||
| 708 | int ret = 0; | ||
| 709 | |||
| 710 | INIT_LIST_HEAD(&splice); | ||
| 711 | INIT_LIST_HEAD(&works); | ||
| 712 | |||
| 713 | mutex_lock(&root->fs_info->ordered_extent_flush_mutex); | ||
| 714 | spin_lock(&root->fs_info->ordered_root_lock); | ||
| 715 | list_splice_init(&cur_trans->ordered_operations, &splice); | ||
| 716 | while (!list_empty(&splice)) { | ||
| 717 | btrfs_inode = list_entry(splice.next, struct btrfs_inode, | ||
| 718 | ordered_operations); | ||
| 719 | inode = &btrfs_inode->vfs_inode; | ||
| 720 | |||
| 721 | list_del_init(&btrfs_inode->ordered_operations); | ||
| 722 | |||
| 723 | /* | ||
| 724 | * the inode may be getting freed (in sys_unlink path). | ||
| 725 | */ | ||
| 726 | inode = igrab(inode); | ||
| 727 | if (!inode) | ||
| 728 | continue; | ||
| 729 | |||
| 730 | if (!wait) | ||
| 731 | list_add_tail(&BTRFS_I(inode)->ordered_operations, | ||
| 732 | &cur_trans->ordered_operations); | ||
| 733 | spin_unlock(&root->fs_info->ordered_root_lock); | ||
| 734 | |||
| 735 | work = btrfs_alloc_delalloc_work(inode, wait, 1); | ||
| 736 | if (!work) { | ||
| 737 | spin_lock(&root->fs_info->ordered_root_lock); | ||
| 738 | if (list_empty(&BTRFS_I(inode)->ordered_operations)) | ||
| 739 | list_add_tail(&btrfs_inode->ordered_operations, | ||
| 740 | &splice); | ||
| 741 | list_splice_tail(&splice, | ||
| 742 | &cur_trans->ordered_operations); | ||
| 743 | spin_unlock(&root->fs_info->ordered_root_lock); | ||
| 744 | ret = -ENOMEM; | ||
| 745 | goto out; | ||
| 746 | } | ||
| 747 | list_add_tail(&work->list, &works); | ||
| 748 | btrfs_queue_work(root->fs_info->flush_workers, | ||
| 749 | &work->work); | ||
| 750 | |||
| 751 | cond_resched(); | ||
| 752 | spin_lock(&root->fs_info->ordered_root_lock); | ||
| 753 | } | ||
| 754 | spin_unlock(&root->fs_info->ordered_root_lock); | ||
| 755 | out: | ||
| 756 | list_for_each_entry_safe(work, next, &works, list) { | ||
| 757 | list_del_init(&work->list); | ||
| 758 | btrfs_wait_and_free_delalloc_work(work); | ||
| 759 | } | ||
| 760 | mutex_unlock(&root->fs_info->ordered_extent_flush_mutex); | ||
| 761 | return ret; | ||
| 762 | } | ||
| 763 | |||
| 764 | /* | ||
| 765 | * Used to start IO or wait for a given ordered extent to finish. | 678 | * Used to start IO or wait for a given ordered extent to finish. |
| 766 | * | 679 | * |
| 767 | * If wait is one, this effectively waits on page writeback for all the pages | 680 | * If wait is one, this effectively waits on page writeback for all the pages |
| @@ -1120,42 +1033,6 @@ out: | |||
| 1120 | return index; | 1033 | return index; |
| 1121 | } | 1034 | } |
| 1122 | 1035 | ||
| 1123 | |||
| 1124 | /* | ||
| 1125 | * add a given inode to the list of inodes that must be fully on | ||
| 1126 | * disk before a transaction commit finishes. | ||
| 1127 | * | ||
| 1128 | * This basically gives us the ext3 style data=ordered mode, and it is mostly | ||
| 1129 | * used to make sure renamed files are fully on disk. | ||
| 1130 | * | ||
| 1131 | * It is a noop if the inode is already fully on disk. | ||
| 1132 | * | ||
| 1133 | * If trans is not null, we'll do a friendly check for a transaction that | ||
| 1134 | * is already flushing things and force the IO down ourselves. | ||
| 1135 | */ | ||
| 1136 | void btrfs_add_ordered_operation(struct btrfs_trans_handle *trans, | ||
| 1137 | struct btrfs_root *root, struct inode *inode) | ||
| 1138 | { | ||
| 1139 | struct btrfs_transaction *cur_trans = trans->transaction; | ||
| 1140 | u64 last_mod; | ||
| 1141 | |||
| 1142 | last_mod = max(BTRFS_I(inode)->generation, BTRFS_I(inode)->last_trans); | ||
| 1143 | |||
| 1144 | /* | ||
| 1145 | * if this file hasn't been changed since the last transaction | ||
| 1146 | * commit, we can safely return without doing anything | ||
| 1147 | */ | ||
| 1148 | if (last_mod <= root->fs_info->last_trans_committed) | ||
| 1149 | return; | ||
| 1150 | |||
| 1151 | spin_lock(&root->fs_info->ordered_root_lock); | ||
| 1152 | if (list_empty(&BTRFS_I(inode)->ordered_operations)) { | ||
| 1153 | list_add_tail(&BTRFS_I(inode)->ordered_operations, | ||
| 1154 | &cur_trans->ordered_operations); | ||
| 1155 | } | ||
| 1156 | spin_unlock(&root->fs_info->ordered_root_lock); | ||
| 1157 | } | ||
| 1158 | |||
| 1159 | int __init ordered_data_init(void) | 1036 | int __init ordered_data_init(void) |
| 1160 | { | 1037 | { |
| 1161 | btrfs_ordered_extent_cache = kmem_cache_create("btrfs_ordered_extent", | 1038 | btrfs_ordered_extent_cache = kmem_cache_create("btrfs_ordered_extent", |
diff --git a/fs/btrfs/ordered-data.h b/fs/btrfs/ordered-data.h index 246897058efb..d81a274d621e 100644 --- a/fs/btrfs/ordered-data.h +++ b/fs/btrfs/ordered-data.h | |||
| @@ -190,11 +190,6 @@ int btrfs_ordered_update_i_size(struct inode *inode, u64 offset, | |||
| 190 | struct btrfs_ordered_extent *ordered); | 190 | struct btrfs_ordered_extent *ordered); |
| 191 | int btrfs_find_ordered_sum(struct inode *inode, u64 offset, u64 disk_bytenr, | 191 | int btrfs_find_ordered_sum(struct inode *inode, u64 offset, u64 disk_bytenr, |
| 192 | u32 *sum, int len); | 192 | u32 *sum, int len); |
| 193 | int btrfs_run_ordered_operations(struct btrfs_trans_handle *trans, | ||
| 194 | struct btrfs_root *root, int wait); | ||
| 195 | void btrfs_add_ordered_operation(struct btrfs_trans_handle *trans, | ||
| 196 | struct btrfs_root *root, | ||
| 197 | struct inode *inode); | ||
| 198 | int btrfs_wait_ordered_extents(struct btrfs_root *root, int nr); | 193 | int btrfs_wait_ordered_extents(struct btrfs_root *root, int nr); |
| 199 | void btrfs_wait_ordered_roots(struct btrfs_fs_info *fs_info, int nr); | 194 | void btrfs_wait_ordered_roots(struct btrfs_fs_info *fs_info, int nr); |
| 200 | void btrfs_get_logged_extents(struct inode *inode, | 195 | void btrfs_get_logged_extents(struct inode *inode, |
diff --git a/fs/btrfs/qgroup.c b/fs/btrfs/qgroup.c index 98cb6b2630f9..b497498484be 100644 --- a/fs/btrfs/qgroup.c +++ b/fs/btrfs/qgroup.c | |||
| @@ -1201,6 +1201,50 @@ out: | |||
| 1201 | mutex_unlock(&fs_info->qgroup_ioctl_lock); | 1201 | mutex_unlock(&fs_info->qgroup_ioctl_lock); |
| 1202 | return ret; | 1202 | return ret; |
| 1203 | } | 1203 | } |
| 1204 | |||
| 1205 | static int comp_oper_exist(struct btrfs_qgroup_operation *oper1, | ||
| 1206 | struct btrfs_qgroup_operation *oper2) | ||
| 1207 | { | ||
| 1208 | /* | ||
| 1209 | * Ignore seq and type here, we're looking for any operation | ||
| 1210 | * at all related to this extent on that root. | ||
| 1211 | */ | ||
| 1212 | if (oper1->bytenr < oper2->bytenr) | ||
| 1213 | return -1; | ||
| 1214 | if (oper1->bytenr > oper2->bytenr) | ||
| 1215 | return 1; | ||
| 1216 | if (oper1->ref_root < oper2->ref_root) | ||
| 1217 | return -1; | ||
| 1218 | if (oper1->ref_root > oper2->ref_root) | ||
| 1219 | return 1; | ||
| 1220 | return 0; | ||
| 1221 | } | ||
| 1222 | |||
| 1223 | static int qgroup_oper_exists(struct btrfs_fs_info *fs_info, | ||
| 1224 | struct btrfs_qgroup_operation *oper) | ||
| 1225 | { | ||
| 1226 | struct rb_node *n; | ||
| 1227 | struct btrfs_qgroup_operation *cur; | ||
| 1228 | int cmp; | ||
| 1229 | |||
| 1230 | spin_lock(&fs_info->qgroup_op_lock); | ||
| 1231 | n = fs_info->qgroup_op_tree.rb_node; | ||
| 1232 | while (n) { | ||
| 1233 | cur = rb_entry(n, struct btrfs_qgroup_operation, n); | ||
| 1234 | cmp = comp_oper_exist(cur, oper); | ||
| 1235 | if (cmp < 0) { | ||
| 1236 | n = n->rb_right; | ||
| 1237 | } else if (cmp) { | ||
| 1238 | n = n->rb_left; | ||
| 1239 | } else { | ||
| 1240 | spin_unlock(&fs_info->qgroup_op_lock); | ||
| 1241 | return -EEXIST; | ||
| 1242 | } | ||
| 1243 | } | ||
| 1244 | spin_unlock(&fs_info->qgroup_op_lock); | ||
| 1245 | return 0; | ||
| 1246 | } | ||
| 1247 | |||
| 1204 | static int comp_oper(struct btrfs_qgroup_operation *oper1, | 1248 | static int comp_oper(struct btrfs_qgroup_operation *oper1, |
| 1205 | struct btrfs_qgroup_operation *oper2) | 1249 | struct btrfs_qgroup_operation *oper2) |
| 1206 | { | 1250 | { |
| @@ -1290,6 +1334,23 @@ int btrfs_qgroup_record_ref(struct btrfs_trans_handle *trans, | |||
| 1290 | oper->seq = atomic_inc_return(&fs_info->qgroup_op_seq); | 1334 | oper->seq = atomic_inc_return(&fs_info->qgroup_op_seq); |
| 1291 | INIT_LIST_HEAD(&oper->elem.list); | 1335 | INIT_LIST_HEAD(&oper->elem.list); |
| 1292 | oper->elem.seq = 0; | 1336 | oper->elem.seq = 0; |
| 1337 | |||
| 1338 | if (type == BTRFS_QGROUP_OPER_SUB_SUBTREE) { | ||
| 1339 | /* | ||
| 1340 | * If any operation for this bytenr/ref_root combo | ||
| 1341 | * exists, then we know it's not exclusively owned and | ||
| 1342 | * shouldn't be queued up. | ||
| 1343 | * | ||
| 1344 | * This also catches the case where we have a cloned | ||
| 1345 | * extent that gets queued up multiple times during | ||
| 1346 | * drop snapshot. | ||
| 1347 | */ | ||
| 1348 | if (qgroup_oper_exists(fs_info, oper)) { | ||
| 1349 | kfree(oper); | ||
| 1350 | return 0; | ||
| 1351 | } | ||
| 1352 | } | ||
| 1353 | |||
| 1293 | ret = insert_qgroup_oper(fs_info, oper); | 1354 | ret = insert_qgroup_oper(fs_info, oper); |
| 1294 | if (ret) { | 1355 | if (ret) { |
| 1295 | /* Shouldn't happen so have an assert for developers */ | 1356 | /* Shouldn't happen so have an assert for developers */ |
| @@ -1884,6 +1945,111 @@ out: | |||
| 1884 | } | 1945 | } |
| 1885 | 1946 | ||
| 1886 | /* | 1947 | /* |
| 1948 | * Process a reference to a shared subtree. This type of operation is | ||
| 1949 | * queued during snapshot removal when we encounter extents which are | ||
| 1950 | * shared between more than one root. | ||
| 1951 | */ | ||
| 1952 | static int qgroup_subtree_accounting(struct btrfs_trans_handle *trans, | ||
| 1953 | struct btrfs_fs_info *fs_info, | ||
| 1954 | struct btrfs_qgroup_operation *oper) | ||
| 1955 | { | ||
| 1956 | struct ulist *roots = NULL; | ||
| 1957 | struct ulist_node *unode; | ||
| 1958 | struct ulist_iterator uiter; | ||
| 1959 | struct btrfs_qgroup_list *glist; | ||
| 1960 | struct ulist *parents; | ||
| 1961 | int ret = 0; | ||
| 1962 | int err; | ||
| 1963 | struct btrfs_qgroup *qg; | ||
| 1964 | u64 root_obj = 0; | ||
| 1965 | struct seq_list elem = {}; | ||
| 1966 | |||
| 1967 | parents = ulist_alloc(GFP_NOFS); | ||
| 1968 | if (!parents) | ||
| 1969 | return -ENOMEM; | ||
| 1970 | |||
| 1971 | btrfs_get_tree_mod_seq(fs_info, &elem); | ||
| 1972 | ret = btrfs_find_all_roots(trans, fs_info, oper->bytenr, | ||
| 1973 | elem.seq, &roots); | ||
| 1974 | btrfs_put_tree_mod_seq(fs_info, &elem); | ||
| 1975 | if (ret < 0) | ||
| 1976 | return ret; | ||
| 1977 | |||
| 1978 | if (roots->nnodes != 1) | ||
| 1979 | goto out; | ||
| 1980 | |||
| 1981 | ULIST_ITER_INIT(&uiter); | ||
| 1982 | unode = ulist_next(roots, &uiter); /* Only want 1 so no need to loop */ | ||
| 1983 | /* | ||
| 1984 | * If we find our ref root then that means all refs | ||
| 1985 | * this extent has to the root have not yet been | ||
| 1986 | * deleted. In that case, we do nothing and let the | ||
| 1987 | * last ref for this bytenr drive our update. | ||
| 1988 | * | ||
| 1989 | * This can happen for example if an extent is | ||
| 1990 | * referenced multiple times in a snapshot (clone, | ||
| 1991 | * etc). If we are in the middle of snapshot removal, | ||
| 1992 | * queued updates for such an extent will find the | ||
| 1993 | * root if we have not yet finished removing the | ||
| 1994 | * snapshot. | ||
| 1995 | */ | ||
| 1996 | if (unode->val == oper->ref_root) | ||
| 1997 | goto out; | ||
| 1998 | |||
| 1999 | root_obj = unode->val; | ||
| 2000 | BUG_ON(!root_obj); | ||
| 2001 | |||
| 2002 | spin_lock(&fs_info->qgroup_lock); | ||
| 2003 | qg = find_qgroup_rb(fs_info, root_obj); | ||
| 2004 | if (!qg) | ||
| 2005 | goto out_unlock; | ||
| 2006 | |||
| 2007 | qg->excl += oper->num_bytes; | ||
| 2008 | qg->excl_cmpr += oper->num_bytes; | ||
| 2009 | qgroup_dirty(fs_info, qg); | ||
| 2010 | |||
| 2011 | /* | ||
| 2012 | * Adjust counts for parent groups. First we find all | ||
| 2013 | * parents, then in the 2nd loop we do the adjustment | ||
| 2014 | * while adding parents of the parents to our ulist. | ||
| 2015 | */ | ||
| 2016 | list_for_each_entry(glist, &qg->groups, next_group) { | ||
| 2017 | err = ulist_add(parents, glist->group->qgroupid, | ||
| 2018 | ptr_to_u64(glist->group), GFP_ATOMIC); | ||
| 2019 | if (err < 0) { | ||
| 2020 | ret = err; | ||
| 2021 | goto out_unlock; | ||
| 2022 | } | ||
| 2023 | } | ||
| 2024 | |||
| 2025 | ULIST_ITER_INIT(&uiter); | ||
| 2026 | while ((unode = ulist_next(parents, &uiter))) { | ||
| 2027 | qg = u64_to_ptr(unode->aux); | ||
| 2028 | qg->excl += oper->num_bytes; | ||
| 2029 | qg->excl_cmpr += oper->num_bytes; | ||
| 2030 | qgroup_dirty(fs_info, qg); | ||
| 2031 | |||
| 2032 | /* Add any parents of the parents */ | ||
| 2033 | list_for_each_entry(glist, &qg->groups, next_group) { | ||
| 2034 | err = ulist_add(parents, glist->group->qgroupid, | ||
| 2035 | ptr_to_u64(glist->group), GFP_ATOMIC); | ||
| 2036 | if (err < 0) { | ||
| 2037 | ret = err; | ||
| 2038 | goto out_unlock; | ||
| 2039 | } | ||
| 2040 | } | ||
| 2041 | } | ||
| 2042 | |||
| 2043 | out_unlock: | ||
| 2044 | spin_unlock(&fs_info->qgroup_lock); | ||
| 2045 | |||
| 2046 | out: | ||
| 2047 | ulist_free(roots); | ||
| 2048 | ulist_free(parents); | ||
| 2049 | return ret; | ||
| 2050 | } | ||
| 2051 | |||
| 2052 | /* | ||
| 1887 | * btrfs_qgroup_account_ref is called for every ref that is added to or deleted | 2053 | * btrfs_qgroup_account_ref is called for every ref that is added to or deleted |
| 1888 | * from the fs. First, all roots referencing the extent are searched, and | 2054 | * from the fs. First, all roots referencing the extent are searched, and |
| 1889 | * then the space is accounted accordingly to the different roots. The | 2055 | * then the space is accounted accordingly to the different roots. The |
| @@ -1920,6 +2086,9 @@ static int btrfs_qgroup_account(struct btrfs_trans_handle *trans, | |||
| 1920 | case BTRFS_QGROUP_OPER_SUB_SHARED: | 2086 | case BTRFS_QGROUP_OPER_SUB_SHARED: |
| 1921 | ret = qgroup_shared_accounting(trans, fs_info, oper); | 2087 | ret = qgroup_shared_accounting(trans, fs_info, oper); |
| 1922 | break; | 2088 | break; |
| 2089 | case BTRFS_QGROUP_OPER_SUB_SUBTREE: | ||
| 2090 | ret = qgroup_subtree_accounting(trans, fs_info, oper); | ||
| 2091 | break; | ||
| 1923 | default: | 2092 | default: |
| 1924 | ASSERT(0); | 2093 | ASSERT(0); |
| 1925 | } | 2094 | } |
diff --git a/fs/btrfs/qgroup.h b/fs/btrfs/qgroup.h index 5952ff1fbd7a..18cc68ca3090 100644 --- a/fs/btrfs/qgroup.h +++ b/fs/btrfs/qgroup.h | |||
| @@ -44,6 +44,7 @@ enum btrfs_qgroup_operation_type { | |||
| 44 | BTRFS_QGROUP_OPER_ADD_SHARED, | 44 | BTRFS_QGROUP_OPER_ADD_SHARED, |
| 45 | BTRFS_QGROUP_OPER_SUB_EXCL, | 45 | BTRFS_QGROUP_OPER_SUB_EXCL, |
| 46 | BTRFS_QGROUP_OPER_SUB_SHARED, | 46 | BTRFS_QGROUP_OPER_SUB_SHARED, |
| 47 | BTRFS_QGROUP_OPER_SUB_SUBTREE, | ||
| 47 | }; | 48 | }; |
| 48 | 49 | ||
| 49 | struct btrfs_qgroup_operation { | 50 | struct btrfs_qgroup_operation { |
diff --git a/fs/btrfs/super.c b/fs/btrfs/super.c index 8e16bca69c56..c4124de4435b 100644 --- a/fs/btrfs/super.c +++ b/fs/btrfs/super.c | |||
| @@ -851,7 +851,6 @@ static struct dentry *get_default_root(struct super_block *sb, | |||
| 851 | struct btrfs_path *path; | 851 | struct btrfs_path *path; |
| 852 | struct btrfs_key location; | 852 | struct btrfs_key location; |
| 853 | struct inode *inode; | 853 | struct inode *inode; |
| 854 | struct dentry *dentry; | ||
| 855 | u64 dir_id; | 854 | u64 dir_id; |
| 856 | int new = 0; | 855 | int new = 0; |
| 857 | 856 | ||
| @@ -922,13 +921,7 @@ setup_root: | |||
| 922 | return dget(sb->s_root); | 921 | return dget(sb->s_root); |
| 923 | } | 922 | } |
| 924 | 923 | ||
| 925 | dentry = d_obtain_alias(inode); | 924 | return d_obtain_root(inode); |
| 926 | if (!IS_ERR(dentry)) { | ||
| 927 | spin_lock(&dentry->d_lock); | ||
| 928 | dentry->d_flags &= ~DCACHE_DISCONNECTED; | ||
| 929 | spin_unlock(&dentry->d_lock); | ||
| 930 | } | ||
| 931 | return dentry; | ||
| 932 | } | 925 | } |
| 933 | 926 | ||
| 934 | static int btrfs_fill_super(struct super_block *sb, | 927 | static int btrfs_fill_super(struct super_block *sb, |
| @@ -1672,6 +1665,21 @@ static int btrfs_calc_avail_data_space(struct btrfs_root *root, u64 *free_bytes) | |||
| 1672 | return 0; | 1665 | return 0; |
| 1673 | } | 1666 | } |
| 1674 | 1667 | ||
| 1668 | /* | ||
| 1669 | * Calculate numbers for 'df', pessimistic in case of mixed raid profiles. | ||
| 1670 | * | ||
| 1671 | * If there's a redundant raid level at DATA block groups, use the respective | ||
| 1672 | * multiplier to scale the sizes. | ||
| 1673 | * | ||
| 1674 | * Unused device space usage is based on simulating the chunk allocator | ||
| 1675 | * algorithm that respects the device sizes, order of allocations and the | ||
| 1676 | * 'alloc_start' value, this is a close approximation of the actual use but | ||
| 1677 | * there are other factors that may change the result (like a new metadata | ||
| 1678 | * chunk). | ||
| 1679 | * | ||
| 1680 | * FIXME: not accurate for mixed block groups, total and free/used are ok, | ||
| 1681 | * available appears slightly larger. | ||
| 1682 | */ | ||
| 1675 | static int btrfs_statfs(struct dentry *dentry, struct kstatfs *buf) | 1683 | static int btrfs_statfs(struct dentry *dentry, struct kstatfs *buf) |
| 1676 | { | 1684 | { |
| 1677 | struct btrfs_fs_info *fs_info = btrfs_sb(dentry->d_sb); | 1685 | struct btrfs_fs_info *fs_info = btrfs_sb(dentry->d_sb); |
| @@ -1682,6 +1690,8 @@ static int btrfs_statfs(struct dentry *dentry, struct kstatfs *buf) | |||
| 1682 | u64 total_free_data = 0; | 1690 | u64 total_free_data = 0; |
| 1683 | int bits = dentry->d_sb->s_blocksize_bits; | 1691 | int bits = dentry->d_sb->s_blocksize_bits; |
| 1684 | __be32 *fsid = (__be32 *)fs_info->fsid; | 1692 | __be32 *fsid = (__be32 *)fs_info->fsid; |
| 1693 | unsigned factor = 1; | ||
| 1694 | struct btrfs_block_rsv *block_rsv = &fs_info->global_block_rsv; | ||
| 1685 | int ret; | 1695 | int ret; |
| 1686 | 1696 | ||
| 1687 | /* holding chunk_muext to avoid allocating new chunks */ | 1697 | /* holding chunk_muext to avoid allocating new chunks */ |
| @@ -1689,30 +1699,52 @@ static int btrfs_statfs(struct dentry *dentry, struct kstatfs *buf) | |||
| 1689 | rcu_read_lock(); | 1699 | rcu_read_lock(); |
| 1690 | list_for_each_entry_rcu(found, head, list) { | 1700 | list_for_each_entry_rcu(found, head, list) { |
| 1691 | if (found->flags & BTRFS_BLOCK_GROUP_DATA) { | 1701 | if (found->flags & BTRFS_BLOCK_GROUP_DATA) { |
| 1702 | int i; | ||
| 1703 | |||
| 1692 | total_free_data += found->disk_total - found->disk_used; | 1704 | total_free_data += found->disk_total - found->disk_used; |
| 1693 | total_free_data -= | 1705 | total_free_data -= |
| 1694 | btrfs_account_ro_block_groups_free_space(found); | 1706 | btrfs_account_ro_block_groups_free_space(found); |
| 1707 | |||
| 1708 | for (i = 0; i < BTRFS_NR_RAID_TYPES; i++) { | ||
| 1709 | if (!list_empty(&found->block_groups[i])) { | ||
| 1710 | switch (i) { | ||
| 1711 | case BTRFS_RAID_DUP: | ||
| 1712 | case BTRFS_RAID_RAID1: | ||
| 1713 | case BTRFS_RAID_RAID10: | ||
| 1714 | factor = 2; | ||
| 1715 | } | ||
| 1716 | } | ||
| 1717 | } | ||
| 1695 | } | 1718 | } |
| 1696 | 1719 | ||
| 1697 | total_used += found->disk_used; | 1720 | total_used += found->disk_used; |
| 1698 | } | 1721 | } |
| 1722 | |||
| 1699 | rcu_read_unlock(); | 1723 | rcu_read_unlock(); |
| 1700 | 1724 | ||
| 1701 | buf->f_namelen = BTRFS_NAME_LEN; | 1725 | buf->f_blocks = div_u64(btrfs_super_total_bytes(disk_super), factor); |
| 1702 | buf->f_blocks = btrfs_super_total_bytes(disk_super) >> bits; | 1726 | buf->f_blocks >>= bits; |
| 1703 | buf->f_bfree = buf->f_blocks - (total_used >> bits); | 1727 | buf->f_bfree = buf->f_blocks - (div_u64(total_used, factor) >> bits); |
| 1704 | buf->f_bsize = dentry->d_sb->s_blocksize; | 1728 | |
| 1705 | buf->f_type = BTRFS_SUPER_MAGIC; | 1729 | /* Account global block reserve as used, it's in logical size already */ |
| 1730 | spin_lock(&block_rsv->lock); | ||
| 1731 | buf->f_bfree -= block_rsv->size >> bits; | ||
| 1732 | spin_unlock(&block_rsv->lock); | ||
| 1733 | |||
| 1706 | buf->f_bavail = total_free_data; | 1734 | buf->f_bavail = total_free_data; |
| 1707 | ret = btrfs_calc_avail_data_space(fs_info->tree_root, &total_free_data); | 1735 | ret = btrfs_calc_avail_data_space(fs_info->tree_root, &total_free_data); |
| 1708 | if (ret) { | 1736 | if (ret) { |
| 1709 | mutex_unlock(&fs_info->chunk_mutex); | 1737 | mutex_unlock(&fs_info->chunk_mutex); |
| 1710 | return ret; | 1738 | return ret; |
| 1711 | } | 1739 | } |
| 1712 | buf->f_bavail += total_free_data; | 1740 | buf->f_bavail += div_u64(total_free_data, factor); |
| 1713 | buf->f_bavail = buf->f_bavail >> bits; | 1741 | buf->f_bavail = buf->f_bavail >> bits; |
| 1714 | mutex_unlock(&fs_info->chunk_mutex); | 1742 | mutex_unlock(&fs_info->chunk_mutex); |
| 1715 | 1743 | ||
| 1744 | buf->f_type = BTRFS_SUPER_MAGIC; | ||
| 1745 | buf->f_bsize = dentry->d_sb->s_blocksize; | ||
| 1746 | buf->f_namelen = BTRFS_NAME_LEN; | ||
| 1747 | |||
| 1716 | /* We treat it as constant endianness (it doesn't matter _which_) | 1748 | /* We treat it as constant endianness (it doesn't matter _which_) |
| 1717 | because we want the fsid to come out the same whether mounted | 1749 | because we want the fsid to come out the same whether mounted |
| 1718 | on a big-endian or little-endian host */ | 1750 | on a big-endian or little-endian host */ |
diff --git a/fs/btrfs/transaction.c b/fs/btrfs/transaction.c index 5f379affdf23..d89c6d3542ca 100644 --- a/fs/btrfs/transaction.c +++ b/fs/btrfs/transaction.c | |||
| @@ -218,7 +218,6 @@ loop: | |||
| 218 | spin_lock_init(&cur_trans->delayed_refs.lock); | 218 | spin_lock_init(&cur_trans->delayed_refs.lock); |
| 219 | 219 | ||
| 220 | INIT_LIST_HEAD(&cur_trans->pending_snapshots); | 220 | INIT_LIST_HEAD(&cur_trans->pending_snapshots); |
| 221 | INIT_LIST_HEAD(&cur_trans->ordered_operations); | ||
| 222 | INIT_LIST_HEAD(&cur_trans->pending_chunks); | 221 | INIT_LIST_HEAD(&cur_trans->pending_chunks); |
| 223 | INIT_LIST_HEAD(&cur_trans->switch_commits); | 222 | INIT_LIST_HEAD(&cur_trans->switch_commits); |
| 224 | list_add_tail(&cur_trans->list, &fs_info->trans_list); | 223 | list_add_tail(&cur_trans->list, &fs_info->trans_list); |
| @@ -1612,27 +1611,6 @@ static void cleanup_transaction(struct btrfs_trans_handle *trans, | |||
| 1612 | kmem_cache_free(btrfs_trans_handle_cachep, trans); | 1611 | kmem_cache_free(btrfs_trans_handle_cachep, trans); |
| 1613 | } | 1612 | } |
| 1614 | 1613 | ||
| 1615 | static int btrfs_flush_all_pending_stuffs(struct btrfs_trans_handle *trans, | ||
| 1616 | struct btrfs_root *root) | ||
| 1617 | { | ||
| 1618 | int ret; | ||
| 1619 | |||
| 1620 | ret = btrfs_run_delayed_items(trans, root); | ||
| 1621 | if (ret) | ||
| 1622 | return ret; | ||
| 1623 | |||
| 1624 | /* | ||
| 1625 | * rename don't use btrfs_join_transaction, so, once we | ||
| 1626 | * set the transaction to blocked above, we aren't going | ||
| 1627 | * to get any new ordered operations. We can safely run | ||
| 1628 | * it here and no for sure that nothing new will be added | ||
| 1629 | * to the list | ||
| 1630 | */ | ||
| 1631 | ret = btrfs_run_ordered_operations(trans, root, 1); | ||
| 1632 | |||
| 1633 | return ret; | ||
| 1634 | } | ||
| 1635 | |||
| 1636 | static inline int btrfs_start_delalloc_flush(struct btrfs_fs_info *fs_info) | 1614 | static inline int btrfs_start_delalloc_flush(struct btrfs_fs_info *fs_info) |
| 1637 | { | 1615 | { |
| 1638 | if (btrfs_test_opt(fs_info->tree_root, FLUSHONCOMMIT)) | 1616 | if (btrfs_test_opt(fs_info->tree_root, FLUSHONCOMMIT)) |
| @@ -1653,13 +1631,6 @@ int btrfs_commit_transaction(struct btrfs_trans_handle *trans, | |||
| 1653 | struct btrfs_transaction *prev_trans = NULL; | 1631 | struct btrfs_transaction *prev_trans = NULL; |
| 1654 | int ret; | 1632 | int ret; |
| 1655 | 1633 | ||
| 1656 | ret = btrfs_run_ordered_operations(trans, root, 0); | ||
| 1657 | if (ret) { | ||
| 1658 | btrfs_abort_transaction(trans, root, ret); | ||
| 1659 | btrfs_end_transaction(trans, root); | ||
| 1660 | return ret; | ||
| 1661 | } | ||
| 1662 | |||
| 1663 | /* Stop the commit early if ->aborted is set */ | 1634 | /* Stop the commit early if ->aborted is set */ |
| 1664 | if (unlikely(ACCESS_ONCE(cur_trans->aborted))) { | 1635 | if (unlikely(ACCESS_ONCE(cur_trans->aborted))) { |
| 1665 | ret = cur_trans->aborted; | 1636 | ret = cur_trans->aborted; |
| @@ -1740,7 +1711,7 @@ int btrfs_commit_transaction(struct btrfs_trans_handle *trans, | |||
| 1740 | if (ret) | 1711 | if (ret) |
| 1741 | goto cleanup_transaction; | 1712 | goto cleanup_transaction; |
| 1742 | 1713 | ||
| 1743 | ret = btrfs_flush_all_pending_stuffs(trans, root); | 1714 | ret = btrfs_run_delayed_items(trans, root); |
| 1744 | if (ret) | 1715 | if (ret) |
| 1745 | goto cleanup_transaction; | 1716 | goto cleanup_transaction; |
| 1746 | 1717 | ||
| @@ -1748,7 +1719,7 @@ int btrfs_commit_transaction(struct btrfs_trans_handle *trans, | |||
| 1748 | extwriter_counter_read(cur_trans) == 0); | 1719 | extwriter_counter_read(cur_trans) == 0); |
| 1749 | 1720 | ||
| 1750 | /* some pending stuffs might be added after the previous flush. */ | 1721 | /* some pending stuffs might be added after the previous flush. */ |
| 1751 | ret = btrfs_flush_all_pending_stuffs(trans, root); | 1722 | ret = btrfs_run_delayed_items(trans, root); |
| 1752 | if (ret) | 1723 | if (ret) |
| 1753 | goto cleanup_transaction; | 1724 | goto cleanup_transaction; |
| 1754 | 1725 | ||
diff --git a/fs/btrfs/transaction.h b/fs/btrfs/transaction.h index 7dd558ed0716..579be51b27e5 100644 --- a/fs/btrfs/transaction.h +++ b/fs/btrfs/transaction.h | |||
| @@ -55,7 +55,6 @@ struct btrfs_transaction { | |||
| 55 | wait_queue_head_t writer_wait; | 55 | wait_queue_head_t writer_wait; |
| 56 | wait_queue_head_t commit_wait; | 56 | wait_queue_head_t commit_wait; |
| 57 | struct list_head pending_snapshots; | 57 | struct list_head pending_snapshots; |
| 58 | struct list_head ordered_operations; | ||
| 59 | struct list_head pending_chunks; | 58 | struct list_head pending_chunks; |
| 60 | struct list_head switch_commits; | 59 | struct list_head switch_commits; |
| 61 | struct btrfs_delayed_ref_root delayed_refs; | 60 | struct btrfs_delayed_ref_root delayed_refs; |
diff --git a/fs/btrfs/ulist.h b/fs/btrfs/ulist.h index 7f78cbf5cf41..4c29db604bbe 100644 --- a/fs/btrfs/ulist.h +++ b/fs/btrfs/ulist.h | |||
| @@ -57,6 +57,21 @@ void ulist_free(struct ulist *ulist); | |||
| 57 | int ulist_add(struct ulist *ulist, u64 val, u64 aux, gfp_t gfp_mask); | 57 | int ulist_add(struct ulist *ulist, u64 val, u64 aux, gfp_t gfp_mask); |
| 58 | int ulist_add_merge(struct ulist *ulist, u64 val, u64 aux, | 58 | int ulist_add_merge(struct ulist *ulist, u64 val, u64 aux, |
| 59 | u64 *old_aux, gfp_t gfp_mask); | 59 | u64 *old_aux, gfp_t gfp_mask); |
| 60 | |||
| 61 | /* just like ulist_add_merge() but take a pointer for the aux data */ | ||
| 62 | static inline int ulist_add_merge_ptr(struct ulist *ulist, u64 val, void *aux, | ||
| 63 | void **old_aux, gfp_t gfp_mask) | ||
| 64 | { | ||
| 65 | #if BITS_PER_LONG == 32 | ||
| 66 | u64 old64 = (uintptr_t)*old_aux; | ||
| 67 | int ret = ulist_add_merge(ulist, val, (uintptr_t)aux, &old64, gfp_mask); | ||
| 68 | *old_aux = (void *)((uintptr_t)old64); | ||
| 69 | return ret; | ||
| 70 | #else | ||
| 71 | return ulist_add_merge(ulist, val, (u64)aux, (u64 *)old_aux, gfp_mask); | ||
| 72 | #endif | ||
| 73 | } | ||
| 74 | |||
| 60 | struct ulist_node *ulist_next(struct ulist *ulist, | 75 | struct ulist_node *ulist_next(struct ulist *ulist, |
| 61 | struct ulist_iterator *uiter); | 76 | struct ulist_iterator *uiter); |
| 62 | 77 | ||
