diff options
Diffstat (limited to 'fs/btrfs/ordered-data.c')
-rw-r--r-- | fs/btrfs/ordered-data.c | 28 |
1 files changed, 17 insertions, 11 deletions
diff --git a/fs/btrfs/ordered-data.c b/fs/btrfs/ordered-data.c index 005c45db699e..1ddd728541ee 100644 --- a/fs/btrfs/ordered-data.c +++ b/fs/btrfs/ordered-data.c | |||
@@ -986,7 +986,7 @@ out: | |||
986 | * be reclaimed before their checksum is actually put into the btree | 986 | * be reclaimed before their checksum is actually put into the btree |
987 | */ | 987 | */ |
988 | int btrfs_find_ordered_sum(struct inode *inode, u64 offset, u64 disk_bytenr, | 988 | int btrfs_find_ordered_sum(struct inode *inode, u64 offset, u64 disk_bytenr, |
989 | u32 *sum) | 989 | u32 *sum, int len) |
990 | { | 990 | { |
991 | struct btrfs_ordered_sum *ordered_sum; | 991 | struct btrfs_ordered_sum *ordered_sum; |
992 | struct btrfs_sector_sum *sector_sums; | 992 | struct btrfs_sector_sum *sector_sums; |
@@ -995,22 +995,28 @@ int btrfs_find_ordered_sum(struct inode *inode, u64 offset, u64 disk_bytenr, | |||
995 | unsigned long num_sectors; | 995 | unsigned long num_sectors; |
996 | unsigned long i; | 996 | unsigned long i; |
997 | u32 sectorsize = BTRFS_I(inode)->root->sectorsize; | 997 | u32 sectorsize = BTRFS_I(inode)->root->sectorsize; |
998 | int ret = 1; | 998 | int index = 0; |
999 | 999 | ||
1000 | ordered = btrfs_lookup_ordered_extent(inode, offset); | 1000 | ordered = btrfs_lookup_ordered_extent(inode, offset); |
1001 | if (!ordered) | 1001 | if (!ordered) |
1002 | return 1; | 1002 | return 0; |
1003 | 1003 | ||
1004 | spin_lock_irq(&tree->lock); | 1004 | spin_lock_irq(&tree->lock); |
1005 | list_for_each_entry_reverse(ordered_sum, &ordered->list, list) { | 1005 | list_for_each_entry_reverse(ordered_sum, &ordered->list, list) { |
1006 | if (disk_bytenr >= ordered_sum->bytenr) { | 1006 | if (disk_bytenr >= ordered_sum->bytenr && |
1007 | num_sectors = ordered_sum->len / sectorsize; | 1007 | disk_bytenr < ordered_sum->bytenr + ordered_sum->len) { |
1008 | sector_sums = ordered_sum->sums; | 1008 | i = (disk_bytenr - ordered_sum->bytenr) >> |
1009 | for (i = 0; i < num_sectors; i++) { | 1009 | inode->i_sb->s_blocksize_bits; |
1010 | sector_sums = ordered_sum->sums + i; | ||
1011 | num_sectors = ordered_sum->len >> | ||
1012 | inode->i_sb->s_blocksize_bits; | ||
1013 | for (; i < num_sectors; i++) { | ||
1010 | if (sector_sums[i].bytenr == disk_bytenr) { | 1014 | if (sector_sums[i].bytenr == disk_bytenr) { |
1011 | *sum = sector_sums[i].sum; | 1015 | sum[index] = sector_sums[i].sum; |
1012 | ret = 0; | 1016 | index++; |
1013 | goto out; | 1017 | if (index == len) |
1018 | goto out; | ||
1019 | disk_bytenr += sectorsize; | ||
1014 | } | 1020 | } |
1015 | } | 1021 | } |
1016 | } | 1022 | } |
@@ -1018,7 +1024,7 @@ int btrfs_find_ordered_sum(struct inode *inode, u64 offset, u64 disk_bytenr, | |||
1018 | out: | 1024 | out: |
1019 | spin_unlock_irq(&tree->lock); | 1025 | spin_unlock_irq(&tree->lock); |
1020 | btrfs_put_ordered_extent(ordered); | 1026 | btrfs_put_ordered_extent(ordered); |
1021 | return ret; | 1027 | return index; |
1022 | } | 1028 | } |
1023 | 1029 | ||
1024 | 1030 | ||