diff options
Diffstat (limited to 'fs/btrfs/tree-log.c')
| -rw-r--r-- | fs/btrfs/tree-log.c | 153 |
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); |
| 1226 | out: | 1229 | out: |
| 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 | } |
| 1314 | process_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 | ||
