aboutsummaryrefslogtreecommitdiffstats
path: root/fs/btrfs/inode.c
diff options
context:
space:
mode:
authorJosef Bacik <jbacik@fusionio.com>2013-04-04 14:31:27 -0400
committerJosef Bacik <jbacik@fusionio.com>2013-05-06 15:54:33 -0400
commitcc95bef635a649d595cf8d1cd4fcff5b6bf13023 (patch)
treedbe8e6b5953648dbef4ce26e45f522ed73103238 /fs/btrfs/inode.c
parent98ad69cfd2ca8e27250af839bacda1639a7dc3a4 (diff)
Btrfs: log ram bytes properly
When logging changed extents I was logging ram_bytes as the current length, which isn't correct, it's supposed to be the ram bytes of the original extent. This is for compression where even if we split the extent we need to know the ram bytes so when we uncompress the extent we know how big it will be. This was still working out right with compression for some reason but I think we were getting lucky. It was definitely off for prealloc which is why I noticed it, btrfsck was complaining about it. With this patch btrfsck no longer complains after a log replay. Thanks, Signed-off-by: Josef Bacik <jbacik@fusionio.com>
Diffstat (limited to 'fs/btrfs/inode.c')
-rw-r--r--fs/btrfs/inode.c21
1 files changed, 17 insertions, 4 deletions
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,
100static struct extent_map *create_pinned_em(struct inode *inode, u64 start, 100static 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
105static int btrfs_init_inode_security(struct btrfs_trans_handle *trans, 106static 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,
6666static struct extent_map *create_pinned_em(struct inode *inode, u64 start, 6674static 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;