diff options
-rw-r--r-- | fs/btrfs/ctree.c | 189 | ||||
-rw-r--r-- | fs/btrfs/disk-io.c | 7 | ||||
-rw-r--r-- | fs/btrfs/extent_io.c | 67 | ||||
-rw-r--r-- | fs/btrfs/extent_io.h | 11 | ||||
-rw-r--r-- | fs/btrfs/file-item.c | 32 | ||||
-rw-r--r-- | fs/btrfs/inode.c | 24 | ||||
-rw-r--r-- | fs/btrfs/struct-funcs.c | 100 |
7 files changed, 52 insertions, 378 deletions
diff --git a/fs/btrfs/ctree.c b/fs/btrfs/ctree.c index 2e667868e0d2..d2431284b913 100644 --- a/fs/btrfs/ctree.c +++ b/fs/btrfs/ctree.c | |||
@@ -626,14 +626,6 @@ int btrfs_realloc_node(struct btrfs_trans_handle *trans, | |||
626 | for (i = start_slot; i < end_slot; i++) { | 626 | for (i = start_slot; i < end_slot; i++) { |
627 | int close = 1; | 627 | int close = 1; |
628 | 628 | ||
629 | if (!parent->map_token) { | ||
630 | map_extent_buffer(parent, | ||
631 | btrfs_node_key_ptr_offset(i), | ||
632 | sizeof(struct btrfs_key_ptr), | ||
633 | &parent->map_token, &parent->kaddr, | ||
634 | &parent->map_start, &parent->map_len, | ||
635 | KM_USER1); | ||
636 | } | ||
637 | btrfs_node_key(parent, &disk_key, i); | 629 | btrfs_node_key(parent, &disk_key, i); |
638 | if (!progress_passed && comp_keys(&disk_key, progress) < 0) | 630 | if (!progress_passed && comp_keys(&disk_key, progress) < 0) |
639 | continue; | 631 | continue; |
@@ -656,11 +648,6 @@ int btrfs_realloc_node(struct btrfs_trans_handle *trans, | |||
656 | last_block = blocknr; | 648 | last_block = blocknr; |
657 | continue; | 649 | continue; |
658 | } | 650 | } |
659 | if (parent->map_token) { | ||
660 | unmap_extent_buffer(parent, parent->map_token, | ||
661 | KM_USER1); | ||
662 | parent->map_token = NULL; | ||
663 | } | ||
664 | 651 | ||
665 | cur = btrfs_find_tree_block(root, blocknr, blocksize); | 652 | cur = btrfs_find_tree_block(root, blocknr, blocksize); |
666 | if (cur) | 653 | if (cur) |
@@ -701,11 +688,6 @@ int btrfs_realloc_node(struct btrfs_trans_handle *trans, | |||
701 | btrfs_tree_unlock(cur); | 688 | btrfs_tree_unlock(cur); |
702 | free_extent_buffer(cur); | 689 | free_extent_buffer(cur); |
703 | } | 690 | } |
704 | if (parent->map_token) { | ||
705 | unmap_extent_buffer(parent, parent->map_token, | ||
706 | KM_USER1); | ||
707 | parent->map_token = NULL; | ||
708 | } | ||
709 | return err; | 691 | return err; |
710 | } | 692 | } |
711 | 693 | ||
@@ -746,7 +728,6 @@ static noinline int generic_bin_search(struct extent_buffer *eb, | |||
746 | struct btrfs_disk_key *tmp = NULL; | 728 | struct btrfs_disk_key *tmp = NULL; |
747 | struct btrfs_disk_key unaligned; | 729 | struct btrfs_disk_key unaligned; |
748 | unsigned long offset; | 730 | unsigned long offset; |
749 | char *map_token = NULL; | ||
750 | char *kaddr = NULL; | 731 | char *kaddr = NULL; |
751 | unsigned long map_start = 0; | 732 | unsigned long map_start = 0; |
752 | unsigned long map_len = 0; | 733 | unsigned long map_len = 0; |
@@ -756,18 +737,13 @@ static noinline int generic_bin_search(struct extent_buffer *eb, | |||
756 | mid = (low + high) / 2; | 737 | mid = (low + high) / 2; |
757 | offset = p + mid * item_size; | 738 | offset = p + mid * item_size; |
758 | 739 | ||
759 | if (!map_token || offset < map_start || | 740 | if (!kaddr || offset < map_start || |
760 | (offset + sizeof(struct btrfs_disk_key)) > | 741 | (offset + sizeof(struct btrfs_disk_key)) > |
761 | map_start + map_len) { | 742 | map_start + map_len) { |
762 | if (map_token) { | ||
763 | unmap_extent_buffer(eb, map_token, KM_USER0); | ||
764 | map_token = NULL; | ||
765 | } | ||
766 | 743 | ||
767 | err = map_private_extent_buffer(eb, offset, | 744 | err = map_private_extent_buffer(eb, offset, |
768 | sizeof(struct btrfs_disk_key), | 745 | sizeof(struct btrfs_disk_key), |
769 | &map_token, &kaddr, | 746 | &kaddr, &map_start, &map_len); |
770 | &map_start, &map_len, KM_USER0); | ||
771 | 747 | ||
772 | if (!err) { | 748 | if (!err) { |
773 | tmp = (struct btrfs_disk_key *)(kaddr + offset - | 749 | tmp = (struct btrfs_disk_key *)(kaddr + offset - |
@@ -790,14 +766,10 @@ static noinline int generic_bin_search(struct extent_buffer *eb, | |||
790 | high = mid; | 766 | high = mid; |
791 | else { | 767 | else { |
792 | *slot = mid; | 768 | *slot = mid; |
793 | if (map_token) | ||
794 | unmap_extent_buffer(eb, map_token, KM_USER0); | ||
795 | return 0; | 769 | return 0; |
796 | } | 770 | } |
797 | } | 771 | } |
798 | *slot = low; | 772 | *slot = low; |
799 | if (map_token) | ||
800 | unmap_extent_buffer(eb, map_token, KM_USER0); | ||
801 | return 1; | 773 | return 1; |
802 | } | 774 | } |
803 | 775 | ||
@@ -1228,7 +1200,6 @@ static void reada_for_search(struct btrfs_root *root, | |||
1228 | u32 nr; | 1200 | u32 nr; |
1229 | u32 blocksize; | 1201 | u32 blocksize; |
1230 | u32 nscan = 0; | 1202 | u32 nscan = 0; |
1231 | bool map = true; | ||
1232 | 1203 | ||
1233 | if (level != 1) | 1204 | if (level != 1) |
1234 | return; | 1205 | return; |
@@ -1250,19 +1221,8 @@ static void reada_for_search(struct btrfs_root *root, | |||
1250 | 1221 | ||
1251 | nritems = btrfs_header_nritems(node); | 1222 | nritems = btrfs_header_nritems(node); |
1252 | nr = slot; | 1223 | nr = slot; |
1253 | if (node->map_token || path->skip_locking) | ||
1254 | map = false; | ||
1255 | 1224 | ||
1256 | while (1) { | 1225 | while (1) { |
1257 | if (map && !node->map_token) { | ||
1258 | unsigned long offset = btrfs_node_key_ptr_offset(nr); | ||
1259 | map_private_extent_buffer(node, offset, | ||
1260 | sizeof(struct btrfs_key_ptr), | ||
1261 | &node->map_token, | ||
1262 | &node->kaddr, | ||
1263 | &node->map_start, | ||
1264 | &node->map_len, KM_USER1); | ||
1265 | } | ||
1266 | if (direction < 0) { | 1226 | if (direction < 0) { |
1267 | if (nr == 0) | 1227 | if (nr == 0) |
1268 | break; | 1228 | break; |
@@ -1281,11 +1241,6 @@ static void reada_for_search(struct btrfs_root *root, | |||
1281 | if ((search <= target && target - search <= 65536) || | 1241 | if ((search <= target && target - search <= 65536) || |
1282 | (search > target && search - target <= 65536)) { | 1242 | (search > target && search - target <= 65536)) { |
1283 | gen = btrfs_node_ptr_generation(node, nr); | 1243 | gen = btrfs_node_ptr_generation(node, nr); |
1284 | if (map && node->map_token) { | ||
1285 | unmap_extent_buffer(node, node->map_token, | ||
1286 | KM_USER1); | ||
1287 | node->map_token = NULL; | ||
1288 | } | ||
1289 | readahead_tree_block(root, search, blocksize, gen); | 1244 | readahead_tree_block(root, search, blocksize, gen); |
1290 | nread += blocksize; | 1245 | nread += blocksize; |
1291 | } | 1246 | } |
@@ -1293,10 +1248,6 @@ static void reada_for_search(struct btrfs_root *root, | |||
1293 | if ((nread > 65536 || nscan > 32)) | 1248 | if ((nread > 65536 || nscan > 32)) |
1294 | break; | 1249 | break; |
1295 | } | 1250 | } |
1296 | if (map && node->map_token) { | ||
1297 | unmap_extent_buffer(node, node->map_token, KM_USER1); | ||
1298 | node->map_token = NULL; | ||
1299 | } | ||
1300 | } | 1251 | } |
1301 | 1252 | ||
1302 | /* | 1253 | /* |
@@ -2253,14 +2204,6 @@ static noinline int __push_leaf_right(struct btrfs_trans_handle *trans, | |||
2253 | if (path->slots[0] == i) | 2204 | if (path->slots[0] == i) |
2254 | push_space += data_size; | 2205 | push_space += data_size; |
2255 | 2206 | ||
2256 | if (!left->map_token) { | ||
2257 | map_extent_buffer(left, (unsigned long)item, | ||
2258 | sizeof(struct btrfs_item), | ||
2259 | &left->map_token, &left->kaddr, | ||
2260 | &left->map_start, &left->map_len, | ||
2261 | KM_USER1); | ||
2262 | } | ||
2263 | |||
2264 | this_item_size = btrfs_item_size(left, item); | 2207 | this_item_size = btrfs_item_size(left, item); |
2265 | if (this_item_size + sizeof(*item) + push_space > free_space) | 2208 | if (this_item_size + sizeof(*item) + push_space > free_space) |
2266 | break; | 2209 | break; |
@@ -2271,10 +2214,6 @@ static noinline int __push_leaf_right(struct btrfs_trans_handle *trans, | |||
2271 | break; | 2214 | break; |
2272 | i--; | 2215 | i--; |
2273 | } | 2216 | } |
2274 | if (left->map_token) { | ||
2275 | unmap_extent_buffer(left, left->map_token, KM_USER1); | ||
2276 | left->map_token = NULL; | ||
2277 | } | ||
2278 | 2217 | ||
2279 | if (push_items == 0) | 2218 | if (push_items == 0) |
2280 | goto out_unlock; | 2219 | goto out_unlock; |
@@ -2316,21 +2255,10 @@ static noinline int __push_leaf_right(struct btrfs_trans_handle *trans, | |||
2316 | push_space = BTRFS_LEAF_DATA_SIZE(root); | 2255 | push_space = BTRFS_LEAF_DATA_SIZE(root); |
2317 | for (i = 0; i < right_nritems; i++) { | 2256 | for (i = 0; i < right_nritems; i++) { |
2318 | item = btrfs_item_nr(right, i); | 2257 | item = btrfs_item_nr(right, i); |
2319 | if (!right->map_token) { | ||
2320 | map_extent_buffer(right, (unsigned long)item, | ||
2321 | sizeof(struct btrfs_item), | ||
2322 | &right->map_token, &right->kaddr, | ||
2323 | &right->map_start, &right->map_len, | ||
2324 | KM_USER1); | ||
2325 | } | ||
2326 | push_space -= btrfs_item_size(right, item); | 2258 | push_space -= btrfs_item_size(right, item); |
2327 | btrfs_set_item_offset(right, item, push_space); | 2259 | btrfs_set_item_offset(right, item, push_space); |
2328 | } | 2260 | } |
2329 | 2261 | ||
2330 | if (right->map_token) { | ||
2331 | unmap_extent_buffer(right, right->map_token, KM_USER1); | ||
2332 | right->map_token = NULL; | ||
2333 | } | ||
2334 | left_nritems -= push_items; | 2262 | left_nritems -= push_items; |
2335 | btrfs_set_header_nritems(left, left_nritems); | 2263 | btrfs_set_header_nritems(left, left_nritems); |
2336 | 2264 | ||
@@ -2467,13 +2395,6 @@ static noinline int __push_leaf_left(struct btrfs_trans_handle *trans, | |||
2467 | 2395 | ||
2468 | for (i = 0; i < nr; i++) { | 2396 | for (i = 0; i < nr; i++) { |
2469 | item = btrfs_item_nr(right, i); | 2397 | item = btrfs_item_nr(right, i); |
2470 | if (!right->map_token) { | ||
2471 | map_extent_buffer(right, (unsigned long)item, | ||
2472 | sizeof(struct btrfs_item), | ||
2473 | &right->map_token, &right->kaddr, | ||
2474 | &right->map_start, &right->map_len, | ||
2475 | KM_USER1); | ||
2476 | } | ||
2477 | 2398 | ||
2478 | if (!empty && push_items > 0) { | 2399 | if (!empty && push_items > 0) { |
2479 | if (path->slots[0] < i) | 2400 | if (path->slots[0] < i) |
@@ -2496,11 +2417,6 @@ static noinline int __push_leaf_left(struct btrfs_trans_handle *trans, | |||
2496 | push_space += this_item_size + sizeof(*item); | 2417 | push_space += this_item_size + sizeof(*item); |
2497 | } | 2418 | } |
2498 | 2419 | ||
2499 | if (right->map_token) { | ||
2500 | unmap_extent_buffer(right, right->map_token, KM_USER1); | ||
2501 | right->map_token = NULL; | ||
2502 | } | ||
2503 | |||
2504 | if (push_items == 0) { | 2420 | if (push_items == 0) { |
2505 | ret = 1; | 2421 | ret = 1; |
2506 | goto out; | 2422 | goto out; |
@@ -2530,23 +2446,12 @@ static noinline int __push_leaf_left(struct btrfs_trans_handle *trans, | |||
2530 | u32 ioff; | 2446 | u32 ioff; |
2531 | 2447 | ||
2532 | item = btrfs_item_nr(left, i); | 2448 | item = btrfs_item_nr(left, i); |
2533 | if (!left->map_token) { | ||
2534 | map_extent_buffer(left, (unsigned long)item, | ||
2535 | sizeof(struct btrfs_item), | ||
2536 | &left->map_token, &left->kaddr, | ||
2537 | &left->map_start, &left->map_len, | ||
2538 | KM_USER1); | ||
2539 | } | ||
2540 | 2449 | ||
2541 | ioff = btrfs_item_offset(left, item); | 2450 | ioff = btrfs_item_offset(left, item); |
2542 | btrfs_set_item_offset(left, item, | 2451 | btrfs_set_item_offset(left, item, |
2543 | ioff - (BTRFS_LEAF_DATA_SIZE(root) - old_left_item_size)); | 2452 | ioff - (BTRFS_LEAF_DATA_SIZE(root) - old_left_item_size)); |
2544 | } | 2453 | } |
2545 | btrfs_set_header_nritems(left, old_left_nritems + push_items); | 2454 | btrfs_set_header_nritems(left, old_left_nritems + push_items); |
2546 | if (left->map_token) { | ||
2547 | unmap_extent_buffer(left, left->map_token, KM_USER1); | ||
2548 | left->map_token = NULL; | ||
2549 | } | ||
2550 | 2455 | ||
2551 | /* fixup right node */ | 2456 | /* fixup right node */ |
2552 | if (push_items > right_nritems) { | 2457 | if (push_items > right_nritems) { |
@@ -2574,21 +2479,9 @@ static noinline int __push_leaf_left(struct btrfs_trans_handle *trans, | |||
2574 | for (i = 0; i < right_nritems; i++) { | 2479 | for (i = 0; i < right_nritems; i++) { |
2575 | item = btrfs_item_nr(right, i); | 2480 | item = btrfs_item_nr(right, i); |
2576 | 2481 | ||
2577 | if (!right->map_token) { | ||
2578 | map_extent_buffer(right, (unsigned long)item, | ||
2579 | sizeof(struct btrfs_item), | ||
2580 | &right->map_token, &right->kaddr, | ||
2581 | &right->map_start, &right->map_len, | ||
2582 | KM_USER1); | ||
2583 | } | ||
2584 | |||
2585 | push_space = push_space - btrfs_item_size(right, item); | 2482 | push_space = push_space - btrfs_item_size(right, item); |
2586 | btrfs_set_item_offset(right, item, push_space); | 2483 | btrfs_set_item_offset(right, item, push_space); |
2587 | } | 2484 | } |
2588 | if (right->map_token) { | ||
2589 | unmap_extent_buffer(right, right->map_token, KM_USER1); | ||
2590 | right->map_token = NULL; | ||
2591 | } | ||
2592 | 2485 | ||
2593 | btrfs_mark_buffer_dirty(left); | 2486 | btrfs_mark_buffer_dirty(left); |
2594 | if (right_nritems) | 2487 | if (right_nritems) |
@@ -2729,23 +2622,10 @@ static noinline int copy_for_split(struct btrfs_trans_handle *trans, | |||
2729 | struct btrfs_item *item = btrfs_item_nr(right, i); | 2622 | struct btrfs_item *item = btrfs_item_nr(right, i); |
2730 | u32 ioff; | 2623 | u32 ioff; |
2731 | 2624 | ||
2732 | if (!right->map_token) { | ||
2733 | map_extent_buffer(right, (unsigned long)item, | ||
2734 | sizeof(struct btrfs_item), | ||
2735 | &right->map_token, &right->kaddr, | ||
2736 | &right->map_start, &right->map_len, | ||
2737 | KM_USER1); | ||
2738 | } | ||
2739 | |||
2740 | ioff = btrfs_item_offset(right, item); | 2625 | ioff = btrfs_item_offset(right, item); |
2741 | btrfs_set_item_offset(right, item, ioff + rt_data_off); | 2626 | btrfs_set_item_offset(right, item, ioff + rt_data_off); |
2742 | } | 2627 | } |
2743 | 2628 | ||
2744 | if (right->map_token) { | ||
2745 | unmap_extent_buffer(right, right->map_token, KM_USER1); | ||
2746 | right->map_token = NULL; | ||
2747 | } | ||
2748 | |||
2749 | btrfs_set_header_nritems(l, mid); | 2629 | btrfs_set_header_nritems(l, mid); |
2750 | ret = 0; | 2630 | ret = 0; |
2751 | btrfs_item_key(right, &disk_key, 0); | 2631 | btrfs_item_key(right, &disk_key, 0); |
@@ -3264,23 +3144,10 @@ int btrfs_truncate_item(struct btrfs_trans_handle *trans, | |||
3264 | u32 ioff; | 3144 | u32 ioff; |
3265 | item = btrfs_item_nr(leaf, i); | 3145 | item = btrfs_item_nr(leaf, i); |
3266 | 3146 | ||
3267 | if (!leaf->map_token) { | ||
3268 | map_extent_buffer(leaf, (unsigned long)item, | ||
3269 | sizeof(struct btrfs_item), | ||
3270 | &leaf->map_token, &leaf->kaddr, | ||
3271 | &leaf->map_start, &leaf->map_len, | ||
3272 | KM_USER1); | ||
3273 | } | ||
3274 | |||
3275 | ioff = btrfs_item_offset(leaf, item); | 3147 | ioff = btrfs_item_offset(leaf, item); |
3276 | btrfs_set_item_offset(leaf, item, ioff + size_diff); | 3148 | btrfs_set_item_offset(leaf, item, ioff + size_diff); |
3277 | } | 3149 | } |
3278 | 3150 | ||
3279 | if (leaf->map_token) { | ||
3280 | unmap_extent_buffer(leaf, leaf->map_token, KM_USER1); | ||
3281 | leaf->map_token = NULL; | ||
3282 | } | ||
3283 | |||
3284 | /* shift the data */ | 3151 | /* shift the data */ |
3285 | if (from_end) { | 3152 | if (from_end) { |
3286 | memmove_extent_buffer(leaf, btrfs_leaf_data(leaf) + | 3153 | memmove_extent_buffer(leaf, btrfs_leaf_data(leaf) + |
@@ -3377,22 +3244,10 @@ int btrfs_extend_item(struct btrfs_trans_handle *trans, | |||
3377 | u32 ioff; | 3244 | u32 ioff; |
3378 | item = btrfs_item_nr(leaf, i); | 3245 | item = btrfs_item_nr(leaf, i); |
3379 | 3246 | ||
3380 | if (!leaf->map_token) { | ||
3381 | map_extent_buffer(leaf, (unsigned long)item, | ||
3382 | sizeof(struct btrfs_item), | ||
3383 | &leaf->map_token, &leaf->kaddr, | ||
3384 | &leaf->map_start, &leaf->map_len, | ||
3385 | KM_USER1); | ||
3386 | } | ||
3387 | ioff = btrfs_item_offset(leaf, item); | 3247 | ioff = btrfs_item_offset(leaf, item); |
3388 | btrfs_set_item_offset(leaf, item, ioff - data_size); | 3248 | btrfs_set_item_offset(leaf, item, ioff - data_size); |
3389 | } | 3249 | } |
3390 | 3250 | ||
3391 | if (leaf->map_token) { | ||
3392 | unmap_extent_buffer(leaf, leaf->map_token, KM_USER1); | ||
3393 | leaf->map_token = NULL; | ||
3394 | } | ||
3395 | |||
3396 | /* shift the data */ | 3251 | /* shift the data */ |
3397 | memmove_extent_buffer(leaf, btrfs_leaf_data(leaf) + | 3252 | memmove_extent_buffer(leaf, btrfs_leaf_data(leaf) + |
3398 | data_end - data_size, btrfs_leaf_data(leaf) + | 3253 | data_end - data_size, btrfs_leaf_data(leaf) + |
@@ -3494,27 +3349,13 @@ int btrfs_insert_some_items(struct btrfs_trans_handle *trans, | |||
3494 | * item0..itemN ... dataN.offset..dataN.size .. data0.size | 3349 | * item0..itemN ... dataN.offset..dataN.size .. data0.size |
3495 | */ | 3350 | */ |
3496 | /* first correct the data pointers */ | 3351 | /* first correct the data pointers */ |
3497 | WARN_ON(leaf->map_token); | ||
3498 | for (i = slot; i < nritems; i++) { | 3352 | for (i = slot; i < nritems; i++) { |
3499 | u32 ioff; | 3353 | u32 ioff; |
3500 | 3354 | ||
3501 | item = btrfs_item_nr(leaf, i); | 3355 | item = btrfs_item_nr(leaf, i); |
3502 | if (!leaf->map_token) { | ||
3503 | map_extent_buffer(leaf, (unsigned long)item, | ||
3504 | sizeof(struct btrfs_item), | ||
3505 | &leaf->map_token, &leaf->kaddr, | ||
3506 | &leaf->map_start, &leaf->map_len, | ||
3507 | KM_USER1); | ||
3508 | } | ||
3509 | |||
3510 | ioff = btrfs_item_offset(leaf, item); | 3356 | ioff = btrfs_item_offset(leaf, item); |
3511 | btrfs_set_item_offset(leaf, item, ioff - total_data); | 3357 | btrfs_set_item_offset(leaf, item, ioff - total_data); |
3512 | } | 3358 | } |
3513 | if (leaf->map_token) { | ||
3514 | unmap_extent_buffer(leaf, leaf->map_token, KM_USER1); | ||
3515 | leaf->map_token = NULL; | ||
3516 | } | ||
3517 | |||
3518 | /* shift the items */ | 3359 | /* shift the items */ |
3519 | memmove_extent_buffer(leaf, btrfs_item_nr_offset(slot + nr), | 3360 | memmove_extent_buffer(leaf, btrfs_item_nr_offset(slot + nr), |
3520 | btrfs_item_nr_offset(slot), | 3361 | btrfs_item_nr_offset(slot), |
@@ -3608,27 +3449,13 @@ int setup_items_for_insert(struct btrfs_trans_handle *trans, | |||
3608 | * item0..itemN ... dataN.offset..dataN.size .. data0.size | 3449 | * item0..itemN ... dataN.offset..dataN.size .. data0.size |
3609 | */ | 3450 | */ |
3610 | /* first correct the data pointers */ | 3451 | /* first correct the data pointers */ |
3611 | WARN_ON(leaf->map_token); | ||
3612 | for (i = slot; i < nritems; i++) { | 3452 | for (i = slot; i < nritems; i++) { |
3613 | u32 ioff; | 3453 | u32 ioff; |
3614 | 3454 | ||
3615 | item = btrfs_item_nr(leaf, i); | 3455 | item = btrfs_item_nr(leaf, i); |
3616 | if (!leaf->map_token) { | ||
3617 | map_extent_buffer(leaf, (unsigned long)item, | ||
3618 | sizeof(struct btrfs_item), | ||
3619 | &leaf->map_token, &leaf->kaddr, | ||
3620 | &leaf->map_start, &leaf->map_len, | ||
3621 | KM_USER1); | ||
3622 | } | ||
3623 | |||
3624 | ioff = btrfs_item_offset(leaf, item); | 3456 | ioff = btrfs_item_offset(leaf, item); |
3625 | btrfs_set_item_offset(leaf, item, ioff - total_data); | 3457 | btrfs_set_item_offset(leaf, item, ioff - total_data); |
3626 | } | 3458 | } |
3627 | if (leaf->map_token) { | ||
3628 | unmap_extent_buffer(leaf, leaf->map_token, KM_USER1); | ||
3629 | leaf->map_token = NULL; | ||
3630 | } | ||
3631 | |||
3632 | /* shift the items */ | 3459 | /* shift the items */ |
3633 | memmove_extent_buffer(leaf, btrfs_item_nr_offset(slot + nr), | 3460 | memmove_extent_buffer(leaf, btrfs_item_nr_offset(slot + nr), |
3634 | btrfs_item_nr_offset(slot), | 3461 | btrfs_item_nr_offset(slot), |
@@ -3840,22 +3667,10 @@ int btrfs_del_items(struct btrfs_trans_handle *trans, struct btrfs_root *root, | |||
3840 | u32 ioff; | 3667 | u32 ioff; |
3841 | 3668 | ||
3842 | item = btrfs_item_nr(leaf, i); | 3669 | item = btrfs_item_nr(leaf, i); |
3843 | if (!leaf->map_token) { | ||
3844 | map_extent_buffer(leaf, (unsigned long)item, | ||
3845 | sizeof(struct btrfs_item), | ||
3846 | &leaf->map_token, &leaf->kaddr, | ||
3847 | &leaf->map_start, &leaf->map_len, | ||
3848 | KM_USER1); | ||
3849 | } | ||
3850 | ioff = btrfs_item_offset(leaf, item); | 3670 | ioff = btrfs_item_offset(leaf, item); |
3851 | btrfs_set_item_offset(leaf, item, ioff + dsize); | 3671 | btrfs_set_item_offset(leaf, item, ioff + dsize); |
3852 | } | 3672 | } |
3853 | 3673 | ||
3854 | if (leaf->map_token) { | ||
3855 | unmap_extent_buffer(leaf, leaf->map_token, KM_USER1); | ||
3856 | leaf->map_token = NULL; | ||
3857 | } | ||
3858 | |||
3859 | memmove_extent_buffer(leaf, btrfs_item_nr_offset(slot), | 3674 | memmove_extent_buffer(leaf, btrfs_item_nr_offset(slot), |
3860 | btrfs_item_nr_offset(slot + nr), | 3675 | btrfs_item_nr_offset(slot + nr), |
3861 | sizeof(struct btrfs_item) * | 3676 | sizeof(struct btrfs_item) * |
diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c index 234a08404fc2..97f22ff8326f 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c | |||
@@ -217,7 +217,6 @@ static int csum_tree_block(struct btrfs_root *root, struct extent_buffer *buf, | |||
217 | unsigned long len; | 217 | unsigned long len; |
218 | unsigned long cur_len; | 218 | unsigned long cur_len; |
219 | unsigned long offset = BTRFS_CSUM_SIZE; | 219 | unsigned long offset = BTRFS_CSUM_SIZE; |
220 | char *map_token = NULL; | ||
221 | char *kaddr; | 220 | char *kaddr; |
222 | unsigned long map_start; | 221 | unsigned long map_start; |
223 | unsigned long map_len; | 222 | unsigned long map_len; |
@@ -228,8 +227,7 @@ static int csum_tree_block(struct btrfs_root *root, struct extent_buffer *buf, | |||
228 | len = buf->len - offset; | 227 | len = buf->len - offset; |
229 | while (len > 0) { | 228 | while (len > 0) { |
230 | err = map_private_extent_buffer(buf, offset, 32, | 229 | err = map_private_extent_buffer(buf, offset, 32, |
231 | &map_token, &kaddr, | 230 | &kaddr, &map_start, &map_len); |
232 | &map_start, &map_len, KM_USER0); | ||
233 | if (err) | 231 | if (err) |
234 | return 1; | 232 | return 1; |
235 | cur_len = min(len, map_len - (offset - map_start)); | 233 | cur_len = min(len, map_len - (offset - map_start)); |
@@ -237,7 +235,6 @@ static int csum_tree_block(struct btrfs_root *root, struct extent_buffer *buf, | |||
237 | crc, cur_len); | 235 | crc, cur_len); |
238 | len -= cur_len; | 236 | len -= cur_len; |
239 | offset += cur_len; | 237 | offset += cur_len; |
240 | unmap_extent_buffer(buf, map_token, KM_USER0); | ||
241 | } | 238 | } |
242 | if (csum_size > sizeof(inline_result)) { | 239 | if (csum_size > sizeof(inline_result)) { |
243 | result = kzalloc(csum_size * sizeof(char), GFP_NOFS); | 240 | result = kzalloc(csum_size * sizeof(char), GFP_NOFS); |
@@ -1603,7 +1600,7 @@ struct btrfs_root *open_ctree(struct super_block *sb, | |||
1603 | goto fail_bdi; | 1600 | goto fail_bdi; |
1604 | } | 1601 | } |
1605 | 1602 | ||
1606 | fs_info->btree_inode->i_mapping->flags &= ~__GFP_FS; | 1603 | mapping_set_gfp_mask(fs_info->btree_inode->i_mapping, GFP_NOFS); |
1607 | 1604 | ||
1608 | INIT_RADIX_TREE(&fs_info->fs_roots_radix, GFP_ATOMIC); | 1605 | INIT_RADIX_TREE(&fs_info->fs_roots_radix, GFP_ATOMIC); |
1609 | INIT_LIST_HEAD(&fs_info->trans_list); | 1606 | INIT_LIST_HEAD(&fs_info->trans_list); |
diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c index 89bbde46bd83..76ecbb8ed0e0 100644 --- a/fs/btrfs/extent_io.c +++ b/fs/btrfs/extent_io.c | |||
@@ -3114,7 +3114,7 @@ struct extent_buffer *alloc_extent_buffer(struct extent_io_tree *tree, | |||
3114 | i = 0; | 3114 | i = 0; |
3115 | } | 3115 | } |
3116 | for (; i < num_pages; i++, index++) { | 3116 | for (; i < num_pages; i++, index++) { |
3117 | p = find_or_create_page(mapping, index, GFP_NOFS | __GFP_HIGHMEM); | 3117 | p = find_or_create_page(mapping, index, GFP_NOFS); |
3118 | if (!p) { | 3118 | if (!p) { |
3119 | WARN_ON(1); | 3119 | WARN_ON(1); |
3120 | goto free_eb; | 3120 | goto free_eb; |
@@ -3487,9 +3487,8 @@ void read_extent_buffer(struct extent_buffer *eb, void *dstv, | |||
3487 | page = extent_buffer_page(eb, i); | 3487 | page = extent_buffer_page(eb, i); |
3488 | 3488 | ||
3489 | cur = min(len, (PAGE_CACHE_SIZE - offset)); | 3489 | cur = min(len, (PAGE_CACHE_SIZE - offset)); |
3490 | kaddr = kmap_atomic(page, KM_USER1); | 3490 | kaddr = page_address(page); |
3491 | memcpy(dst, kaddr + offset, cur); | 3491 | memcpy(dst, kaddr + offset, cur); |
3492 | kunmap_atomic(kaddr, KM_USER1); | ||
3493 | 3492 | ||
3494 | dst += cur; | 3493 | dst += cur; |
3495 | len -= cur; | 3494 | len -= cur; |
@@ -3499,9 +3498,9 @@ void read_extent_buffer(struct extent_buffer *eb, void *dstv, | |||
3499 | } | 3498 | } |
3500 | 3499 | ||
3501 | int map_private_extent_buffer(struct extent_buffer *eb, unsigned long start, | 3500 | int map_private_extent_buffer(struct extent_buffer *eb, unsigned long start, |
3502 | unsigned long min_len, char **token, char **map, | 3501 | unsigned long min_len, char **map, |
3503 | unsigned long *map_start, | 3502 | unsigned long *map_start, |
3504 | unsigned long *map_len, int km) | 3503 | unsigned long *map_len) |
3505 | { | 3504 | { |
3506 | size_t offset = start & (PAGE_CACHE_SIZE - 1); | 3505 | size_t offset = start & (PAGE_CACHE_SIZE - 1); |
3507 | char *kaddr; | 3506 | char *kaddr; |
@@ -3531,42 +3530,12 @@ int map_private_extent_buffer(struct extent_buffer *eb, unsigned long start, | |||
3531 | } | 3530 | } |
3532 | 3531 | ||
3533 | p = extent_buffer_page(eb, i); | 3532 | p = extent_buffer_page(eb, i); |
3534 | kaddr = kmap_atomic(p, km); | 3533 | kaddr = page_address(p); |
3535 | *token = kaddr; | ||
3536 | *map = kaddr + offset; | 3534 | *map = kaddr + offset; |
3537 | *map_len = PAGE_CACHE_SIZE - offset; | 3535 | *map_len = PAGE_CACHE_SIZE - offset; |
3538 | return 0; | 3536 | return 0; |
3539 | } | 3537 | } |
3540 | 3538 | ||
3541 | int map_extent_buffer(struct extent_buffer *eb, unsigned long start, | ||
3542 | unsigned long min_len, | ||
3543 | char **token, char **map, | ||
3544 | unsigned long *map_start, | ||
3545 | unsigned long *map_len, int km) | ||
3546 | { | ||
3547 | int err; | ||
3548 | int save = 0; | ||
3549 | if (eb->map_token) { | ||
3550 | unmap_extent_buffer(eb, eb->map_token, km); | ||
3551 | eb->map_token = NULL; | ||
3552 | save = 1; | ||
3553 | } | ||
3554 | err = map_private_extent_buffer(eb, start, min_len, token, map, | ||
3555 | map_start, map_len, km); | ||
3556 | if (!err && save) { | ||
3557 | eb->map_token = *token; | ||
3558 | eb->kaddr = *map; | ||
3559 | eb->map_start = *map_start; | ||
3560 | eb->map_len = *map_len; | ||
3561 | } | ||
3562 | return err; | ||
3563 | } | ||
3564 | |||
3565 | void unmap_extent_buffer(struct extent_buffer *eb, char *token, int km) | ||
3566 | { | ||
3567 | kunmap_atomic(token, km); | ||
3568 | } | ||
3569 | |||
3570 | int memcmp_extent_buffer(struct extent_buffer *eb, const void *ptrv, | 3539 | int memcmp_extent_buffer(struct extent_buffer *eb, const void *ptrv, |
3571 | unsigned long start, | 3540 | unsigned long start, |
3572 | unsigned long len) | 3541 | unsigned long len) |
@@ -3590,9 +3559,8 @@ int memcmp_extent_buffer(struct extent_buffer *eb, const void *ptrv, | |||
3590 | 3559 | ||
3591 | cur = min(len, (PAGE_CACHE_SIZE - offset)); | 3560 | cur = min(len, (PAGE_CACHE_SIZE - offset)); |
3592 | 3561 | ||
3593 | kaddr = kmap_atomic(page, KM_USER0); | 3562 | kaddr = page_address(page); |
3594 | ret = memcmp(ptr, kaddr + offset, cur); | 3563 | ret = memcmp(ptr, kaddr + offset, cur); |
3595 | kunmap_atomic(kaddr, KM_USER0); | ||
3596 | if (ret) | 3564 | if (ret) |
3597 | break; | 3565 | break; |
3598 | 3566 | ||
@@ -3625,9 +3593,8 @@ void write_extent_buffer(struct extent_buffer *eb, const void *srcv, | |||
3625 | WARN_ON(!PageUptodate(page)); | 3593 | WARN_ON(!PageUptodate(page)); |
3626 | 3594 | ||
3627 | cur = min(len, PAGE_CACHE_SIZE - offset); | 3595 | cur = min(len, PAGE_CACHE_SIZE - offset); |
3628 | kaddr = kmap_atomic(page, KM_USER1); | 3596 | kaddr = page_address(page); |
3629 | memcpy(kaddr + offset, src, cur); | 3597 | memcpy(kaddr + offset, src, cur); |
3630 | kunmap_atomic(kaddr, KM_USER1); | ||
3631 | 3598 | ||
3632 | src += cur; | 3599 | src += cur; |
3633 | len -= cur; | 3600 | len -= cur; |
@@ -3656,9 +3623,8 @@ void memset_extent_buffer(struct extent_buffer *eb, char c, | |||
3656 | WARN_ON(!PageUptodate(page)); | 3623 | WARN_ON(!PageUptodate(page)); |
3657 | 3624 | ||
3658 | cur = min(len, PAGE_CACHE_SIZE - offset); | 3625 | cur = min(len, PAGE_CACHE_SIZE - offset); |
3659 | kaddr = kmap_atomic(page, KM_USER0); | 3626 | kaddr = page_address(page); |
3660 | memset(kaddr + offset, c, cur); | 3627 | memset(kaddr + offset, c, cur); |
3661 | kunmap_atomic(kaddr, KM_USER0); | ||
3662 | 3628 | ||
3663 | len -= cur; | 3629 | len -= cur; |
3664 | offset = 0; | 3630 | offset = 0; |
@@ -3689,9 +3655,8 @@ void copy_extent_buffer(struct extent_buffer *dst, struct extent_buffer *src, | |||
3689 | 3655 | ||
3690 | cur = min(len, (unsigned long)(PAGE_CACHE_SIZE - offset)); | 3656 | cur = min(len, (unsigned long)(PAGE_CACHE_SIZE - offset)); |
3691 | 3657 | ||
3692 | kaddr = kmap_atomic(page, KM_USER0); | 3658 | kaddr = page_address(page); |
3693 | read_extent_buffer(src, kaddr + offset, src_offset, cur); | 3659 | read_extent_buffer(src, kaddr + offset, src_offset, cur); |
3694 | kunmap_atomic(kaddr, KM_USER0); | ||
3695 | 3660 | ||
3696 | src_offset += cur; | 3661 | src_offset += cur; |
3697 | len -= cur; | 3662 | len -= cur; |
@@ -3704,20 +3669,17 @@ static void move_pages(struct page *dst_page, struct page *src_page, | |||
3704 | unsigned long dst_off, unsigned long src_off, | 3669 | unsigned long dst_off, unsigned long src_off, |
3705 | unsigned long len) | 3670 | unsigned long len) |
3706 | { | 3671 | { |
3707 | char *dst_kaddr = kmap_atomic(dst_page, KM_USER0); | 3672 | char *dst_kaddr = page_address(dst_page); |
3708 | if (dst_page == src_page) { | 3673 | if (dst_page == src_page) { |
3709 | memmove(dst_kaddr + dst_off, dst_kaddr + src_off, len); | 3674 | memmove(dst_kaddr + dst_off, dst_kaddr + src_off, len); |
3710 | } else { | 3675 | } else { |
3711 | char *src_kaddr = kmap_atomic(src_page, KM_USER1); | 3676 | char *src_kaddr = page_address(src_page); |
3712 | char *p = dst_kaddr + dst_off + len; | 3677 | char *p = dst_kaddr + dst_off + len; |
3713 | char *s = src_kaddr + src_off + len; | 3678 | char *s = src_kaddr + src_off + len; |
3714 | 3679 | ||
3715 | while (len--) | 3680 | while (len--) |
3716 | *--p = *--s; | 3681 | *--p = *--s; |
3717 | |||
3718 | kunmap_atomic(src_kaddr, KM_USER1); | ||
3719 | } | 3682 | } |
3720 | kunmap_atomic(dst_kaddr, KM_USER0); | ||
3721 | } | 3683 | } |
3722 | 3684 | ||
3723 | static inline bool areas_overlap(unsigned long src, unsigned long dst, unsigned long len) | 3685 | static inline bool areas_overlap(unsigned long src, unsigned long dst, unsigned long len) |
@@ -3730,20 +3692,17 @@ static void copy_pages(struct page *dst_page, struct page *src_page, | |||
3730 | unsigned long dst_off, unsigned long src_off, | 3692 | unsigned long dst_off, unsigned long src_off, |
3731 | unsigned long len) | 3693 | unsigned long len) |
3732 | { | 3694 | { |
3733 | char *dst_kaddr = kmap_atomic(dst_page, KM_USER0); | 3695 | char *dst_kaddr = page_address(dst_page); |
3734 | char *src_kaddr; | 3696 | char *src_kaddr; |
3735 | 3697 | ||
3736 | if (dst_page != src_page) { | 3698 | if (dst_page != src_page) { |
3737 | src_kaddr = kmap_atomic(src_page, KM_USER1); | 3699 | src_kaddr = page_address(src_page); |
3738 | } else { | 3700 | } else { |
3739 | src_kaddr = dst_kaddr; | 3701 | src_kaddr = dst_kaddr; |
3740 | BUG_ON(areas_overlap(src_off, dst_off, len)); | 3702 | BUG_ON(areas_overlap(src_off, dst_off, len)); |
3741 | } | 3703 | } |
3742 | 3704 | ||
3743 | memcpy(dst_kaddr + dst_off, src_kaddr + src_off, len); | 3705 | memcpy(dst_kaddr + dst_off, src_kaddr + src_off, len); |
3744 | kunmap_atomic(dst_kaddr, KM_USER0); | ||
3745 | if (dst_page != src_page) | ||
3746 | kunmap_atomic(src_kaddr, KM_USER1); | ||
3747 | } | 3706 | } |
3748 | 3707 | ||
3749 | void memcpy_extent_buffer(struct extent_buffer *dst, unsigned long dst_offset, | 3708 | void memcpy_extent_buffer(struct extent_buffer *dst, unsigned long dst_offset, |
diff --git a/fs/btrfs/extent_io.h b/fs/btrfs/extent_io.h index a11a92ee2d30..b5f120cca916 100644 --- a/fs/btrfs/extent_io.h +++ b/fs/btrfs/extent_io.h | |||
@@ -120,8 +120,6 @@ struct extent_state { | |||
120 | struct extent_buffer { | 120 | struct extent_buffer { |
121 | u64 start; | 121 | u64 start; |
122 | unsigned long len; | 122 | unsigned long len; |
123 | char *map_token; | ||
124 | char *kaddr; | ||
125 | unsigned long map_start; | 123 | unsigned long map_start; |
126 | unsigned long map_len; | 124 | unsigned long map_len; |
127 | struct page *first_page; | 125 | struct page *first_page; |
@@ -279,15 +277,10 @@ int clear_extent_buffer_uptodate(struct extent_io_tree *tree, | |||
279 | int extent_buffer_uptodate(struct extent_io_tree *tree, | 277 | int extent_buffer_uptodate(struct extent_io_tree *tree, |
280 | struct extent_buffer *eb, | 278 | struct extent_buffer *eb, |
281 | struct extent_state *cached_state); | 279 | struct extent_state *cached_state); |
282 | int map_extent_buffer(struct extent_buffer *eb, unsigned long offset, | ||
283 | unsigned long min_len, char **token, char **map, | ||
284 | unsigned long *map_start, | ||
285 | unsigned long *map_len, int km); | ||
286 | int map_private_extent_buffer(struct extent_buffer *eb, unsigned long offset, | 280 | int map_private_extent_buffer(struct extent_buffer *eb, unsigned long offset, |
287 | unsigned long min_len, char **token, char **map, | 281 | unsigned long min_len, char **map, |
288 | unsigned long *map_start, | 282 | unsigned long *map_start, |
289 | unsigned long *map_len, int km); | 283 | unsigned long *map_len); |
290 | void unmap_extent_buffer(struct extent_buffer *eb, char *token, int km); | ||
291 | int extent_range_uptodate(struct extent_io_tree *tree, | 284 | int extent_range_uptodate(struct extent_io_tree *tree, |
292 | u64 start, u64 end); | 285 | u64 start, u64 end); |
293 | int extent_clear_unlock_delalloc(struct inode *inode, | 286 | int extent_clear_unlock_delalloc(struct inode *inode, |
diff --git a/fs/btrfs/file-item.c b/fs/btrfs/file-item.c index 90d4ee52cd45..bb22a4435b2d 100644 --- a/fs/btrfs/file-item.c +++ b/fs/btrfs/file-item.c | |||
@@ -664,10 +664,6 @@ int btrfs_csum_file_blocks(struct btrfs_trans_handle *trans, | |||
664 | struct btrfs_sector_sum *sector_sum; | 664 | struct btrfs_sector_sum *sector_sum; |
665 | u32 nritems; | 665 | u32 nritems; |
666 | u32 ins_size; | 666 | u32 ins_size; |
667 | char *eb_map; | ||
668 | char *eb_token; | ||
669 | unsigned long map_len; | ||
670 | unsigned long map_start; | ||
671 | u16 csum_size = | 667 | u16 csum_size = |
672 | btrfs_super_csum_size(&root->fs_info->super_copy); | 668 | btrfs_super_csum_size(&root->fs_info->super_copy); |
673 | 669 | ||
@@ -814,30 +810,9 @@ found: | |||
814 | item_end = btrfs_item_ptr(leaf, path->slots[0], struct btrfs_csum_item); | 810 | item_end = btrfs_item_ptr(leaf, path->slots[0], struct btrfs_csum_item); |
815 | item_end = (struct btrfs_csum_item *)((unsigned char *)item_end + | 811 | item_end = (struct btrfs_csum_item *)((unsigned char *)item_end + |
816 | btrfs_item_size_nr(leaf, path->slots[0])); | 812 | btrfs_item_size_nr(leaf, path->slots[0])); |
817 | eb_token = NULL; | ||
818 | next_sector: | 813 | next_sector: |
819 | 814 | ||
820 | if (!eb_token || | 815 | write_extent_buffer(leaf, §or_sum->sum, (unsigned long)item, csum_size); |
821 | (unsigned long)item + csum_size >= map_start + map_len) { | ||
822 | int err; | ||
823 | |||
824 | if (eb_token) | ||
825 | unmap_extent_buffer(leaf, eb_token, KM_USER1); | ||
826 | eb_token = NULL; | ||
827 | err = map_private_extent_buffer(leaf, (unsigned long)item, | ||
828 | csum_size, | ||
829 | &eb_token, &eb_map, | ||
830 | &map_start, &map_len, KM_USER1); | ||
831 | if (err) | ||
832 | eb_token = NULL; | ||
833 | } | ||
834 | if (eb_token) { | ||
835 | memcpy(eb_token + ((unsigned long)item & (PAGE_CACHE_SIZE - 1)), | ||
836 | §or_sum->sum, csum_size); | ||
837 | } else { | ||
838 | write_extent_buffer(leaf, §or_sum->sum, | ||
839 | (unsigned long)item, csum_size); | ||
840 | } | ||
841 | 816 | ||
842 | total_bytes += root->sectorsize; | 817 | total_bytes += root->sectorsize; |
843 | sector_sum++; | 818 | sector_sum++; |
@@ -850,10 +825,7 @@ next_sector: | |||
850 | goto next_sector; | 825 | goto next_sector; |
851 | } | 826 | } |
852 | } | 827 | } |
853 | if (eb_token) { | 828 | |
854 | unmap_extent_buffer(leaf, eb_token, KM_USER1); | ||
855 | eb_token = NULL; | ||
856 | } | ||
857 | btrfs_mark_buffer_dirty(path->nodes[0]); | 829 | btrfs_mark_buffer_dirty(path->nodes[0]); |
858 | if (total_bytes < sums->len) { | 830 | if (total_bytes < sums->len) { |
859 | btrfs_release_path(path); | 831 | btrfs_release_path(path); |
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index 55d68ea1866b..3b5763a2b7f9 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c | |||
@@ -2541,13 +2541,6 @@ static void btrfs_read_locked_inode(struct inode *inode) | |||
2541 | 2541 | ||
2542 | inode_item = btrfs_item_ptr(leaf, path->slots[0], | 2542 | inode_item = btrfs_item_ptr(leaf, path->slots[0], |
2543 | struct btrfs_inode_item); | 2543 | struct btrfs_inode_item); |
2544 | if (!leaf->map_token) | ||
2545 | map_private_extent_buffer(leaf, (unsigned long)inode_item, | ||
2546 | sizeof(struct btrfs_inode_item), | ||
2547 | &leaf->map_token, &leaf->kaddr, | ||
2548 | &leaf->map_start, &leaf->map_len, | ||
2549 | KM_USER1); | ||
2550 | |||
2551 | inode->i_mode = btrfs_inode_mode(leaf, inode_item); | 2544 | inode->i_mode = btrfs_inode_mode(leaf, inode_item); |
2552 | inode->i_nlink = btrfs_inode_nlink(leaf, inode_item); | 2545 | inode->i_nlink = btrfs_inode_nlink(leaf, inode_item); |
2553 | inode->i_uid = btrfs_inode_uid(leaf, inode_item); | 2546 | inode->i_uid = btrfs_inode_uid(leaf, inode_item); |
@@ -2585,11 +2578,6 @@ cache_acl: | |||
2585 | if (!maybe_acls) | 2578 | if (!maybe_acls) |
2586 | cache_no_acl(inode); | 2579 | cache_no_acl(inode); |
2587 | 2580 | ||
2588 | if (leaf->map_token) { | ||
2589 | unmap_extent_buffer(leaf, leaf->map_token, KM_USER1); | ||
2590 | leaf->map_token = NULL; | ||
2591 | } | ||
2592 | |||
2593 | btrfs_free_path(path); | 2581 | btrfs_free_path(path); |
2594 | 2582 | ||
2595 | switch (inode->i_mode & S_IFMT) { | 2583 | switch (inode->i_mode & S_IFMT) { |
@@ -2634,13 +2622,6 @@ static void fill_inode_item(struct btrfs_trans_handle *trans, | |||
2634 | struct btrfs_inode_item *item, | 2622 | struct btrfs_inode_item *item, |
2635 | struct inode *inode) | 2623 | struct inode *inode) |
2636 | { | 2624 | { |
2637 | if (!leaf->map_token) | ||
2638 | map_private_extent_buffer(leaf, (unsigned long)item, | ||
2639 | sizeof(struct btrfs_inode_item), | ||
2640 | &leaf->map_token, &leaf->kaddr, | ||
2641 | &leaf->map_start, &leaf->map_len, | ||
2642 | KM_USER1); | ||
2643 | |||
2644 | btrfs_set_inode_uid(leaf, item, inode->i_uid); | 2625 | btrfs_set_inode_uid(leaf, item, inode->i_uid); |
2645 | btrfs_set_inode_gid(leaf, item, inode->i_gid); | 2626 | btrfs_set_inode_gid(leaf, item, inode->i_gid); |
2646 | btrfs_set_inode_size(leaf, item, BTRFS_I(inode)->disk_i_size); | 2627 | btrfs_set_inode_size(leaf, item, BTRFS_I(inode)->disk_i_size); |
@@ -2669,11 +2650,6 @@ static void fill_inode_item(struct btrfs_trans_handle *trans, | |||
2669 | btrfs_set_inode_rdev(leaf, item, inode->i_rdev); | 2650 | btrfs_set_inode_rdev(leaf, item, inode->i_rdev); |
2670 | btrfs_set_inode_flags(leaf, item, BTRFS_I(inode)->flags); | 2651 | btrfs_set_inode_flags(leaf, item, BTRFS_I(inode)->flags); |
2671 | btrfs_set_inode_block_group(leaf, item, 0); | 2652 | btrfs_set_inode_block_group(leaf, item, 0); |
2672 | |||
2673 | if (leaf->map_token) { | ||
2674 | unmap_extent_buffer(leaf, leaf->map_token, KM_USER1); | ||
2675 | leaf->map_token = NULL; | ||
2676 | } | ||
2677 | } | 2653 | } |
2678 | 2654 | ||
2679 | /* | 2655 | /* |
diff --git a/fs/btrfs/struct-funcs.c b/fs/btrfs/struct-funcs.c index c0f7ecaf1e79..bc1f6ad18442 100644 --- a/fs/btrfs/struct-funcs.c +++ b/fs/btrfs/struct-funcs.c | |||
@@ -50,36 +50,22 @@ u##bits btrfs_##name(struct extent_buffer *eb, \ | |||
50 | unsigned long part_offset = (unsigned long)s; \ | 50 | unsigned long part_offset = (unsigned long)s; \ |
51 | unsigned long offset = part_offset + offsetof(type, member); \ | 51 | unsigned long offset = part_offset + offsetof(type, member); \ |
52 | type *p; \ | 52 | type *p; \ |
53 | /* ugly, but we want the fast path here */ \ | 53 | int err; \ |
54 | if (eb->map_token && offset >= eb->map_start && \ | 54 | char *kaddr; \ |
55 | offset + sizeof(((type *)0)->member) <= eb->map_start + \ | 55 | unsigned long map_start; \ |
56 | eb->map_len) { \ | 56 | unsigned long map_len; \ |
57 | p = (type *)(eb->kaddr + part_offset - eb->map_start); \ | 57 | u##bits res; \ |
58 | return le##bits##_to_cpu(p->member); \ | 58 | err = map_private_extent_buffer(eb, offset, \ |
59 | } \ | 59 | sizeof(((type *)0)->member), \ |
60 | { \ | 60 | &kaddr, &map_start, &map_len); \ |
61 | int err; \ | 61 | if (err) { \ |
62 | char *map_token; \ | 62 | __le##bits leres; \ |
63 | char *kaddr; \ | 63 | read_eb_member(eb, s, type, member, &leres); \ |
64 | int unmap_on_exit = (eb->map_token == NULL); \ | 64 | return le##bits##_to_cpu(leres); \ |
65 | unsigned long map_start; \ | 65 | } \ |
66 | unsigned long map_len; \ | 66 | p = (type *)(kaddr + part_offset - map_start); \ |
67 | u##bits res; \ | 67 | res = le##bits##_to_cpu(p->member); \ |
68 | err = map_extent_buffer(eb, offset, \ | 68 | return res; \ |
69 | sizeof(((type *)0)->member), \ | ||
70 | &map_token, &kaddr, \ | ||
71 | &map_start, &map_len, KM_USER1); \ | ||
72 | if (err) { \ | ||
73 | __le##bits leres; \ | ||
74 | read_eb_member(eb, s, type, member, &leres); \ | ||
75 | return le##bits##_to_cpu(leres); \ | ||
76 | } \ | ||
77 | p = (type *)(kaddr + part_offset - map_start); \ | ||
78 | res = le##bits##_to_cpu(p->member); \ | ||
79 | if (unmap_on_exit) \ | ||
80 | unmap_extent_buffer(eb, map_token, KM_USER1); \ | ||
81 | return res; \ | ||
82 | } \ | ||
83 | } \ | 69 | } \ |
84 | void btrfs_set_##name(struct extent_buffer *eb, \ | 70 | void btrfs_set_##name(struct extent_buffer *eb, \ |
85 | type *s, u##bits val) \ | 71 | type *s, u##bits val) \ |
@@ -87,36 +73,21 @@ void btrfs_set_##name(struct extent_buffer *eb, \ | |||
87 | unsigned long part_offset = (unsigned long)s; \ | 73 | unsigned long part_offset = (unsigned long)s; \ |
88 | unsigned long offset = part_offset + offsetof(type, member); \ | 74 | unsigned long offset = part_offset + offsetof(type, member); \ |
89 | type *p; \ | 75 | type *p; \ |
90 | /* ugly, but we want the fast path here */ \ | 76 | int err; \ |
91 | if (eb->map_token && offset >= eb->map_start && \ | 77 | char *kaddr; \ |
92 | offset + sizeof(((type *)0)->member) <= eb->map_start + \ | 78 | unsigned long map_start; \ |
93 | eb->map_len) { \ | 79 | unsigned long map_len; \ |
94 | p = (type *)(eb->kaddr + part_offset - eb->map_start); \ | 80 | err = map_private_extent_buffer(eb, offset, \ |
95 | p->member = cpu_to_le##bits(val); \ | 81 | sizeof(((type *)0)->member), \ |
96 | return; \ | 82 | &kaddr, &map_start, &map_len); \ |
97 | } \ | 83 | if (err) { \ |
98 | { \ | 84 | __le##bits val2; \ |
99 | int err; \ | 85 | val2 = cpu_to_le##bits(val); \ |
100 | char *map_token; \ | 86 | write_eb_member(eb, s, type, member, &val2); \ |
101 | char *kaddr; \ | 87 | return; \ |
102 | int unmap_on_exit = (eb->map_token == NULL); \ | 88 | } \ |
103 | unsigned long map_start; \ | 89 | p = (type *)(kaddr + part_offset - map_start); \ |
104 | unsigned long map_len; \ | 90 | p->member = cpu_to_le##bits(val); \ |
105 | err = map_extent_buffer(eb, offset, \ | ||
106 | sizeof(((type *)0)->member), \ | ||
107 | &map_token, &kaddr, \ | ||
108 | &map_start, &map_len, KM_USER1); \ | ||
109 | if (err) { \ | ||
110 | __le##bits val2; \ | ||
111 | val2 = cpu_to_le##bits(val); \ | ||
112 | write_eb_member(eb, s, type, member, &val2); \ | ||
113 | return; \ | ||
114 | } \ | ||
115 | p = (type *)(kaddr + part_offset - map_start); \ | ||
116 | p->member = cpu_to_le##bits(val); \ | ||
117 | if (unmap_on_exit) \ | ||
118 | unmap_extent_buffer(eb, map_token, KM_USER1); \ | ||
119 | } \ | ||
120 | } | 91 | } |
121 | 92 | ||
122 | #include "ctree.h" | 93 | #include "ctree.h" |
@@ -125,15 +96,6 @@ void btrfs_node_key(struct extent_buffer *eb, | |||
125 | struct btrfs_disk_key *disk_key, int nr) | 96 | struct btrfs_disk_key *disk_key, int nr) |
126 | { | 97 | { |
127 | unsigned long ptr = btrfs_node_key_ptr_offset(nr); | 98 | unsigned long ptr = btrfs_node_key_ptr_offset(nr); |
128 | if (eb->map_token && ptr >= eb->map_start && | ||
129 | ptr + sizeof(*disk_key) <= eb->map_start + eb->map_len) { | ||
130 | memcpy(disk_key, eb->kaddr + ptr - eb->map_start, | ||
131 | sizeof(*disk_key)); | ||
132 | return; | ||
133 | } else if (eb->map_token) { | ||
134 | unmap_extent_buffer(eb, eb->map_token, KM_USER1); | ||
135 | eb->map_token = NULL; | ||
136 | } | ||
137 | read_eb_member(eb, (struct btrfs_key_ptr *)ptr, | 99 | read_eb_member(eb, (struct btrfs_key_ptr *)ptr, |
138 | struct btrfs_key_ptr, key, disk_key); | 100 | struct btrfs_key_ptr, key, disk_key); |
139 | } | 101 | } |