diff options
-rw-r--r-- | fs/btrfs/extent_map.h | 1 | ||||
-rw-r--r-- | fs/btrfs/file.c | 3 | ||||
-rw-r--r-- | fs/btrfs/inode.c | 21 | ||||
-rw-r--r-- | fs/btrfs/tree-log.c | 2 |
4 files changed, 22 insertions, 5 deletions
diff --git a/fs/btrfs/extent_map.h b/fs/btrfs/extent_map.h index c6598c89cff8..b18314bc5a6e 100644 --- a/fs/btrfs/extent_map.h +++ b/fs/btrfs/extent_map.h | |||
@@ -26,6 +26,7 @@ struct extent_map { | |||
26 | u64 mod_len; | 26 | u64 mod_len; |
27 | u64 orig_start; | 27 | u64 orig_start; |
28 | u64 orig_block_len; | 28 | u64 orig_block_len; |
29 | u64 ram_bytes; | ||
29 | u64 block_start; | 30 | u64 block_start; |
30 | u64 block_len; | 31 | u64 block_len; |
31 | u64 generation; | 32 | u64 generation; |
diff --git a/fs/btrfs/file.c b/fs/btrfs/file.c index ade03e6f7bd2..e81e428a8840 100644 --- a/fs/btrfs/file.c +++ b/fs/btrfs/file.c | |||
@@ -607,6 +607,7 @@ void btrfs_drop_extent_cache(struct inode *inode, u64 start, u64 end, | |||
607 | split->block_len = em->block_len; | 607 | split->block_len = em->block_len; |
608 | else | 608 | else |
609 | split->block_len = split->len; | 609 | split->block_len = split->len; |
610 | split->ram_bytes = em->ram_bytes; | ||
610 | split->orig_block_len = max(split->block_len, | 611 | split->orig_block_len = max(split->block_len, |
611 | em->orig_block_len); | 612 | em->orig_block_len); |
612 | split->generation = gen; | 613 | split->generation = gen; |
@@ -632,6 +633,7 @@ void btrfs_drop_extent_cache(struct inode *inode, u64 start, u64 end, | |||
632 | split->generation = gen; | 633 | split->generation = gen; |
633 | split->orig_block_len = max(em->block_len, | 634 | split->orig_block_len = max(em->block_len, |
634 | em->orig_block_len); | 635 | em->orig_block_len); |
636 | split->ram_bytes = em->ram_bytes; | ||
635 | 637 | ||
636 | if (compressed) { | 638 | if (compressed) { |
637 | split->block_len = em->block_len; | 639 | split->block_len = em->block_len; |
@@ -1915,6 +1917,7 @@ out: | |||
1915 | } else { | 1917 | } else { |
1916 | hole_em->start = offset; | 1918 | hole_em->start = offset; |
1917 | hole_em->len = end - offset; | 1919 | hole_em->len = end - offset; |
1920 | hole_em->ram_bytes = hole_em->len; | ||
1918 | hole_em->orig_start = offset; | 1921 | hole_em->orig_start = offset; |
1919 | 1922 | ||
1920 | hole_em->block_start = EXTENT_MAP_HOLE; | 1923 | hole_em->block_start = EXTENT_MAP_HOLE; |
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index 3f3129173b26..456667b04fe6 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c | |||
@@ -100,7 +100,8 @@ static noinline int cow_file_range(struct inode *inode, | |||
100 | static struct extent_map *create_pinned_em(struct inode *inode, u64 start, | 100 | static struct extent_map *create_pinned_em(struct inode *inode, u64 start, |
101 | u64 len, u64 orig_start, | 101 | u64 len, u64 orig_start, |
102 | u64 block_start, u64 block_len, | 102 | u64 block_start, u64 block_len, |
103 | u64 orig_block_len, int type); | 103 | u64 orig_block_len, u64 ram_bytes, |
104 | int type); | ||
104 | 105 | ||
105 | static int btrfs_init_inode_security(struct btrfs_trans_handle *trans, | 106 | static int btrfs_init_inode_security(struct btrfs_trans_handle *trans, |
106 | struct inode *inode, struct inode *dir, | 107 | struct inode *inode, struct inode *dir, |
@@ -722,6 +723,7 @@ retry: | |||
722 | em->block_start = ins.objectid; | 723 | em->block_start = ins.objectid; |
723 | em->block_len = ins.offset; | 724 | em->block_len = ins.offset; |
724 | em->orig_block_len = ins.offset; | 725 | em->orig_block_len = ins.offset; |
726 | em->ram_bytes = async_extent->ram_size; | ||
725 | em->bdev = root->fs_info->fs_devices->latest_bdev; | 727 | em->bdev = root->fs_info->fs_devices->latest_bdev; |
726 | em->compress_type = async_extent->compress_type; | 728 | em->compress_type = async_extent->compress_type; |
727 | set_bit(EXTENT_FLAG_PINNED, &em->flags); | 729 | set_bit(EXTENT_FLAG_PINNED, &em->flags); |
@@ -932,6 +934,7 @@ static noinline int __cow_file_range(struct btrfs_trans_handle *trans, | |||
932 | em->block_start = ins.objectid; | 934 | em->block_start = ins.objectid; |
933 | em->block_len = ins.offset; | 935 | em->block_len = ins.offset; |
934 | em->orig_block_len = ins.offset; | 936 | em->orig_block_len = ins.offset; |
937 | em->ram_bytes = ram_size; | ||
935 | em->bdev = root->fs_info->fs_devices->latest_bdev; | 938 | em->bdev = root->fs_info->fs_devices->latest_bdev; |
936 | set_bit(EXTENT_FLAG_PINNED, &em->flags); | 939 | set_bit(EXTENT_FLAG_PINNED, &em->flags); |
937 | em->generation = -1; | 940 | em->generation = -1; |
@@ -1194,6 +1197,7 @@ static noinline int run_delalloc_nocow(struct inode *inode, | |||
1194 | u64 disk_bytenr; | 1197 | u64 disk_bytenr; |
1195 | u64 num_bytes; | 1198 | u64 num_bytes; |
1196 | u64 disk_num_bytes; | 1199 | u64 disk_num_bytes; |
1200 | u64 ram_bytes; | ||
1197 | int extent_type; | 1201 | int extent_type; |
1198 | int ret, err; | 1202 | int ret, err; |
1199 | int type; | 1203 | int type; |
@@ -1290,6 +1294,7 @@ next_slot: | |||
1290 | struct btrfs_file_extent_item); | 1294 | struct btrfs_file_extent_item); |
1291 | extent_type = btrfs_file_extent_type(leaf, fi); | 1295 | extent_type = btrfs_file_extent_type(leaf, fi); |
1292 | 1296 | ||
1297 | ram_bytes = btrfs_file_extent_ram_bytes(leaf, fi); | ||
1293 | if (extent_type == BTRFS_FILE_EXTENT_REG || | 1298 | if (extent_type == BTRFS_FILE_EXTENT_REG || |
1294 | extent_type == BTRFS_FILE_EXTENT_PREALLOC) { | 1299 | extent_type == BTRFS_FILE_EXTENT_PREALLOC) { |
1295 | disk_bytenr = btrfs_file_extent_disk_bytenr(leaf, fi); | 1300 | disk_bytenr = btrfs_file_extent_disk_bytenr(leaf, fi); |
@@ -1373,6 +1378,7 @@ out_check: | |||
1373 | em->block_len = num_bytes; | 1378 | em->block_len = num_bytes; |
1374 | em->block_start = disk_bytenr; | 1379 | em->block_start = disk_bytenr; |
1375 | em->orig_block_len = disk_num_bytes; | 1380 | em->orig_block_len = disk_num_bytes; |
1381 | em->ram_bytes = ram_bytes; | ||
1376 | em->bdev = root->fs_info->fs_devices->latest_bdev; | 1382 | em->bdev = root->fs_info->fs_devices->latest_bdev; |
1377 | em->mod_start = em->start; | 1383 | em->mod_start = em->start; |
1378 | em->mod_len = em->len; | 1384 | em->mod_len = em->len; |
@@ -4454,6 +4460,7 @@ int btrfs_cont_expand(struct inode *inode, loff_t oldsize, loff_t size) | |||
4454 | hole_em->block_start = EXTENT_MAP_HOLE; | 4460 | hole_em->block_start = EXTENT_MAP_HOLE; |
4455 | hole_em->block_len = 0; | 4461 | hole_em->block_len = 0; |
4456 | hole_em->orig_block_len = 0; | 4462 | hole_em->orig_block_len = 0; |
4463 | hole_em->ram_bytes = hole_size; | ||
4457 | hole_em->bdev = root->fs_info->fs_devices->latest_bdev; | 4464 | hole_em->bdev = root->fs_info->fs_devices->latest_bdev; |
4458 | hole_em->compress_type = BTRFS_COMPRESS_NONE; | 4465 | hole_em->compress_type = BTRFS_COMPRESS_NONE; |
4459 | hole_em->generation = trans->transid; | 4466 | hole_em->generation = trans->transid; |
@@ -6156,6 +6163,7 @@ again: | |||
6156 | goto not_found_em; | 6163 | goto not_found_em; |
6157 | } | 6164 | } |
6158 | 6165 | ||
6166 | em->ram_bytes = btrfs_file_extent_ram_bytes(leaf, item); | ||
6159 | if (found_type == BTRFS_FILE_EXTENT_REG || | 6167 | if (found_type == BTRFS_FILE_EXTENT_REG || |
6160 | found_type == BTRFS_FILE_EXTENT_PREALLOC) { | 6168 | found_type == BTRFS_FILE_EXTENT_PREALLOC) { |
6161 | em->start = extent_start; | 6169 | em->start = extent_start; |
@@ -6487,7 +6495,7 @@ static struct extent_map *btrfs_new_extent_direct(struct inode *inode, | |||
6487 | } | 6495 | } |
6488 | 6496 | ||
6489 | em = create_pinned_em(inode, start, ins.offset, start, ins.objectid, | 6497 | em = create_pinned_em(inode, start, ins.offset, start, ins.objectid, |
6490 | ins.offset, ins.offset, 0); | 6498 | ins.offset, ins.offset, ins.offset, 0); |
6491 | if (IS_ERR(em)) | 6499 | if (IS_ERR(em)) |
6492 | goto out; | 6500 | goto out; |
6493 | 6501 | ||
@@ -6666,7 +6674,8 @@ static int lock_extent_direct(struct inode *inode, u64 lockstart, u64 lockend, | |||
6666 | static struct extent_map *create_pinned_em(struct inode *inode, u64 start, | 6674 | static struct extent_map *create_pinned_em(struct inode *inode, u64 start, |
6667 | u64 len, u64 orig_start, | 6675 | u64 len, u64 orig_start, |
6668 | u64 block_start, u64 block_len, | 6676 | u64 block_start, u64 block_len, |
6669 | u64 orig_block_len, int type) | 6677 | u64 orig_block_len, u64 ram_bytes, |
6678 | int type) | ||
6670 | { | 6679 | { |
6671 | struct extent_map_tree *em_tree; | 6680 | struct extent_map_tree *em_tree; |
6672 | struct extent_map *em; | 6681 | struct extent_map *em; |
@@ -6687,6 +6696,7 @@ static struct extent_map *create_pinned_em(struct inode *inode, u64 start, | |||
6687 | em->block_start = block_start; | 6696 | em->block_start = block_start; |
6688 | em->bdev = root->fs_info->fs_devices->latest_bdev; | 6697 | em->bdev = root->fs_info->fs_devices->latest_bdev; |
6689 | em->orig_block_len = orig_block_len; | 6698 | em->orig_block_len = orig_block_len; |
6699 | em->ram_bytes = ram_bytes; | ||
6690 | em->generation = -1; | 6700 | em->generation = -1; |
6691 | set_bit(EXTENT_FLAG_PINNED, &em->flags); | 6701 | set_bit(EXTENT_FLAG_PINNED, &em->flags); |
6692 | if (type == BTRFS_ORDERED_PREALLOC) | 6702 | if (type == BTRFS_ORDERED_PREALLOC) |
@@ -6815,13 +6825,15 @@ static int btrfs_get_blocks_direct(struct inode *inode, sector_t iblock, | |||
6815 | if (can_nocow_odirect(trans, inode, start, len) == 1) { | 6825 | if (can_nocow_odirect(trans, inode, start, len) == 1) { |
6816 | u64 orig_start = em->orig_start; | 6826 | u64 orig_start = em->orig_start; |
6817 | u64 orig_block_len = em->orig_block_len; | 6827 | u64 orig_block_len = em->orig_block_len; |
6828 | u64 ram_bytes = em->ram_bytes; | ||
6818 | 6829 | ||
6819 | if (type == BTRFS_ORDERED_PREALLOC) { | 6830 | if (type == BTRFS_ORDERED_PREALLOC) { |
6820 | free_extent_map(em); | 6831 | free_extent_map(em); |
6821 | em = create_pinned_em(inode, start, len, | 6832 | em = create_pinned_em(inode, start, len, |
6822 | orig_start, | 6833 | orig_start, |
6823 | block_start, len, | 6834 | block_start, len, |
6824 | orig_block_len, type); | 6835 | orig_block_len, |
6836 | ram_bytes, type); | ||
6825 | if (IS_ERR(em)) { | 6837 | if (IS_ERR(em)) { |
6826 | btrfs_end_transaction(trans, root); | 6838 | btrfs_end_transaction(trans, root); |
6827 | goto unlock_err; | 6839 | goto unlock_err; |
@@ -8574,6 +8586,7 @@ static int __btrfs_prealloc_file_range(struct inode *inode, int mode, | |||
8574 | em->block_start = ins.objectid; | 8586 | em->block_start = ins.objectid; |
8575 | em->block_len = ins.offset; | 8587 | em->block_len = ins.offset; |
8576 | em->orig_block_len = ins.offset; | 8588 | em->orig_block_len = ins.offset; |
8589 | em->ram_bytes = ins.offset; | ||
8577 | em->bdev = root->fs_info->fs_devices->latest_bdev; | 8590 | em->bdev = root->fs_info->fs_devices->latest_bdev; |
8578 | set_bit(EXTENT_FLAG_PREALLOC, &em->flags); | 8591 | set_bit(EXTENT_FLAG_PREALLOC, &em->flags); |
8579 | em->generation = trans->transid; | 8592 | em->generation = trans->transid; |
diff --git a/fs/btrfs/tree-log.c b/fs/btrfs/tree-log.c index f728eeb3eda5..592aa654b5f3 100644 --- a/fs/btrfs/tree-log.c +++ b/fs/btrfs/tree-log.c | |||
@@ -3410,7 +3410,7 @@ insert: | |||
3410 | em->start - em->orig_start, | 3410 | em->start - em->orig_start, |
3411 | &token); | 3411 | &token); |
3412 | btrfs_set_token_file_extent_num_bytes(leaf, fi, em->len, &token); | 3412 | btrfs_set_token_file_extent_num_bytes(leaf, fi, em->len, &token); |
3413 | btrfs_set_token_file_extent_ram_bytes(leaf, fi, em->len, &token); | 3413 | btrfs_set_token_file_extent_ram_bytes(leaf, fi, em->ram_bytes, &token); |
3414 | btrfs_set_token_file_extent_compression(leaf, fi, em->compress_type, | 3414 | btrfs_set_token_file_extent_compression(leaf, fi, em->compress_type, |
3415 | &token); | 3415 | &token); |
3416 | btrfs_set_token_file_extent_encryption(leaf, fi, 0, &token); | 3416 | btrfs_set_token_file_extent_encryption(leaf, fi, 0, &token); |