]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - fs/btrfs/file-item.c
Merge tag 'block-5.6-2020-02-05' of git://git.kernel.dk/linux-block
[linux.git] / fs / btrfs / file-item.c
index b1bfdc5c1387aeaf2a449d702698da14206e3b72..c2f365662d55045cc530fd81f99a2018c6f87f84 100644 (file)
@@ -148,8 +148,19 @@ int btrfs_lookup_file_extent(struct btrfs_trans_handle *trans,
        return ret;
 }
 
-static blk_status_t __btrfs_lookup_bio_sums(struct inode *inode, struct bio *bio,
-                                  u64 logical_offset, u8 *dst, int dio)
+/**
+ * btrfs_lookup_bio_sums - Look up checksums for a bio.
+ * @inode: inode that the bio is for.
+ * @bio: bio embedded in btrfs_io_bio.
+ * @offset: Unless (u64)-1, look up checksums for this offset in the file.
+ *          If (u64)-1, use the page offsets from the bio instead.
+ * @dst: Buffer of size btrfs_super_csum_size() used to return checksum. If
+ *       NULL, the checksum is returned in btrfs_io_bio(bio)->csum instead.
+ *
+ * Return: BLK_STS_RESOURCE if allocating memory fails, BLK_STS_OK otherwise.
+ */
+blk_status_t btrfs_lookup_bio_sums(struct inode *inode, struct bio *bio,
+                                  u64 offset, u8 *dst)
 {
        struct btrfs_fs_info *fs_info = btrfs_sb(inode->i_sb);
        struct bio_vec bvec;
@@ -158,8 +169,8 @@ static blk_status_t __btrfs_lookup_bio_sums(struct inode *inode, struct bio *bio
        struct btrfs_csum_item *item = NULL;
        struct extent_io_tree *io_tree = &BTRFS_I(inode)->io_tree;
        struct btrfs_path *path;
+       const bool page_offsets = (offset == (u64)-1);
        u8 *csum;
-       u64 offset = 0;
        u64 item_start_offset = 0;
        u64 item_last_offset = 0;
        u64 disk_bytenr;
@@ -205,15 +216,13 @@ static blk_status_t __btrfs_lookup_bio_sums(struct inode *inode, struct bio *bio
        }
 
        disk_bytenr = (u64)bio->bi_iter.bi_sector << 9;
-       if (dio)
-               offset = logical_offset;
 
        bio_for_each_segment(bvec, bio, iter) {
                page_bytes_left = bvec.bv_len;
                if (count)
                        goto next;
 
-               if (!dio)
+               if (page_offsets)
                        offset = page_offset(bvec.bv_page) + bvec.bv_offset;
                count = btrfs_find_ordered_sum(inode, offset, disk_bytenr,
                                               csum, nblocks);
@@ -274,7 +283,8 @@ static blk_status_t __btrfs_lookup_bio_sums(struct inode *inode, struct bio *bio
                csum += count * csum_size;
                nblocks -= count;
 next:
-               while (count--) {
+               while (count > 0) {
+                       count--;
                        disk_bytenr += fs_info->sectorsize;
                        offset += fs_info->sectorsize;
                        page_bytes_left -= fs_info->sectorsize;
@@ -285,18 +295,7 @@ static blk_status_t __btrfs_lookup_bio_sums(struct inode *inode, struct bio *bio
 
        WARN_ON_ONCE(count);
        btrfs_free_path(path);
-       return 0;
-}
-
-blk_status_t btrfs_lookup_bio_sums(struct inode *inode, struct bio *bio,
-                                  u8 *dst)
-{
-       return __btrfs_lookup_bio_sums(inode, bio, 0, dst, 0);
-}
-
-blk_status_t btrfs_lookup_bio_sums_dio(struct inode *inode, struct bio *bio, u64 offset)
-{
-       return __btrfs_lookup_bio_sums(inode, bio, offset, NULL, 1);
+       return BLK_STS_OK;
 }
 
 int btrfs_lookup_csums_range(struct btrfs_root *root, u64 start, u64 end,
@@ -483,8 +482,8 @@ blk_status_t btrfs_csum_one_bio(struct inode *inode, struct bio *bio,
                                                 - 1);
 
                for (i = 0; i < nr_sectors; i++) {
-                       if (offset >= ordered->file_offset + ordered->len ||
-                               offset < ordered->file_offset) {
+                       if (offset >= ordered->file_offset + ordered->num_bytes ||
+                           offset < ordered->file_offset) {
                                unsigned long bytes_left;
 
                                sums->len = this_sum_bytes;