Merge tag 'x86_microcode_for_v6.5' of git://git.kernel.org/pub/scm/linux/kernel/git...
[linux-block.git] / fs / btrfs / file-item.c
index d1cd0a692f8efb8fe4f475874536d12235c04527..696bf695d8eb0018f0074388eeab7eb28f4040de 100644 (file)
@@ -94,8 +94,8 @@ int btrfs_inode_set_file_extent_range(struct btrfs_inode *inode, u64 start,
 
        if (btrfs_fs_incompat(inode->root->fs_info, NO_HOLES))
                return 0;
-       return set_extent_bits(&inode->file_extent_tree, start, start + len - 1,
-                              EXTENT_DIRTY);
+       return set_extent_bit(&inode->file_extent_tree, start, start + len - 1,
+                             EXTENT_DIRTY, NULL);
 }
 
 /*
@@ -438,9 +438,9 @@ blk_status_t btrfs_lookup_bio_sums(struct btrfs_bio *bbio)
                            BTRFS_DATA_RELOC_TREE_OBJECTID) {
                                u64 file_offset = bbio->file_offset + bio_offset;
 
-                               set_extent_bits(&inode->io_tree, file_offset,
-                                               file_offset + sectorsize - 1,
-                                               EXTENT_NODATASUM);
+                               set_extent_bit(&inode->io_tree, file_offset,
+                                              file_offset + sectorsize - 1,
+                                              EXTENT_NODATASUM, NULL);
                        } else {
                                btrfs_warn_rl(fs_info,
                        "csum hole found for disk bytenr range [%llu, %llu)",
@@ -560,8 +560,8 @@ int btrfs_lookup_csums_list(struct btrfs_root *root, u64 start, u64 end,
                                goto fail;
                        }
 
-                       sums->bytenr = start;
-                       sums->len = (int)size;
+                       sums->logical = start;
+                       sums->len = size;
 
                        offset = bytes_to_csum_size(fs_info, start - key.offset);
 
@@ -721,20 +721,17 @@ fail:
  */
 blk_status_t btrfs_csum_one_bio(struct btrfs_bio *bbio)
 {
+       struct btrfs_ordered_extent *ordered = bbio->ordered;
        struct btrfs_inode *inode = bbio->inode;
        struct btrfs_fs_info *fs_info = inode->root->fs_info;
        SHASH_DESC_ON_STACK(shash, fs_info->csum_shash);
        struct bio *bio = &bbio->bio;
-       u64 offset = bbio->file_offset;
        struct btrfs_ordered_sum *sums;
-       struct btrfs_ordered_extent *ordered = NULL;
        char *data;
        struct bvec_iter iter;
        struct bio_vec bvec;
        int index;
        unsigned int blockcount;
-       unsigned long total_bytes = 0;
-       unsigned long this_sum_bytes = 0;
        int i;
        unsigned nofs_flag;
 
@@ -749,61 +746,17 @@ blk_status_t btrfs_csum_one_bio(struct btrfs_bio *bbio)
        sums->len = bio->bi_iter.bi_size;
        INIT_LIST_HEAD(&sums->list);
 
-       sums->bytenr = bio->bi_iter.bi_sector << 9;
+       sums->logical = bio->bi_iter.bi_sector << SECTOR_SHIFT;
        index = 0;
 
        shash->tfm = fs_info->csum_shash;
 
        bio_for_each_segment(bvec, bio, iter) {
-               if (!ordered) {
-                       ordered = btrfs_lookup_ordered_extent(inode, offset);
-                       /*
-                        * The bio range is not covered by any ordered extent,
-                        * must be a code logic error.
-                        */
-                       if (unlikely(!ordered)) {
-                               WARN(1, KERN_WARNING
-                       "no ordered extent for root %llu ino %llu offset %llu\n",
-                                    inode->root->root_key.objectid,
-                                    btrfs_ino(inode), offset);
-                               kvfree(sums);
-                               return BLK_STS_IOERR;
-                       }
-               }
-
                blockcount = BTRFS_BYTES_TO_BLKS(fs_info,
                                                 bvec.bv_len + fs_info->sectorsize
                                                 - 1);
 
                for (i = 0; i < blockcount; i++) {
-                       if (!(bio->bi_opf & REQ_BTRFS_ONE_ORDERED) &&
-                           !in_range(offset, ordered->file_offset,
-                                     ordered->num_bytes)) {
-                               unsigned long bytes_left;
-
-                               sums->len = this_sum_bytes;
-                               this_sum_bytes = 0;
-                               btrfs_add_ordered_sum(ordered, sums);
-                               btrfs_put_ordered_extent(ordered);
-
-                               bytes_left = bio->bi_iter.bi_size - total_bytes;
-
-                               nofs_flag = memalloc_nofs_save();
-                               sums = kvzalloc(btrfs_ordered_sum_size(fs_info,
-                                                     bytes_left), GFP_KERNEL);
-                               memalloc_nofs_restore(nofs_flag);
-                               if (!sums)
-                                       return BLK_STS_RESOURCE;
-
-                               sums->len = bytes_left;
-                               ordered = btrfs_lookup_ordered_extent(inode,
-                                                               offset);
-                               ASSERT(ordered); /* Logic error */
-                               sums->bytenr = (bio->bi_iter.bi_sector << 9)
-                                       + total_bytes;
-                               index = 0;
-                       }
-
                        data = bvec_kmap_local(&bvec);
                        crypto_shash_digest(shash,
                                            data + (i * fs_info->sectorsize),
@@ -811,15 +764,28 @@ blk_status_t btrfs_csum_one_bio(struct btrfs_bio *bbio)
                                            sums->sums + index);
                        kunmap_local(data);
                        index += fs_info->csum_size;
-                       offset += fs_info->sectorsize;
-                       this_sum_bytes += fs_info->sectorsize;
-                       total_bytes += fs_info->sectorsize;
                }
 
        }
-       this_sum_bytes = 0;
+
+       bbio->sums = sums;
        btrfs_add_ordered_sum(ordered, sums);
-       btrfs_put_ordered_extent(ordered);
+       return 0;
+}
+
+/*
+ * Nodatasum I/O on zoned file systems still requires an btrfs_ordered_sum to
+ * record the updated logical address on Zone Append completion.
+ * Allocate just the structure with an empty sums array here for that case.
+ */
+blk_status_t btrfs_alloc_dummy_sum(struct btrfs_bio *bbio)
+{
+       bbio->sums = kmalloc(sizeof(*bbio->sums), GFP_NOFS);
+       if (!bbio->sums)
+               return BLK_STS_RESOURCE;
+       bbio->sums->len = bbio->bio.bi_iter.bi_size;
+       bbio->sums->logical = bbio->bio.bi_iter.bi_sector << SECTOR_SHIFT;
+       btrfs_add_ordered_sum(bbio->ordered, bbio->sums);
        return 0;
 }
 
@@ -1086,7 +1052,7 @@ int btrfs_csum_file_blocks(struct btrfs_trans_handle *trans,
 again:
        next_offset = (u64)-1;
        found_next = 0;
-       bytenr = sums->bytenr + total_bytes;
+       bytenr = sums->logical + total_bytes;
        file_key.objectid = BTRFS_EXTENT_CSUM_OBJECTID;
        file_key.offset = bytenr;
        file_key.type = BTRFS_EXTENT_CSUM_KEY;