aboutsummaryrefslogtreecommitdiffstats
path: root/fs/btrfs/tree-log.c
diff options
context:
space:
mode:
authorPaul Moore <pmoore@redhat.com>2014-01-28 14:44:16 -0500
committerPaul Moore <pmoore@redhat.com>2014-02-05 10:39:48 -0500
commit825e587af2e90e9b953849f3347a01d8f383d577 (patch)
treee48942a05882da47544e179c6a0c920e00137a6a /fs/btrfs/tree-log.c
parent8ed814602876bec9bad2649ca17f34b499357a1c (diff)
parentd8ec26d7f8287f5788a494f56e8814210f0e64be (diff)
Merge tag 'v3.13' into stable-3.14
Linux 3.13 Conflicts: security/selinux/hooks.c Trivial merge issue in selinux_inet_conn_request() likely due to me including patches that I sent to the stable folks in my next tree resulting in the patch hitting twice (I think). Thankfully it was an easy fix this time, but regardless, lesson learned, I will not do that again.
Diffstat (limited to 'fs/btrfs/tree-log.c')
-rw-r--r--fs/btrfs/tree-log.c153
1 files changed, 79 insertions, 74 deletions
diff --git a/fs/btrfs/tree-log.c b/fs/btrfs/tree-log.c
index 79f057c0619a..9f7fc51ca334 100644
--- a/fs/btrfs/tree-log.c
+++ b/fs/btrfs/tree-log.c
@@ -26,7 +26,6 @@
26#include "locking.h" 26#include "locking.h"
27#include "print-tree.h" 27#include "print-tree.h"
28#include "backref.h" 28#include "backref.h"
29#include "compat.h"
30#include "tree-log.h" 29#include "tree-log.h"
31#include "hash.h" 30#include "hash.h"
32 31
@@ -936,7 +935,7 @@ again:
936 parent_objectid, 935 parent_objectid,
937 victim_name, 936 victim_name,
938 victim_name_len)) { 937 victim_name_len)) {
939 btrfs_inc_nlink(inode); 938 inc_nlink(inode);
940 btrfs_release_path(path); 939 btrfs_release_path(path);
941 940
942 ret = btrfs_unlink_inode(trans, root, dir, 941 ret = btrfs_unlink_inode(trans, root, dir,
@@ -1006,7 +1005,7 @@ again:
1006 victim_parent = read_one_inode(root, 1005 victim_parent = read_one_inode(root,
1007 parent_objectid); 1006 parent_objectid);
1008 if (victim_parent) { 1007 if (victim_parent) {
1009 btrfs_inc_nlink(inode); 1008 inc_nlink(inode);
1010 btrfs_release_path(path); 1009 btrfs_release_path(path);
1011 1010
1012 ret = btrfs_unlink_inode(trans, root, 1011 ret = btrfs_unlink_inode(trans, root,
@@ -1113,11 +1112,11 @@ static noinline int add_inode_ref(struct btrfs_trans_handle *trans,
1113 struct extent_buffer *eb, int slot, 1112 struct extent_buffer *eb, int slot,
1114 struct btrfs_key *key) 1113 struct btrfs_key *key)
1115{ 1114{
1116 struct inode *dir; 1115 struct inode *dir = NULL;
1117 struct inode *inode; 1116 struct inode *inode = NULL;
1118 unsigned long ref_ptr; 1117 unsigned long ref_ptr;
1119 unsigned long ref_end; 1118 unsigned long ref_end;
1120 char *name; 1119 char *name = NULL;
1121 int namelen; 1120 int namelen;
1122 int ret; 1121 int ret;
1123 int search_done = 0; 1122 int search_done = 0;
@@ -1150,13 +1149,15 @@ static noinline int add_inode_ref(struct btrfs_trans_handle *trans,
1150 * care of the rest 1149 * care of the rest
1151 */ 1150 */
1152 dir = read_one_inode(root, parent_objectid); 1151 dir = read_one_inode(root, parent_objectid);
1153 if (!dir) 1152 if (!dir) {
1154 return -ENOENT; 1153 ret = -ENOENT;
1154 goto out;
1155 }
1155 1156
1156 inode = read_one_inode(root, inode_objectid); 1157 inode = read_one_inode(root, inode_objectid);
1157 if (!inode) { 1158 if (!inode) {
1158 iput(dir); 1159 ret = -EIO;
1159 return -EIO; 1160 goto out;
1160 } 1161 }
1161 1162
1162 while (ref_ptr < ref_end) { 1163 while (ref_ptr < ref_end) {
@@ -1169,14 +1170,16 @@ static noinline int add_inode_ref(struct btrfs_trans_handle *trans,
1169 */ 1170 */
1170 if (!dir) 1171 if (!dir)
1171 dir = read_one_inode(root, parent_objectid); 1172 dir = read_one_inode(root, parent_objectid);
1172 if (!dir) 1173 if (!dir) {
1173 return -ENOENT; 1174 ret = -ENOENT;
1175 goto out;
1176 }
1174 } else { 1177 } else {
1175 ret = ref_get_fields(eb, ref_ptr, &namelen, &name, 1178 ret = ref_get_fields(eb, ref_ptr, &namelen, &name,
1176 &ref_index); 1179 &ref_index);
1177 } 1180 }
1178 if (ret) 1181 if (ret)
1179 return ret; 1182 goto out;
1180 1183
1181 /* if we already have a perfect match, we're done */ 1184 /* if we already have a perfect match, we're done */
1182 if (!inode_in_dir(root, path, btrfs_ino(dir), btrfs_ino(inode), 1185 if (!inode_in_dir(root, path, btrfs_ino(dir), btrfs_ino(inode),
@@ -1196,12 +1199,11 @@ static noinline int add_inode_ref(struct btrfs_trans_handle *trans,
1196 parent_objectid, 1199 parent_objectid,
1197 ref_index, name, namelen, 1200 ref_index, name, namelen,
1198 &search_done); 1201 &search_done);
1199 if (ret == 1) { 1202 if (ret) {
1200 ret = 0; 1203 if (ret == 1)
1204 ret = 0;
1201 goto out; 1205 goto out;
1202 } 1206 }
1203 if (ret)
1204 goto out;
1205 } 1207 }
1206 1208
1207 /* insert our name */ 1209 /* insert our name */
@@ -1215,6 +1217,7 @@ static noinline int add_inode_ref(struct btrfs_trans_handle *trans,
1215 1217
1216 ref_ptr = (unsigned long)(ref_ptr + ref_struct_size) + namelen; 1218 ref_ptr = (unsigned long)(ref_ptr + ref_struct_size) + namelen;
1217 kfree(name); 1219 kfree(name);
1220 name = NULL;
1218 if (log_ref_ver) { 1221 if (log_ref_ver) {
1219 iput(dir); 1222 iput(dir);
1220 dir = NULL; 1223 dir = NULL;
@@ -1225,6 +1228,7 @@ static noinline int add_inode_ref(struct btrfs_trans_handle *trans,
1225 ret = overwrite_item(trans, root, path, eb, slot, key); 1228 ret = overwrite_item(trans, root, path, eb, slot, key);
1226out: 1229out:
1227 btrfs_release_path(path); 1230 btrfs_release_path(path);
1231 kfree(name);
1228 iput(dir); 1232 iput(dir);
1229 iput(inode); 1233 iput(inode);
1230 return ret; 1234 return ret;
@@ -1307,6 +1311,7 @@ static int count_inode_refs(struct btrfs_root *root,
1307 break; 1311 break;
1308 path->slots[0]--; 1312 path->slots[0]--;
1309 } 1313 }
1314process_slot:
1310 btrfs_item_key_to_cpu(path->nodes[0], &key, 1315 btrfs_item_key_to_cpu(path->nodes[0], &key,
1311 path->slots[0]); 1316 path->slots[0]);
1312 if (key.objectid != ino || 1317 if (key.objectid != ino ||
@@ -1327,6 +1332,10 @@ static int count_inode_refs(struct btrfs_root *root,
1327 1332
1328 if (key.offset == 0) 1333 if (key.offset == 0)
1329 break; 1334 break;
1335 if (path->slots[0] > 0) {
1336 path->slots[0]--;
1337 goto process_slot;
1338 }
1330 key.offset--; 1339 key.offset--;
1331 btrfs_release_path(path); 1340 btrfs_release_path(path);
1332 } 1341 }
@@ -1480,7 +1489,7 @@ static noinline int link_to_fixup_dir(struct btrfs_trans_handle *trans,
1480 if (!inode->i_nlink) 1489 if (!inode->i_nlink)
1481 set_nlink(inode, 1); 1490 set_nlink(inode, 1);
1482 else 1491 else
1483 btrfs_inc_nlink(inode); 1492 inc_nlink(inode);
1484 ret = btrfs_update_inode(trans, root, inode); 1493 ret = btrfs_update_inode(trans, root, inode);
1485 } else if (ret == -EEXIST) { 1494 } else if (ret == -EEXIST) {
1486 ret = 0; 1495 ret = 0;
@@ -1823,7 +1832,7 @@ again:
1823 dir_key->offset, 1832 dir_key->offset,
1824 name, name_len, 0); 1833 name, name_len, 0);
1825 } 1834 }
1826 if (IS_ERR_OR_NULL(log_di)) { 1835 if (!log_di || (IS_ERR(log_di) && PTR_ERR(log_di) == -ENOENT)) {
1827 btrfs_dir_item_key_to_cpu(eb, di, &location); 1836 btrfs_dir_item_key_to_cpu(eb, di, &location);
1828 btrfs_release_path(path); 1837 btrfs_release_path(path);
1829 btrfs_release_path(log_path); 1838 btrfs_release_path(log_path);
@@ -1841,7 +1850,7 @@ again:
1841 goto out; 1850 goto out;
1842 } 1851 }
1843 1852
1844 btrfs_inc_nlink(inode); 1853 inc_nlink(inode);
1845 ret = btrfs_unlink_inode(trans, root, dir, inode, 1854 ret = btrfs_unlink_inode(trans, root, dir, inode,
1846 name, name_len); 1855 name, name_len);
1847 if (!ret) 1856 if (!ret)
@@ -1860,6 +1869,9 @@ again:
1860 goto again; 1869 goto again;
1861 ret = 0; 1870 ret = 0;
1862 goto out; 1871 goto out;
1872 } else if (IS_ERR(log_di)) {
1873 kfree(name);
1874 return PTR_ERR(log_di);
1863 } 1875 }
1864 btrfs_release_path(log_path); 1876 btrfs_release_path(log_path);
1865 kfree(name); 1877 kfree(name);
@@ -2118,8 +2130,7 @@ static noinline int walk_down_log_tree(struct btrfs_trans_handle *trans,
2118 WARN_ON(*level >= BTRFS_MAX_LEVEL); 2130 WARN_ON(*level >= BTRFS_MAX_LEVEL);
2119 cur = path->nodes[*level]; 2131 cur = path->nodes[*level];
2120 2132
2121 if (btrfs_header_level(cur) != *level) 2133 WARN_ON(btrfs_header_level(cur) != *level);
2122 WARN_ON(1);
2123 2134
2124 if (path->slots[*level] >= 2135 if (path->slots[*level] >=
2125 btrfs_header_nritems(cur)) 2136 btrfs_header_nritems(cur))
@@ -2151,11 +2162,13 @@ static noinline int walk_down_log_tree(struct btrfs_trans_handle *trans,
2151 return ret; 2162 return ret;
2152 } 2163 }
2153 2164
2154 btrfs_tree_lock(next); 2165 if (trans) {
2155 btrfs_set_lock_blocking(next); 2166 btrfs_tree_lock(next);
2156 clean_tree_block(trans, root, next); 2167 btrfs_set_lock_blocking(next);
2157 btrfs_wait_tree_block_writeback(next); 2168 clean_tree_block(trans, root, next);
2158 btrfs_tree_unlock(next); 2169 btrfs_wait_tree_block_writeback(next);
2170 btrfs_tree_unlock(next);
2171 }
2159 2172
2160 WARN_ON(root_owner != 2173 WARN_ON(root_owner !=
2161 BTRFS_TREE_LOG_OBJECTID); 2174 BTRFS_TREE_LOG_OBJECTID);
@@ -2227,11 +2240,13 @@ static noinline int walk_up_log_tree(struct btrfs_trans_handle *trans,
2227 2240
2228 next = path->nodes[*level]; 2241 next = path->nodes[*level];
2229 2242
2230 btrfs_tree_lock(next); 2243 if (trans) {
2231 btrfs_set_lock_blocking(next); 2244 btrfs_tree_lock(next);
2232 clean_tree_block(trans, root, next); 2245 btrfs_set_lock_blocking(next);
2233 btrfs_wait_tree_block_writeback(next); 2246 clean_tree_block(trans, root, next);
2234 btrfs_tree_unlock(next); 2247 btrfs_wait_tree_block_writeback(next);
2248 btrfs_tree_unlock(next);
2249 }
2235 2250
2236 WARN_ON(root_owner != BTRFS_TREE_LOG_OBJECTID); 2251 WARN_ON(root_owner != BTRFS_TREE_LOG_OBJECTID);
2237 ret = btrfs_free_and_pin_reserved_extent(root, 2252 ret = btrfs_free_and_pin_reserved_extent(root,
@@ -2301,11 +2316,13 @@ static int walk_log_tree(struct btrfs_trans_handle *trans,
2301 2316
2302 next = path->nodes[orig_level]; 2317 next = path->nodes[orig_level];
2303 2318
2304 btrfs_tree_lock(next); 2319 if (trans) {
2305 btrfs_set_lock_blocking(next); 2320 btrfs_tree_lock(next);
2306 clean_tree_block(trans, log, next); 2321 btrfs_set_lock_blocking(next);
2307 btrfs_wait_tree_block_writeback(next); 2322 clean_tree_block(trans, log, next);
2308 btrfs_tree_unlock(next); 2323 btrfs_wait_tree_block_writeback(next);
2324 btrfs_tree_unlock(next);
2325 }
2309 2326
2310 WARN_ON(log->root_key.objectid != 2327 WARN_ON(log->root_key.objectid !=
2311 BTRFS_TREE_LOG_OBJECTID); 2328 BTRFS_TREE_LOG_OBJECTID);
@@ -2571,9 +2588,7 @@ int btrfs_sync_log(struct btrfs_trans_handle *trans,
2571 * the running transaction open, so a full commit can't hop 2588 * the running transaction open, so a full commit can't hop
2572 * in and cause problems either. 2589 * in and cause problems either.
2573 */ 2590 */
2574 btrfs_scrub_pause_super(root);
2575 ret = write_ctree_super(trans, root->fs_info->tree_root, 1); 2591 ret = write_ctree_super(trans, root->fs_info->tree_root, 1);
2576 btrfs_scrub_continue_super(root);
2577 if (ret) { 2592 if (ret) {
2578 btrfs_abort_transaction(trans, root, ret); 2593 btrfs_abort_transaction(trans, root, ret);
2579 goto out_wake_log_root; 2594 goto out_wake_log_root;
@@ -2608,13 +2623,10 @@ static void free_log_tree(struct btrfs_trans_handle *trans,
2608 .process_func = process_one_buffer 2623 .process_func = process_one_buffer
2609 }; 2624 };
2610 2625
2611 if (trans) { 2626 ret = walk_log_tree(trans, log, &wc);
2612 ret = walk_log_tree(trans, log, &wc); 2627 /* I don't think this can happen but just in case */
2613 2628 if (ret)
2614 /* I don't think this can happen but just in case */ 2629 btrfs_abort_transaction(trans, log, ret);
2615 if (ret)
2616 btrfs_abort_transaction(trans, log, ret);
2617 }
2618 2630
2619 while (1) { 2631 while (1) {
2620 ret = find_first_extent_bit(&log->dirty_log_pages, 2632 ret = find_first_extent_bit(&log->dirty_log_pages,
@@ -2867,7 +2879,6 @@ static noinline int log_dir_items(struct btrfs_trans_handle *trans,
2867 u64 min_offset, u64 *last_offset_ret) 2879 u64 min_offset, u64 *last_offset_ret)
2868{ 2880{
2869 struct btrfs_key min_key; 2881 struct btrfs_key min_key;
2870 struct btrfs_key max_key;
2871 struct btrfs_root *log = root->log_root; 2882 struct btrfs_root *log = root->log_root;
2872 struct extent_buffer *src; 2883 struct extent_buffer *src;
2873 int err = 0; 2884 int err = 0;
@@ -2879,9 +2890,6 @@ static noinline int log_dir_items(struct btrfs_trans_handle *trans,
2879 u64 ino = btrfs_ino(inode); 2890 u64 ino = btrfs_ino(inode);
2880 2891
2881 log = root->log_root; 2892 log = root->log_root;
2882 max_key.objectid = ino;
2883 max_key.offset = (u64)-1;
2884 max_key.type = key_type;
2885 2893
2886 min_key.objectid = ino; 2894 min_key.objectid = ino;
2887 min_key.type = key_type; 2895 min_key.type = key_type;
@@ -2889,8 +2897,7 @@ static noinline int log_dir_items(struct btrfs_trans_handle *trans,
2889 2897
2890 path->keep_locks = 1; 2898 path->keep_locks = 1;
2891 2899
2892 ret = btrfs_search_forward(root, &min_key, &max_key, 2900 ret = btrfs_search_forward(root, &min_key, path, trans->transid);
2893 path, trans->transid);
2894 2901
2895 /* 2902 /*
2896 * we didn't find anything from this transaction, see if there 2903 * we didn't find anything from this transaction, see if there
@@ -2943,10 +2950,8 @@ static noinline int log_dir_items(struct btrfs_trans_handle *trans,
2943 2950
2944 /* find the first key from this transaction again */ 2951 /* find the first key from this transaction again */
2945 ret = btrfs_search_slot(NULL, root, &min_key, path, 0, 0); 2952 ret = btrfs_search_slot(NULL, root, &min_key, path, 0, 0);
2946 if (ret != 0) { 2953 if (WARN_ON(ret != 0))
2947 WARN_ON(1);
2948 goto done; 2954 goto done;
2949 }
2950 2955
2951 /* 2956 /*
2952 * we have a block from this transaction, log every item in it 2957 * we have a block from this transaction, log every item in it
@@ -3172,11 +3177,10 @@ static int log_inode_item(struct btrfs_trans_handle *trans,
3172 struct inode *inode) 3177 struct inode *inode)
3173{ 3178{
3174 struct btrfs_inode_item *inode_item; 3179 struct btrfs_inode_item *inode_item;
3175 struct btrfs_key key;
3176 int ret; 3180 int ret;
3177 3181
3178 memcpy(&key, &BTRFS_I(inode)->location, sizeof(key)); 3182 ret = btrfs_insert_empty_item(trans, log, path,
3179 ret = btrfs_insert_empty_item(trans, log, path, &key, 3183 &BTRFS_I(inode)->location,
3180 sizeof(*inode_item)); 3184 sizeof(*inode_item));
3181 if (ret && ret != -EEXIST) 3185 if (ret && ret != -EEXIST)
3182 return ret; 3186 return ret;
@@ -3375,7 +3379,7 @@ static int log_one_extent(struct btrfs_trans_handle *trans,
3375 btrfs_set_token_file_extent_type(leaf, fi, 3379 btrfs_set_token_file_extent_type(leaf, fi,
3376 BTRFS_FILE_EXTENT_REG, 3380 BTRFS_FILE_EXTENT_REG,
3377 &token); 3381 &token);
3378 if (em->block_start == 0) 3382 if (em->block_start == EXTENT_MAP_HOLE)
3379 skip_csum = true; 3383 skip_csum = true;
3380 } 3384 }
3381 3385
@@ -3417,11 +3421,6 @@ static int log_one_extent(struct btrfs_trans_handle *trans,
3417 if (skip_csum) 3421 if (skip_csum)
3418 return 0; 3422 return 0;
3419 3423
3420 if (em->compress_type) {
3421 csum_offset = 0;
3422 csum_len = block_len;
3423 }
3424
3425 /* 3424 /*
3426 * First check and see if our csums are on our outstanding ordered 3425 * First check and see if our csums are on our outstanding ordered
3427 * extents. 3426 * extents.
@@ -3505,8 +3504,13 @@ unlocked:
3505 if (!mod_len || ret) 3504 if (!mod_len || ret)
3506 return ret; 3505 return ret;
3507 3506
3508 csum_offset = mod_start - em->start; 3507 if (em->compress_type) {
3509 csum_len = mod_len; 3508 csum_offset = 0;
3509 csum_len = block_len;
3510 } else {
3511 csum_offset = mod_start - em->start;
3512 csum_len = mod_len;
3513 }
3510 3514
3511 /* block start is already adjusted for the file extent offset. */ 3515 /* block start is already adjusted for the file extent offset. */
3512 ret = btrfs_lookup_csums_range(log->fs_info->csum_root, 3516 ret = btrfs_lookup_csums_range(log->fs_info->csum_root,
@@ -3693,7 +3697,8 @@ static int btrfs_log_inode(struct btrfs_trans_handle *trans,
3693 ret = btrfs_truncate_inode_items(trans, log, 3697 ret = btrfs_truncate_inode_items(trans, log,
3694 inode, 0, 0); 3698 inode, 0, 0);
3695 } else if (test_and_clear_bit(BTRFS_INODE_COPY_EVERYTHING, 3699 } else if (test_and_clear_bit(BTRFS_INODE_COPY_EVERYTHING,
3696 &BTRFS_I(inode)->runtime_flags)) { 3700 &BTRFS_I(inode)->runtime_flags) ||
3701 inode_only == LOG_INODE_EXISTS) {
3697 if (inode_only == LOG_INODE_ALL) 3702 if (inode_only == LOG_INODE_ALL)
3698 fast_search = true; 3703 fast_search = true;
3699 max_key.type = BTRFS_XATTR_ITEM_KEY; 3704 max_key.type = BTRFS_XATTR_ITEM_KEY;
@@ -3719,7 +3724,7 @@ static int btrfs_log_inode(struct btrfs_trans_handle *trans,
3719 3724
3720 while (1) { 3725 while (1) {
3721 ins_nr = 0; 3726 ins_nr = 0;
3722 ret = btrfs_search_forward(root, &min_key, &max_key, 3727 ret = btrfs_search_forward(root, &min_key,
3723 path, trans->transid); 3728 path, trans->transid);
3724 if (ret != 0) 3729 if (ret != 0)
3725 break; 3730 break;
@@ -3769,14 +3774,14 @@ next_slot:
3769 } 3774 }
3770 btrfs_release_path(path); 3775 btrfs_release_path(path);
3771 3776
3772 if (min_key.offset < (u64)-1) 3777 if (min_key.offset < (u64)-1) {
3773 min_key.offset++; 3778 min_key.offset++;
3774 else if (min_key.type < (u8)-1) 3779 } else if (min_key.type < max_key.type) {
3775 min_key.type++; 3780 min_key.type++;
3776 else if (min_key.objectid < (u64)-1) 3781 min_key.offset = 0;
3777 min_key.objectid++; 3782 } else {
3778 else
3779 break; 3783 break;
3784 }
3780 } 3785 }
3781 if (ins_nr) { 3786 if (ins_nr) {
3782 ret = copy_items(trans, inode, dst_path, src, ins_start_slot, 3787 ret = copy_items(trans, inode, dst_path, src, ins_start_slot,
@@ -3797,7 +3802,7 @@ log_extents:
3797 err = ret; 3802 err = ret;
3798 goto out_unlock; 3803 goto out_unlock;
3799 } 3804 }
3800 } else { 3805 } else if (inode_only == LOG_INODE_ALL) {
3801 struct extent_map_tree *tree = &BTRFS_I(inode)->extent_tree; 3806 struct extent_map_tree *tree = &BTRFS_I(inode)->extent_tree;
3802 struct extent_map *em, *n; 3807 struct extent_map *em, *n;
3803 3808