btrfs: zoned: enable zone append writing for direct IO
authorNaohiro Aota <naohiro.aota@wdc.com>
Thu, 4 Feb 2021 10:22:06 +0000 (19:22 +0900)
committerDavid Sterba <dsterba@suse.com>
Tue, 9 Feb 2021 01:46:06 +0000 (02:46 +0100)
Likewise to buffered IO, enable zone append writing for direct IO when
its used on a zoned block device.

Reviewed-by: Josef Bacik <josef@toxicpanda.com>
Signed-off-by: Naohiro Aota <naohiro.aota@wdc.com>
Reviewed-by: David Sterba <dsterba@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/inode.c

index 6dbab92..dd6fe8a 100644 (file)
@@ -7738,6 +7738,9 @@ static int btrfs_dio_iomap_begin(struct inode *inode, loff_t start,
        iomap->bdev = fs_info->fs_devices->latest_bdev;
        iomap->length = len;
 
+       if (write && btrfs_use_zone_append(BTRFS_I(inode), em))
+               iomap->flags |= IOMAP_F_ZONE_APPEND;
+
        free_extent_map(em);
 
        return 0;
@@ -7964,6 +7967,8 @@ static void btrfs_end_dio_bio(struct bio *bio)
        if (err)
                dip->dio_bio->bi_status = err;
 
+       btrfs_record_physical_zoned(dip->inode, dip->logical_offset, bio);
+
        bio_put(bio);
        btrfs_dio_private_put(dip);
 }
@@ -8124,6 +8129,19 @@ static blk_qc_t btrfs_submit_direct(struct inode *inode, struct iomap *iomap,
                bio->bi_end_io = btrfs_end_dio_bio;
                btrfs_io_bio(bio)->logical = file_offset;
 
+               WARN_ON_ONCE(write && btrfs_is_zoned(fs_info) &&
+                            fs_info->max_zone_append_size &&
+                            bio_op(bio) != REQ_OP_ZONE_APPEND);
+
+               if (bio_op(bio) == REQ_OP_ZONE_APPEND) {
+                       status = extract_ordered_extent(BTRFS_I(inode), bio,
+                                                       file_offset);
+                       if (status) {
+                               bio_put(bio);
+                               goto out_err;
+                       }
+               }
+
                ASSERT(submit_len >= clone_len);
                submit_len -= clone_len;