aboutsummaryrefslogtreecommitdiffstats
path: root/fs/btrfs/ordered-data.c
diff options
context:
space:
mode:
authorMiao Xie <miaox@cn.fujitsu.com>2013-06-18 22:36:09 -0400
committerJosef Bacik <jbacik@fusionio.com>2013-07-02 11:50:47 -0400
commitf51a4a1826ff810eb9c00cadff8978b028c40756 (patch)
tree20185a1b681194a39513f346f72e6d8ef605b8e1 /fs/btrfs/ordered-data.c
parent7ee9e4405f264e9eda808aa5ca4522746a1af9c1 (diff)
Btrfs: remove btrfs_sector_sum structure
Using the structure btrfs_sector_sum to keep the checksum value is unnecessary, because the extents that btrfs_sector_sum points to are continuous, we can find out the expected checksums by btrfs_ordered_sum's bytenr and the offset, so we can remove btrfs_sector_sum's bytenr. After removing bytenr, there is only one member in the structure, so it makes no sense to keep the structure, just remove it, and use a u32 array to store the checksum value. By this change, we don't use the while loop to get the checksums one by one. Now, we can get several checksum value at one time, it improved the performance by ~74% on my SSD (31MB/s -> 54MB/s). test command: # dd if=/dev/zero of=/mnt/btrfs/file0 bs=1M count=1024 oflag=sync Signed-off-by: Miao Xie <miaox@cn.fujitsu.com> Signed-off-by: Josef Bacik <jbacik@fusionio.com>
Diffstat (limited to 'fs/btrfs/ordered-data.c')
-rw-r--r--fs/btrfs/ordered-data.c19
1 files changed, 8 insertions, 11 deletions
diff --git a/fs/btrfs/ordered-data.c b/fs/btrfs/ordered-data.c
index 665c640e3ea6..81369827e514 100644
--- a/fs/btrfs/ordered-data.c
+++ b/fs/btrfs/ordered-data.c
@@ -1032,7 +1032,6 @@ int btrfs_find_ordered_sum(struct inode *inode, u64 offset, u64 disk_bytenr,
1032 u32 *sum, int len) 1032 u32 *sum, int len)
1033{ 1033{
1034 struct btrfs_ordered_sum *ordered_sum; 1034 struct btrfs_ordered_sum *ordered_sum;
1035 struct btrfs_sector_sum *sector_sums;
1036 struct btrfs_ordered_extent *ordered; 1035 struct btrfs_ordered_extent *ordered;
1037 struct btrfs_ordered_inode_tree *tree = &BTRFS_I(inode)->ordered_tree; 1036 struct btrfs_ordered_inode_tree *tree = &BTRFS_I(inode)->ordered_tree;
1038 unsigned long num_sectors; 1037 unsigned long num_sectors;
@@ -1050,18 +1049,16 @@ int btrfs_find_ordered_sum(struct inode *inode, u64 offset, u64 disk_bytenr,
1050 disk_bytenr < ordered_sum->bytenr + ordered_sum->len) { 1049 disk_bytenr < ordered_sum->bytenr + ordered_sum->len) {
1051 i = (disk_bytenr - ordered_sum->bytenr) >> 1050 i = (disk_bytenr - ordered_sum->bytenr) >>
1052 inode->i_sb->s_blocksize_bits; 1051 inode->i_sb->s_blocksize_bits;
1053 sector_sums = ordered_sum->sums + i;
1054 num_sectors = ordered_sum->len >> 1052 num_sectors = ordered_sum->len >>
1055 inode->i_sb->s_blocksize_bits; 1053 inode->i_sb->s_blocksize_bits;
1056 for (; i < num_sectors; i++) { 1054 num_sectors = min_t(int, len - index, num_sectors - i);
1057 if (sector_sums[i].bytenr == disk_bytenr) { 1055 memcpy(sum + index, ordered_sum->sums + i,
1058 sum[index] = sector_sums[i].sum; 1056 num_sectors);
1059 index++; 1057
1060 if (index == len) 1058 index += (int)num_sectors;
1061 goto out; 1059 if (index == len)
1062 disk_bytenr += sectorsize; 1060 goto out;
1063 } 1061 disk_bytenr += num_sectors * sectorsize;
1064 }
1065 } 1062 }
1066 } 1063 }
1067out: 1064out: