diff options
Diffstat (limited to 'fs/btrfs/inode.c')
| -rw-r--r-- | fs/btrfs/inode.c | 199 |
1 files changed, 91 insertions, 108 deletions
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index c41db6d45ab6..2bfdc641d4e3 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c | |||
| @@ -36,6 +36,7 @@ | |||
| 36 | #include <linux/xattr.h> | 36 | #include <linux/xattr.h> |
| 37 | #include <linux/posix_acl.h> | 37 | #include <linux/posix_acl.h> |
| 38 | #include <linux/falloc.h> | 38 | #include <linux/falloc.h> |
| 39 | #include <linux/slab.h> | ||
| 39 | #include "compat.h" | 40 | #include "compat.h" |
| 40 | #include "ctree.h" | 41 | #include "ctree.h" |
| 41 | #include "disk-io.h" | 42 | #include "disk-io.h" |
| @@ -379,7 +380,8 @@ again: | |||
| 379 | * change at any time if we discover bad compression ratios. | 380 | * change at any time if we discover bad compression ratios. |
| 380 | */ | 381 | */ |
| 381 | if (!(BTRFS_I(inode)->flags & BTRFS_INODE_NOCOMPRESS) && | 382 | if (!(BTRFS_I(inode)->flags & BTRFS_INODE_NOCOMPRESS) && |
| 382 | btrfs_test_opt(root, COMPRESS)) { | 383 | (btrfs_test_opt(root, COMPRESS) || |
| 384 | (BTRFS_I(inode)->force_compress))) { | ||
| 383 | WARN_ON(pages); | 385 | WARN_ON(pages); |
| 384 | pages = kzalloc(sizeof(struct page *) * nr_pages, GFP_NOFS); | 386 | pages = kzalloc(sizeof(struct page *) * nr_pages, GFP_NOFS); |
| 385 | 387 | ||
| @@ -483,8 +485,10 @@ again: | |||
| 483 | nr_pages_ret = 0; | 485 | nr_pages_ret = 0; |
| 484 | 486 | ||
| 485 | /* flag the file so we don't compress in the future */ | 487 | /* flag the file so we don't compress in the future */ |
| 486 | if (!btrfs_test_opt(root, FORCE_COMPRESS)) | 488 | if (!btrfs_test_opt(root, FORCE_COMPRESS) && |
| 489 | !(BTRFS_I(inode)->force_compress)) { | ||
| 487 | BTRFS_I(inode)->flags |= BTRFS_INODE_NOCOMPRESS; | 490 | BTRFS_I(inode)->flags |= BTRFS_INODE_NOCOMPRESS; |
| 491 | } | ||
| 488 | } | 492 | } |
| 489 | if (will_compress) { | 493 | if (will_compress) { |
| 490 | *num_added += 1; | 494 | *num_added += 1; |
| @@ -570,8 +574,8 @@ retry: | |||
| 570 | unsigned long nr_written = 0; | 574 | unsigned long nr_written = 0; |
| 571 | 575 | ||
| 572 | lock_extent(io_tree, async_extent->start, | 576 | lock_extent(io_tree, async_extent->start, |
| 573 | async_extent->start + | 577 | async_extent->start + |
| 574 | async_extent->ram_size - 1, GFP_NOFS); | 578 | async_extent->ram_size - 1, GFP_NOFS); |
| 575 | 579 | ||
| 576 | /* allocate blocks */ | 580 | /* allocate blocks */ |
| 577 | ret = cow_file_range(inode, async_cow->locked_page, | 581 | ret = cow_file_range(inode, async_cow->locked_page, |
| @@ -793,7 +797,7 @@ static noinline int cow_file_range(struct inode *inode, | |||
| 793 | while (disk_num_bytes > 0) { | 797 | while (disk_num_bytes > 0) { |
| 794 | unsigned long op; | 798 | unsigned long op; |
| 795 | 799 | ||
| 796 | cur_alloc_size = min(disk_num_bytes, root->fs_info->max_extent); | 800 | cur_alloc_size = disk_num_bytes; |
| 797 | ret = btrfs_reserve_extent(trans, root, cur_alloc_size, | 801 | ret = btrfs_reserve_extent(trans, root, cur_alloc_size, |
| 798 | root->sectorsize, 0, alloc_hint, | 802 | root->sectorsize, 0, alloc_hint, |
| 799 | (u64)-1, &ins, 1); | 803 | (u64)-1, &ins, 1); |
| @@ -1211,7 +1215,8 @@ static int run_delalloc_range(struct inode *inode, struct page *locked_page, | |||
| 1211 | else if (BTRFS_I(inode)->flags & BTRFS_INODE_PREALLOC) | 1215 | else if (BTRFS_I(inode)->flags & BTRFS_INODE_PREALLOC) |
| 1212 | ret = run_delalloc_nocow(inode, locked_page, start, end, | 1216 | ret = run_delalloc_nocow(inode, locked_page, start, end, |
| 1213 | page_started, 0, nr_written); | 1217 | page_started, 0, nr_written); |
| 1214 | else if (!btrfs_test_opt(root, COMPRESS)) | 1218 | else if (!btrfs_test_opt(root, COMPRESS) && |
| 1219 | !(BTRFS_I(inode)->force_compress)) | ||
| 1215 | ret = cow_file_range(inode, locked_page, start, end, | 1220 | ret = cow_file_range(inode, locked_page, start, end, |
| 1216 | page_started, nr_written, 1); | 1221 | page_started, nr_written, 1); |
| 1217 | else | 1222 | else |
| @@ -1223,30 +1228,9 @@ static int run_delalloc_range(struct inode *inode, struct page *locked_page, | |||
| 1223 | static int btrfs_split_extent_hook(struct inode *inode, | 1228 | static int btrfs_split_extent_hook(struct inode *inode, |
| 1224 | struct extent_state *orig, u64 split) | 1229 | struct extent_state *orig, u64 split) |
| 1225 | { | 1230 | { |
| 1226 | struct btrfs_root *root = BTRFS_I(inode)->root; | ||
| 1227 | u64 size; | ||
| 1228 | |||
| 1229 | if (!(orig->state & EXTENT_DELALLOC)) | 1231 | if (!(orig->state & EXTENT_DELALLOC)) |
| 1230 | return 0; | 1232 | return 0; |
| 1231 | 1233 | ||
| 1232 | size = orig->end - orig->start + 1; | ||
| 1233 | if (size > root->fs_info->max_extent) { | ||
| 1234 | u64 num_extents; | ||
| 1235 | u64 new_size; | ||
| 1236 | |||
| 1237 | new_size = orig->end - split + 1; | ||
| 1238 | num_extents = div64_u64(size + root->fs_info->max_extent - 1, | ||
| 1239 | root->fs_info->max_extent); | ||
| 1240 | |||
| 1241 | /* | ||
| 1242 | * if we break a large extent up then leave oustanding_extents | ||
| 1243 | * be, since we've already accounted for the large extent. | ||
| 1244 | */ | ||
| 1245 | if (div64_u64(new_size + root->fs_info->max_extent - 1, | ||
| 1246 | root->fs_info->max_extent) < num_extents) | ||
| 1247 | return 0; | ||
| 1248 | } | ||
| 1249 | |||
| 1250 | spin_lock(&BTRFS_I(inode)->accounting_lock); | 1234 | spin_lock(&BTRFS_I(inode)->accounting_lock); |
| 1251 | BTRFS_I(inode)->outstanding_extents++; | 1235 | BTRFS_I(inode)->outstanding_extents++; |
| 1252 | spin_unlock(&BTRFS_I(inode)->accounting_lock); | 1236 | spin_unlock(&BTRFS_I(inode)->accounting_lock); |
| @@ -1264,38 +1248,10 @@ static int btrfs_merge_extent_hook(struct inode *inode, | |||
| 1264 | struct extent_state *new, | 1248 | struct extent_state *new, |
| 1265 | struct extent_state *other) | 1249 | struct extent_state *other) |
| 1266 | { | 1250 | { |
| 1267 | struct btrfs_root *root = BTRFS_I(inode)->root; | ||
| 1268 | u64 new_size, old_size; | ||
| 1269 | u64 num_extents; | ||
| 1270 | |||
| 1271 | /* not delalloc, ignore it */ | 1251 | /* not delalloc, ignore it */ |
| 1272 | if (!(other->state & EXTENT_DELALLOC)) | 1252 | if (!(other->state & EXTENT_DELALLOC)) |
| 1273 | return 0; | 1253 | return 0; |
| 1274 | 1254 | ||
| 1275 | old_size = other->end - other->start + 1; | ||
| 1276 | if (new->start < other->start) | ||
| 1277 | new_size = other->end - new->start + 1; | ||
| 1278 | else | ||
| 1279 | new_size = new->end - other->start + 1; | ||
| 1280 | |||
| 1281 | /* we're not bigger than the max, unreserve the space and go */ | ||
| 1282 | if (new_size <= root->fs_info->max_extent) { | ||
| 1283 | spin_lock(&BTRFS_I(inode)->accounting_lock); | ||
| 1284 | BTRFS_I(inode)->outstanding_extents--; | ||
| 1285 | spin_unlock(&BTRFS_I(inode)->accounting_lock); | ||
| 1286 | return 0; | ||
| 1287 | } | ||
| 1288 | |||
| 1289 | /* | ||
| 1290 | * If we grew by another max_extent, just return, we want to keep that | ||
| 1291 | * reserved amount. | ||
| 1292 | */ | ||
| 1293 | num_extents = div64_u64(old_size + root->fs_info->max_extent - 1, | ||
| 1294 | root->fs_info->max_extent); | ||
| 1295 | if (div64_u64(new_size + root->fs_info->max_extent - 1, | ||
| 1296 | root->fs_info->max_extent) > num_extents) | ||
| 1297 | return 0; | ||
| 1298 | |||
| 1299 | spin_lock(&BTRFS_I(inode)->accounting_lock); | 1255 | spin_lock(&BTRFS_I(inode)->accounting_lock); |
| 1300 | BTRFS_I(inode)->outstanding_extents--; | 1256 | BTRFS_I(inode)->outstanding_extents--; |
| 1301 | spin_unlock(&BTRFS_I(inode)->accounting_lock); | 1257 | spin_unlock(&BTRFS_I(inode)->accounting_lock); |
| @@ -1324,6 +1280,7 @@ static int btrfs_set_bit_hook(struct inode *inode, u64 start, u64 end, | |||
| 1324 | BTRFS_I(inode)->outstanding_extents++; | 1280 | BTRFS_I(inode)->outstanding_extents++; |
| 1325 | spin_unlock(&BTRFS_I(inode)->accounting_lock); | 1281 | spin_unlock(&BTRFS_I(inode)->accounting_lock); |
| 1326 | btrfs_delalloc_reserve_space(root, inode, end - start + 1); | 1282 | btrfs_delalloc_reserve_space(root, inode, end - start + 1); |
| 1283 | |||
| 1327 | spin_lock(&root->fs_info->delalloc_lock); | 1284 | spin_lock(&root->fs_info->delalloc_lock); |
| 1328 | BTRFS_I(inode)->delalloc_bytes += end - start + 1; | 1285 | BTRFS_I(inode)->delalloc_bytes += end - start + 1; |
| 1329 | root->fs_info->delalloc_bytes += end - start + 1; | 1286 | root->fs_info->delalloc_bytes += end - start + 1; |
| @@ -1352,6 +1309,7 @@ static int btrfs_clear_bit_hook(struct inode *inode, | |||
| 1352 | 1309 | ||
| 1353 | if (bits & EXTENT_DO_ACCOUNTING) { | 1310 | if (bits & EXTENT_DO_ACCOUNTING) { |
| 1354 | spin_lock(&BTRFS_I(inode)->accounting_lock); | 1311 | spin_lock(&BTRFS_I(inode)->accounting_lock); |
| 1312 | WARN_ON(!BTRFS_I(inode)->outstanding_extents); | ||
| 1355 | BTRFS_I(inode)->outstanding_extents--; | 1313 | BTRFS_I(inode)->outstanding_extents--; |
| 1356 | spin_unlock(&BTRFS_I(inode)->accounting_lock); | 1314 | spin_unlock(&BTRFS_I(inode)->accounting_lock); |
| 1357 | btrfs_unreserve_metadata_for_delalloc(root, inode, 1); | 1315 | btrfs_unreserve_metadata_for_delalloc(root, inode, 1); |
| @@ -1508,12 +1466,13 @@ static noinline int add_pending_csums(struct btrfs_trans_handle *trans, | |||
| 1508 | return 0; | 1466 | return 0; |
| 1509 | } | 1467 | } |
| 1510 | 1468 | ||
| 1511 | int btrfs_set_extent_delalloc(struct inode *inode, u64 start, u64 end) | 1469 | int btrfs_set_extent_delalloc(struct inode *inode, u64 start, u64 end, |
| 1470 | struct extent_state **cached_state) | ||
| 1512 | { | 1471 | { |
| 1513 | if ((end & (PAGE_CACHE_SIZE - 1)) == 0) | 1472 | if ((end & (PAGE_CACHE_SIZE - 1)) == 0) |
| 1514 | WARN_ON(1); | 1473 | WARN_ON(1); |
| 1515 | return set_extent_delalloc(&BTRFS_I(inode)->io_tree, start, end, | 1474 | return set_extent_delalloc(&BTRFS_I(inode)->io_tree, start, end, |
| 1516 | GFP_NOFS); | 1475 | cached_state, GFP_NOFS); |
| 1517 | } | 1476 | } |
| 1518 | 1477 | ||
| 1519 | /* see btrfs_writepage_start_hook for details on why this is required */ | 1478 | /* see btrfs_writepage_start_hook for details on why this is required */ |
| @@ -1526,6 +1485,7 @@ static void btrfs_writepage_fixup_worker(struct btrfs_work *work) | |||
| 1526 | { | 1485 | { |
| 1527 | struct btrfs_writepage_fixup *fixup; | 1486 | struct btrfs_writepage_fixup *fixup; |
| 1528 | struct btrfs_ordered_extent *ordered; | 1487 | struct btrfs_ordered_extent *ordered; |
| 1488 | struct extent_state *cached_state = NULL; | ||
| 1529 | struct page *page; | 1489 | struct page *page; |
| 1530 | struct inode *inode; | 1490 | struct inode *inode; |
| 1531 | u64 page_start; | 1491 | u64 page_start; |
| @@ -1544,7 +1504,8 @@ again: | |||
| 1544 | page_start = page_offset(page); | 1504 | page_start = page_offset(page); |
| 1545 | page_end = page_offset(page) + PAGE_CACHE_SIZE - 1; | 1505 | page_end = page_offset(page) + PAGE_CACHE_SIZE - 1; |
| 1546 | 1506 | ||
| 1547 | lock_extent(&BTRFS_I(inode)->io_tree, page_start, page_end, GFP_NOFS); | 1507 | lock_extent_bits(&BTRFS_I(inode)->io_tree, page_start, page_end, 0, |
| 1508 | &cached_state, GFP_NOFS); | ||
| 1548 | 1509 | ||
| 1549 | /* already ordered? We're done */ | 1510 | /* already ordered? We're done */ |
| 1550 | if (PagePrivate2(page)) | 1511 | if (PagePrivate2(page)) |
| @@ -1552,17 +1513,18 @@ again: | |||
| 1552 | 1513 | ||
| 1553 | ordered = btrfs_lookup_ordered_extent(inode, page_start); | 1514 | ordered = btrfs_lookup_ordered_extent(inode, page_start); |
| 1554 | if (ordered) { | 1515 | if (ordered) { |
| 1555 | unlock_extent(&BTRFS_I(inode)->io_tree, page_start, | 1516 | unlock_extent_cached(&BTRFS_I(inode)->io_tree, page_start, |
| 1556 | page_end, GFP_NOFS); | 1517 | page_end, &cached_state, GFP_NOFS); |
| 1557 | unlock_page(page); | 1518 | unlock_page(page); |
| 1558 | btrfs_start_ordered_extent(inode, ordered, 1); | 1519 | btrfs_start_ordered_extent(inode, ordered, 1); |
| 1559 | goto again; | 1520 | goto again; |
| 1560 | } | 1521 | } |
| 1561 | 1522 | ||
| 1562 | btrfs_set_extent_delalloc(inode, page_start, page_end); | 1523 | btrfs_set_extent_delalloc(inode, page_start, page_end, &cached_state); |
| 1563 | ClearPageChecked(page); | 1524 | ClearPageChecked(page); |
| 1564 | out: | 1525 | out: |
| 1565 | unlock_extent(&BTRFS_I(inode)->io_tree, page_start, page_end, GFP_NOFS); | 1526 | unlock_extent_cached(&BTRFS_I(inode)->io_tree, page_start, page_end, |
| 1527 | &cached_state, GFP_NOFS); | ||
| 1566 | out_page: | 1528 | out_page: |
| 1567 | unlock_page(page); | 1529 | unlock_page(page); |
| 1568 | page_cache_release(page); | 1530 | page_cache_release(page); |
| @@ -1691,14 +1653,14 @@ static int btrfs_finish_ordered_io(struct inode *inode, u64 start, u64 end) | |||
| 1691 | struct btrfs_trans_handle *trans; | 1653 | struct btrfs_trans_handle *trans; |
| 1692 | struct btrfs_ordered_extent *ordered_extent = NULL; | 1654 | struct btrfs_ordered_extent *ordered_extent = NULL; |
| 1693 | struct extent_io_tree *io_tree = &BTRFS_I(inode)->io_tree; | 1655 | struct extent_io_tree *io_tree = &BTRFS_I(inode)->io_tree; |
| 1656 | struct extent_state *cached_state = NULL; | ||
| 1694 | int compressed = 0; | 1657 | int compressed = 0; |
| 1695 | int ret; | 1658 | int ret; |
| 1696 | 1659 | ||
| 1697 | ret = btrfs_dec_test_ordered_pending(inode, start, end - start + 1); | 1660 | ret = btrfs_dec_test_ordered_pending(inode, &ordered_extent, start, |
| 1661 | end - start + 1); | ||
| 1698 | if (!ret) | 1662 | if (!ret) |
| 1699 | return 0; | 1663 | return 0; |
| 1700 | |||
| 1701 | ordered_extent = btrfs_lookup_ordered_extent(inode, start); | ||
| 1702 | BUG_ON(!ordered_extent); | 1664 | BUG_ON(!ordered_extent); |
| 1703 | 1665 | ||
| 1704 | if (test_bit(BTRFS_ORDERED_NOCOW, &ordered_extent->flags)) { | 1666 | if (test_bit(BTRFS_ORDERED_NOCOW, &ordered_extent->flags)) { |
| @@ -1713,9 +1675,9 @@ static int btrfs_finish_ordered_io(struct inode *inode, u64 start, u64 end) | |||
| 1713 | goto out; | 1675 | goto out; |
| 1714 | } | 1676 | } |
| 1715 | 1677 | ||
| 1716 | lock_extent(io_tree, ordered_extent->file_offset, | 1678 | lock_extent_bits(io_tree, ordered_extent->file_offset, |
| 1717 | ordered_extent->file_offset + ordered_extent->len - 1, | 1679 | ordered_extent->file_offset + ordered_extent->len - 1, |
| 1718 | GFP_NOFS); | 1680 | 0, &cached_state, GFP_NOFS); |
| 1719 | 1681 | ||
| 1720 | trans = btrfs_join_transaction(root, 1); | 1682 | trans = btrfs_join_transaction(root, 1); |
| 1721 | 1683 | ||
| @@ -1742,9 +1704,10 @@ static int btrfs_finish_ordered_io(struct inode *inode, u64 start, u64 end) | |||
| 1742 | ordered_extent->len); | 1704 | ordered_extent->len); |
| 1743 | BUG_ON(ret); | 1705 | BUG_ON(ret); |
| 1744 | } | 1706 | } |
| 1745 | unlock_extent(io_tree, ordered_extent->file_offset, | 1707 | unlock_extent_cached(io_tree, ordered_extent->file_offset, |
| 1746 | ordered_extent->file_offset + ordered_extent->len - 1, | 1708 | ordered_extent->file_offset + |
| 1747 | GFP_NOFS); | 1709 | ordered_extent->len - 1, &cached_state, GFP_NOFS); |
| 1710 | |||
| 1748 | add_pending_csums(trans, inode, ordered_extent->file_offset, | 1711 | add_pending_csums(trans, inode, ordered_extent->file_offset, |
| 1749 | &ordered_extent->list); | 1712 | &ordered_extent->list); |
| 1750 | 1713 | ||
| @@ -2153,7 +2116,7 @@ void btrfs_orphan_cleanup(struct btrfs_root *root) | |||
| 2153 | found_key.objectid = found_key.offset; | 2116 | found_key.objectid = found_key.offset; |
| 2154 | found_key.type = BTRFS_INODE_ITEM_KEY; | 2117 | found_key.type = BTRFS_INODE_ITEM_KEY; |
| 2155 | found_key.offset = 0; | 2118 | found_key.offset = 0; |
| 2156 | inode = btrfs_iget(root->fs_info->sb, &found_key, root); | 2119 | inode = btrfs_iget(root->fs_info->sb, &found_key, root, NULL); |
| 2157 | if (IS_ERR(inode)) | 2120 | if (IS_ERR(inode)) |
| 2158 | break; | 2121 | break; |
| 2159 | 2122 | ||
| @@ -3081,6 +3044,7 @@ static int btrfs_truncate_page(struct address_space *mapping, loff_t from) | |||
| 3081 | struct btrfs_root *root = BTRFS_I(inode)->root; | 3044 | struct btrfs_root *root = BTRFS_I(inode)->root; |
| 3082 | struct extent_io_tree *io_tree = &BTRFS_I(inode)->io_tree; | 3045 | struct extent_io_tree *io_tree = &BTRFS_I(inode)->io_tree; |
| 3083 | struct btrfs_ordered_extent *ordered; | 3046 | struct btrfs_ordered_extent *ordered; |
| 3047 | struct extent_state *cached_state = NULL; | ||
| 3084 | char *kaddr; | 3048 | char *kaddr; |
| 3085 | u32 blocksize = root->sectorsize; | 3049 | u32 blocksize = root->sectorsize; |
| 3086 | pgoff_t index = from >> PAGE_CACHE_SHIFT; | 3050 | pgoff_t index = from >> PAGE_CACHE_SHIFT; |
| @@ -3127,12 +3091,14 @@ again: | |||
| 3127 | } | 3091 | } |
| 3128 | wait_on_page_writeback(page); | 3092 | wait_on_page_writeback(page); |
| 3129 | 3093 | ||
| 3130 | lock_extent(io_tree, page_start, page_end, GFP_NOFS); | 3094 | lock_extent_bits(io_tree, page_start, page_end, 0, &cached_state, |
| 3095 | GFP_NOFS); | ||
| 3131 | set_page_extent_mapped(page); | 3096 | set_page_extent_mapped(page); |
| 3132 | 3097 | ||
| 3133 | ordered = btrfs_lookup_ordered_extent(inode, page_start); | 3098 | ordered = btrfs_lookup_ordered_extent(inode, page_start); |
| 3134 | if (ordered) { | 3099 | if (ordered) { |
| 3135 | unlock_extent(io_tree, page_start, page_end, GFP_NOFS); | 3100 | unlock_extent_cached(io_tree, page_start, page_end, |
| 3101 | &cached_state, GFP_NOFS); | ||
| 3136 | unlock_page(page); | 3102 | unlock_page(page); |
| 3137 | page_cache_release(page); | 3103 | page_cache_release(page); |
| 3138 | btrfs_start_ordered_extent(inode, ordered, 1); | 3104 | btrfs_start_ordered_extent(inode, ordered, 1); |
| @@ -3140,13 +3106,15 @@ again: | |||
| 3140 | goto again; | 3106 | goto again; |
| 3141 | } | 3107 | } |
| 3142 | 3108 | ||
| 3143 | clear_extent_bits(&BTRFS_I(inode)->io_tree, page_start, page_end, | 3109 | clear_extent_bit(&BTRFS_I(inode)->io_tree, page_start, page_end, |
| 3144 | EXTENT_DIRTY | EXTENT_DELALLOC | EXTENT_DO_ACCOUNTING, | 3110 | EXTENT_DIRTY | EXTENT_DELALLOC | EXTENT_DO_ACCOUNTING, |
| 3145 | GFP_NOFS); | 3111 | 0, 0, &cached_state, GFP_NOFS); |
| 3146 | 3112 | ||
| 3147 | ret = btrfs_set_extent_delalloc(inode, page_start, page_end); | 3113 | ret = btrfs_set_extent_delalloc(inode, page_start, page_end, |
| 3114 | &cached_state); | ||
| 3148 | if (ret) { | 3115 | if (ret) { |
| 3149 | unlock_extent(io_tree, page_start, page_end, GFP_NOFS); | 3116 | unlock_extent_cached(io_tree, page_start, page_end, |
| 3117 | &cached_state, GFP_NOFS); | ||
| 3150 | goto out_unlock; | 3118 | goto out_unlock; |
| 3151 | } | 3119 | } |
| 3152 | 3120 | ||
| @@ -3159,7 +3127,8 @@ again: | |||
| 3159 | } | 3127 | } |
| 3160 | ClearPageChecked(page); | 3128 | ClearPageChecked(page); |
| 3161 | set_page_dirty(page); | 3129 | set_page_dirty(page); |
| 3162 | unlock_extent(io_tree, page_start, page_end, GFP_NOFS); | 3130 | unlock_extent_cached(io_tree, page_start, page_end, &cached_state, |
| 3131 | GFP_NOFS); | ||
| 3163 | 3132 | ||
| 3164 | out_unlock: | 3133 | out_unlock: |
| 3165 | if (ret) | 3134 | if (ret) |
| @@ -3177,6 +3146,7 @@ int btrfs_cont_expand(struct inode *inode, loff_t size) | |||
| 3177 | struct btrfs_root *root = BTRFS_I(inode)->root; | 3146 | struct btrfs_root *root = BTRFS_I(inode)->root; |
| 3178 | struct extent_io_tree *io_tree = &BTRFS_I(inode)->io_tree; | 3147 | struct extent_io_tree *io_tree = &BTRFS_I(inode)->io_tree; |
| 3179 | struct extent_map *em; | 3148 | struct extent_map *em; |
| 3149 | struct extent_state *cached_state = NULL; | ||
| 3180 | u64 mask = root->sectorsize - 1; | 3150 | u64 mask = root->sectorsize - 1; |
| 3181 | u64 hole_start = (inode->i_size + mask) & ~mask; | 3151 | u64 hole_start = (inode->i_size + mask) & ~mask; |
| 3182 | u64 block_end = (size + mask) & ~mask; | 3152 | u64 block_end = (size + mask) & ~mask; |
| @@ -3192,11 +3162,13 @@ int btrfs_cont_expand(struct inode *inode, loff_t size) | |||
| 3192 | struct btrfs_ordered_extent *ordered; | 3162 | struct btrfs_ordered_extent *ordered; |
| 3193 | btrfs_wait_ordered_range(inode, hole_start, | 3163 | btrfs_wait_ordered_range(inode, hole_start, |
| 3194 | block_end - hole_start); | 3164 | block_end - hole_start); |
| 3195 | lock_extent(io_tree, hole_start, block_end - 1, GFP_NOFS); | 3165 | lock_extent_bits(io_tree, hole_start, block_end - 1, 0, |
| 3166 | &cached_state, GFP_NOFS); | ||
| 3196 | ordered = btrfs_lookup_ordered_extent(inode, hole_start); | 3167 | ordered = btrfs_lookup_ordered_extent(inode, hole_start); |
| 3197 | if (!ordered) | 3168 | if (!ordered) |
| 3198 | break; | 3169 | break; |
| 3199 | unlock_extent(io_tree, hole_start, block_end - 1, GFP_NOFS); | 3170 | unlock_extent_cached(io_tree, hole_start, block_end - 1, |
| 3171 | &cached_state, GFP_NOFS); | ||
| 3200 | btrfs_put_ordered_extent(ordered); | 3172 | btrfs_put_ordered_extent(ordered); |
| 3201 | } | 3173 | } |
| 3202 | 3174 | ||
| @@ -3241,7 +3213,8 @@ int btrfs_cont_expand(struct inode *inode, loff_t size) | |||
| 3241 | break; | 3213 | break; |
| 3242 | } | 3214 | } |
| 3243 | 3215 | ||
| 3244 | unlock_extent(io_tree, hole_start, block_end - 1, GFP_NOFS); | 3216 | unlock_extent_cached(io_tree, hole_start, block_end - 1, &cached_state, |
| 3217 | GFP_NOFS); | ||
| 3245 | return err; | 3218 | return err; |
| 3246 | } | 3219 | } |
| 3247 | 3220 | ||
| @@ -3639,6 +3612,7 @@ static noinline void init_btrfs_i(struct inode *inode) | |||
| 3639 | bi->index_cnt = (u64)-1; | 3612 | bi->index_cnt = (u64)-1; |
| 3640 | bi->last_unlink_trans = 0; | 3613 | bi->last_unlink_trans = 0; |
| 3641 | bi->ordered_data_close = 0; | 3614 | bi->ordered_data_close = 0; |
| 3615 | bi->force_compress = 0; | ||
| 3642 | extent_map_tree_init(&BTRFS_I(inode)->extent_tree, GFP_NOFS); | 3616 | extent_map_tree_init(&BTRFS_I(inode)->extent_tree, GFP_NOFS); |
| 3643 | extent_io_tree_init(&BTRFS_I(inode)->io_tree, | 3617 | extent_io_tree_init(&BTRFS_I(inode)->io_tree, |
| 3644 | inode->i_mapping, GFP_NOFS); | 3618 | inode->i_mapping, GFP_NOFS); |
| @@ -3687,7 +3661,7 @@ static struct inode *btrfs_iget_locked(struct super_block *s, | |||
| 3687 | * Returns in *is_new if the inode was read from disk | 3661 | * Returns in *is_new if the inode was read from disk |
| 3688 | */ | 3662 | */ |
| 3689 | struct inode *btrfs_iget(struct super_block *s, struct btrfs_key *location, | 3663 | struct inode *btrfs_iget(struct super_block *s, struct btrfs_key *location, |
| 3690 | struct btrfs_root *root) | 3664 | struct btrfs_root *root, int *new) |
| 3691 | { | 3665 | { |
| 3692 | struct inode *inode; | 3666 | struct inode *inode; |
| 3693 | 3667 | ||
| @@ -3702,6 +3676,8 @@ struct inode *btrfs_iget(struct super_block *s, struct btrfs_key *location, | |||
| 3702 | 3676 | ||
| 3703 | inode_tree_add(inode); | 3677 | inode_tree_add(inode); |
| 3704 | unlock_new_inode(inode); | 3678 | unlock_new_inode(inode); |
| 3679 | if (new) | ||
| 3680 | *new = 1; | ||
| 3705 | } | 3681 | } |
| 3706 | 3682 | ||
| 3707 | return inode; | 3683 | return inode; |
| @@ -3754,7 +3730,7 @@ struct inode *btrfs_lookup_dentry(struct inode *dir, struct dentry *dentry) | |||
| 3754 | return NULL; | 3730 | return NULL; |
| 3755 | 3731 | ||
| 3756 | if (location.type == BTRFS_INODE_ITEM_KEY) { | 3732 | if (location.type == BTRFS_INODE_ITEM_KEY) { |
| 3757 | inode = btrfs_iget(dir->i_sb, &location, root); | 3733 | inode = btrfs_iget(dir->i_sb, &location, root, NULL); |
| 3758 | return inode; | 3734 | return inode; |
| 3759 | } | 3735 | } |
| 3760 | 3736 | ||
| @@ -3769,7 +3745,7 @@ struct inode *btrfs_lookup_dentry(struct inode *dir, struct dentry *dentry) | |||
| 3769 | else | 3745 | else |
| 3770 | inode = new_simple_dir(dir->i_sb, &location, sub_root); | 3746 | inode = new_simple_dir(dir->i_sb, &location, sub_root); |
| 3771 | } else { | 3747 | } else { |
| 3772 | inode = btrfs_iget(dir->i_sb, &location, sub_root); | 3748 | inode = btrfs_iget(dir->i_sb, &location, sub_root, NULL); |
| 3773 | } | 3749 | } |
| 3774 | srcu_read_unlock(&root->fs_info->subvol_srcu, index); | 3750 | srcu_read_unlock(&root->fs_info->subvol_srcu, index); |
| 3775 | 3751 | ||
| @@ -4501,7 +4477,7 @@ static int btrfs_mkdir(struct inode *dir, struct dentry *dentry, int mode) | |||
| 4501 | err = btrfs_find_free_objectid(trans, root, dir->i_ino, &objectid); | 4477 | err = btrfs_find_free_objectid(trans, root, dir->i_ino, &objectid); |
| 4502 | if (err) { | 4478 | if (err) { |
| 4503 | err = -ENOSPC; | 4479 | err = -ENOSPC; |
| 4504 | goto out_unlock; | 4480 | goto out_fail; |
| 4505 | } | 4481 | } |
| 4506 | 4482 | ||
| 4507 | inode = btrfs_new_inode(trans, root, dir, dentry->d_name.name, | 4483 | inode = btrfs_new_inode(trans, root, dir, dentry->d_name.name, |
| @@ -4979,6 +4955,7 @@ static void btrfs_invalidatepage(struct page *page, unsigned long offset) | |||
| 4979 | { | 4955 | { |
| 4980 | struct extent_io_tree *tree; | 4956 | struct extent_io_tree *tree; |
| 4981 | struct btrfs_ordered_extent *ordered; | 4957 | struct btrfs_ordered_extent *ordered; |
| 4958 | struct extent_state *cached_state = NULL; | ||
| 4982 | u64 page_start = page_offset(page); | 4959 | u64 page_start = page_offset(page); |
| 4983 | u64 page_end = page_start + PAGE_CACHE_SIZE - 1; | 4960 | u64 page_end = page_start + PAGE_CACHE_SIZE - 1; |
| 4984 | 4961 | ||
| @@ -4997,7 +4974,8 @@ static void btrfs_invalidatepage(struct page *page, unsigned long offset) | |||
| 4997 | btrfs_releasepage(page, GFP_NOFS); | 4974 | btrfs_releasepage(page, GFP_NOFS); |
| 4998 | return; | 4975 | return; |
| 4999 | } | 4976 | } |
| 5000 | lock_extent(tree, page_start, page_end, GFP_NOFS); | 4977 | lock_extent_bits(tree, page_start, page_end, 0, &cached_state, |
| 4978 | GFP_NOFS); | ||
| 5001 | ordered = btrfs_lookup_ordered_extent(page->mapping->host, | 4979 | ordered = btrfs_lookup_ordered_extent(page->mapping->host, |
| 5002 | page_offset(page)); | 4980 | page_offset(page)); |
| 5003 | if (ordered) { | 4981 | if (ordered) { |
| @@ -5008,7 +4986,7 @@ static void btrfs_invalidatepage(struct page *page, unsigned long offset) | |||
| 5008 | clear_extent_bit(tree, page_start, page_end, | 4986 | clear_extent_bit(tree, page_start, page_end, |
| 5009 | EXTENT_DIRTY | EXTENT_DELALLOC | | 4987 | EXTENT_DIRTY | EXTENT_DELALLOC | |
| 5010 | EXTENT_LOCKED | EXTENT_DO_ACCOUNTING, 1, 0, | 4988 | EXTENT_LOCKED | EXTENT_DO_ACCOUNTING, 1, 0, |
| 5011 | NULL, GFP_NOFS); | 4989 | &cached_state, GFP_NOFS); |
| 5012 | /* | 4990 | /* |
| 5013 | * whoever cleared the private bit is responsible | 4991 | * whoever cleared the private bit is responsible |
| 5014 | * for the finish_ordered_io | 4992 | * for the finish_ordered_io |
| @@ -5018,11 +4996,13 @@ static void btrfs_invalidatepage(struct page *page, unsigned long offset) | |||
| 5018 | page_start, page_end); | 4996 | page_start, page_end); |
| 5019 | } | 4997 | } |
| 5020 | btrfs_put_ordered_extent(ordered); | 4998 | btrfs_put_ordered_extent(ordered); |
| 5021 | lock_extent(tree, page_start, page_end, GFP_NOFS); | 4999 | cached_state = NULL; |
| 5000 | lock_extent_bits(tree, page_start, page_end, 0, &cached_state, | ||
| 5001 | GFP_NOFS); | ||
| 5022 | } | 5002 | } |
| 5023 | clear_extent_bit(tree, page_start, page_end, | 5003 | clear_extent_bit(tree, page_start, page_end, |
| 5024 | EXTENT_LOCKED | EXTENT_DIRTY | EXTENT_DELALLOC | | 5004 | EXTENT_LOCKED | EXTENT_DIRTY | EXTENT_DELALLOC | |
| 5025 | EXTENT_DO_ACCOUNTING, 1, 1, NULL, GFP_NOFS); | 5005 | EXTENT_DO_ACCOUNTING, 1, 1, &cached_state, GFP_NOFS); |
| 5026 | __btrfs_releasepage(page, GFP_NOFS); | 5006 | __btrfs_releasepage(page, GFP_NOFS); |
| 5027 | 5007 | ||
| 5028 | ClearPageChecked(page); | 5008 | ClearPageChecked(page); |
| @@ -5055,6 +5035,7 @@ int btrfs_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf) | |||
| 5055 | struct btrfs_root *root = BTRFS_I(inode)->root; | 5035 | struct btrfs_root *root = BTRFS_I(inode)->root; |
| 5056 | struct extent_io_tree *io_tree = &BTRFS_I(inode)->io_tree; | 5036 | struct extent_io_tree *io_tree = &BTRFS_I(inode)->io_tree; |
| 5057 | struct btrfs_ordered_extent *ordered; | 5037 | struct btrfs_ordered_extent *ordered; |
| 5038 | struct extent_state *cached_state = NULL; | ||
| 5058 | char *kaddr; | 5039 | char *kaddr; |
| 5059 | unsigned long zero_start; | 5040 | unsigned long zero_start; |
| 5060 | loff_t size; | 5041 | loff_t size; |
| @@ -5093,7 +5074,8 @@ again: | |||
| 5093 | } | 5074 | } |
| 5094 | wait_on_page_writeback(page); | 5075 | wait_on_page_writeback(page); |
| 5095 | 5076 | ||
| 5096 | lock_extent(io_tree, page_start, page_end, GFP_NOFS); | 5077 | lock_extent_bits(io_tree, page_start, page_end, 0, &cached_state, |
| 5078 | GFP_NOFS); | ||
| 5097 | set_page_extent_mapped(page); | 5079 | set_page_extent_mapped(page); |
| 5098 | 5080 | ||
| 5099 | /* | 5081 | /* |
| @@ -5102,7 +5084,8 @@ again: | |||
| 5102 | */ | 5084 | */ |
| 5103 | ordered = btrfs_lookup_ordered_extent(inode, page_start); | 5085 | ordered = btrfs_lookup_ordered_extent(inode, page_start); |
| 5104 | if (ordered) { | 5086 | if (ordered) { |
| 5105 | unlock_extent(io_tree, page_start, page_end, GFP_NOFS); | 5087 | unlock_extent_cached(io_tree, page_start, page_end, |
| 5088 | &cached_state, GFP_NOFS); | ||
| 5106 | unlock_page(page); | 5089 | unlock_page(page); |
| 5107 | btrfs_start_ordered_extent(inode, ordered, 1); | 5090 | btrfs_start_ordered_extent(inode, ordered, 1); |
| 5108 | btrfs_put_ordered_extent(ordered); | 5091 | btrfs_put_ordered_extent(ordered); |
| @@ -5116,13 +5099,15 @@ again: | |||
| 5116 | * is probably a better way to do this, but for now keep consistent with | 5099 | * is probably a better way to do this, but for now keep consistent with |
| 5117 | * prepare_pages in the normal write path. | 5100 | * prepare_pages in the normal write path. |
| 5118 | */ | 5101 | */ |
| 5119 | clear_extent_bits(&BTRFS_I(inode)->io_tree, page_start, page_end, | 5102 | clear_extent_bit(&BTRFS_I(inode)->io_tree, page_start, page_end, |
| 5120 | EXTENT_DIRTY | EXTENT_DELALLOC | EXTENT_DO_ACCOUNTING, | 5103 | EXTENT_DIRTY | EXTENT_DELALLOC | EXTENT_DO_ACCOUNTING, |
| 5121 | GFP_NOFS); | 5104 | 0, 0, &cached_state, GFP_NOFS); |
| 5122 | 5105 | ||
| 5123 | ret = btrfs_set_extent_delalloc(inode, page_start, page_end); | 5106 | ret = btrfs_set_extent_delalloc(inode, page_start, page_end, |
| 5107 | &cached_state); | ||
| 5124 | if (ret) { | 5108 | if (ret) { |
| 5125 | unlock_extent(io_tree, page_start, page_end, GFP_NOFS); | 5109 | unlock_extent_cached(io_tree, page_start, page_end, |
| 5110 | &cached_state, GFP_NOFS); | ||
| 5126 | ret = VM_FAULT_SIGBUS; | 5111 | ret = VM_FAULT_SIGBUS; |
| 5127 | btrfs_free_reserved_data_space(root, inode, PAGE_CACHE_SIZE); | 5112 | btrfs_free_reserved_data_space(root, inode, PAGE_CACHE_SIZE); |
| 5128 | goto out_unlock; | 5113 | goto out_unlock; |
| @@ -5148,7 +5133,7 @@ again: | |||
| 5148 | BTRFS_I(inode)->last_trans = root->fs_info->generation; | 5133 | BTRFS_I(inode)->last_trans = root->fs_info->generation; |
| 5149 | BTRFS_I(inode)->last_sub_trans = BTRFS_I(inode)->root->log_transid; | 5134 | BTRFS_I(inode)->last_sub_trans = BTRFS_I(inode)->root->log_transid; |
| 5150 | 5135 | ||
| 5151 | unlock_extent(io_tree, page_start, page_end, GFP_NOFS); | 5136 | unlock_extent_cached(io_tree, page_start, page_end, &cached_state, GFP_NOFS); |
| 5152 | 5137 | ||
| 5153 | out_unlock: | 5138 | out_unlock: |
| 5154 | btrfs_unreserve_metadata_for_delalloc(root, inode, 1); | 5139 | btrfs_unreserve_metadata_for_delalloc(root, inode, 1); |
| @@ -5353,7 +5338,6 @@ free: | |||
| 5353 | void btrfs_drop_inode(struct inode *inode) | 5338 | void btrfs_drop_inode(struct inode *inode) |
| 5354 | { | 5339 | { |
| 5355 | struct btrfs_root *root = BTRFS_I(inode)->root; | 5340 | struct btrfs_root *root = BTRFS_I(inode)->root; |
| 5356 | |||
| 5357 | if (inode->i_nlink > 0 && btrfs_root_refs(&root->root_item) == 0) | 5341 | if (inode->i_nlink > 0 && btrfs_root_refs(&root->root_item) == 0) |
| 5358 | generic_delete_inode(inode); | 5342 | generic_delete_inode(inode); |
| 5359 | else | 5343 | else |
| @@ -5757,18 +5741,15 @@ static int prealloc_file_range(struct inode *inode, u64 start, u64 end, | |||
| 5757 | struct btrfs_trans_handle *trans; | 5741 | struct btrfs_trans_handle *trans; |
| 5758 | struct btrfs_root *root = BTRFS_I(inode)->root; | 5742 | struct btrfs_root *root = BTRFS_I(inode)->root; |
| 5759 | struct btrfs_key ins; | 5743 | struct btrfs_key ins; |
| 5760 | u64 alloc_size; | ||
| 5761 | u64 cur_offset = start; | 5744 | u64 cur_offset = start; |
| 5762 | u64 num_bytes = end - start; | 5745 | u64 num_bytes = end - start; |
| 5763 | int ret = 0; | 5746 | int ret = 0; |
| 5764 | u64 i_size; | 5747 | u64 i_size; |
| 5765 | 5748 | ||
| 5766 | while (num_bytes > 0) { | 5749 | while (num_bytes > 0) { |
| 5767 | alloc_size = min(num_bytes, root->fs_info->max_extent); | ||
| 5768 | |||
| 5769 | trans = btrfs_start_transaction(root, 1); | 5750 | trans = btrfs_start_transaction(root, 1); |
| 5770 | 5751 | ||
| 5771 | ret = btrfs_reserve_extent(trans, root, alloc_size, | 5752 | ret = btrfs_reserve_extent(trans, root, num_bytes, |
| 5772 | root->sectorsize, 0, alloc_hint, | 5753 | root->sectorsize, 0, alloc_hint, |
| 5773 | (u64)-1, &ins, 1); | 5754 | (u64)-1, &ins, 1); |
| 5774 | if (ret) { | 5755 | if (ret) { |
| @@ -5827,6 +5808,7 @@ stop_trans: | |||
| 5827 | static long btrfs_fallocate(struct inode *inode, int mode, | 5808 | static long btrfs_fallocate(struct inode *inode, int mode, |
| 5828 | loff_t offset, loff_t len) | 5809 | loff_t offset, loff_t len) |
| 5829 | { | 5810 | { |
| 5811 | struct extent_state *cached_state = NULL; | ||
| 5830 | u64 cur_offset; | 5812 | u64 cur_offset; |
| 5831 | u64 last_byte; | 5813 | u64 last_byte; |
| 5832 | u64 alloc_start; | 5814 | u64 alloc_start; |
| @@ -5865,16 +5847,17 @@ static long btrfs_fallocate(struct inode *inode, int mode, | |||
| 5865 | /* the extent lock is ordered inside the running | 5847 | /* the extent lock is ordered inside the running |
| 5866 | * transaction | 5848 | * transaction |
| 5867 | */ | 5849 | */ |
| 5868 | lock_extent(&BTRFS_I(inode)->io_tree, alloc_start, locked_end, | 5850 | lock_extent_bits(&BTRFS_I(inode)->io_tree, alloc_start, |
| 5869 | GFP_NOFS); | 5851 | locked_end, 0, &cached_state, GFP_NOFS); |
| 5870 | ordered = btrfs_lookup_first_ordered_extent(inode, | 5852 | ordered = btrfs_lookup_first_ordered_extent(inode, |
| 5871 | alloc_end - 1); | 5853 | alloc_end - 1); |
| 5872 | if (ordered && | 5854 | if (ordered && |
| 5873 | ordered->file_offset + ordered->len > alloc_start && | 5855 | ordered->file_offset + ordered->len > alloc_start && |
| 5874 | ordered->file_offset < alloc_end) { | 5856 | ordered->file_offset < alloc_end) { |
| 5875 | btrfs_put_ordered_extent(ordered); | 5857 | btrfs_put_ordered_extent(ordered); |
| 5876 | unlock_extent(&BTRFS_I(inode)->io_tree, | 5858 | unlock_extent_cached(&BTRFS_I(inode)->io_tree, |
| 5877 | alloc_start, locked_end, GFP_NOFS); | 5859 | alloc_start, locked_end, |
| 5860 | &cached_state, GFP_NOFS); | ||
| 5878 | /* | 5861 | /* |
| 5879 | * we can't wait on the range with the transaction | 5862 | * we can't wait on the range with the transaction |
| 5880 | * running or with the extent lock held | 5863 | * running or with the extent lock held |
| @@ -5916,8 +5899,8 @@ static long btrfs_fallocate(struct inode *inode, int mode, | |||
| 5916 | break; | 5899 | break; |
| 5917 | } | 5900 | } |
| 5918 | } | 5901 | } |
| 5919 | unlock_extent(&BTRFS_I(inode)->io_tree, alloc_start, locked_end, | 5902 | unlock_extent_cached(&BTRFS_I(inode)->io_tree, alloc_start, locked_end, |
| 5920 | GFP_NOFS); | 5903 | &cached_state, GFP_NOFS); |
| 5921 | 5904 | ||
| 5922 | btrfs_free_reserved_data_space(BTRFS_I(inode)->root, inode, | 5905 | btrfs_free_reserved_data_space(BTRFS_I(inode)->root, inode, |
| 5923 | alloc_end - alloc_start); | 5906 | alloc_end - alloc_start); |
