#include "xfs_icache.h"
#include "xfs_zone_alloc.h"
#include "xfs_rtgroup.h"
+#include <linux/bio-integrity.h>
struct xfs_writepage_ctx {
struct iomap_writepage_ctx ctx;
bio_endio(&ioend->io_bio);
return error;
}
+ if (wpc->iomap.flags & IOMAP_F_INTEGRITY)
+ fs_bio_integrity_generate(&ioend->io_bio);
xfs_zone_alloc_and_submit(ioend, &XFS_ZWPC(wpc)->open_zone);
return 0;
}
return iomap_bmap(mapping, block, &xfs_read_iomap_ops);
}
+static void
+xfs_bio_submit_read(
+ const struct iomap_iter *iter,
+ struct iomap_read_folio_ctx *ctx)
+{
+ struct bio *bio = ctx->read_ctx;
+
+ /* defer read completions to the ioend workqueue */
+ iomap_init_ioend(iter->inode, bio, ctx->read_ctx_file_offset, 0);
+ bio->bi_end_io = xfs_end_bio;
+ submit_bio(bio);
+}
+
+static const struct iomap_read_ops xfs_iomap_read_ops = {
+ .read_folio_range = iomap_bio_read_folio_range,
+ .submit_read = xfs_bio_submit_read,
+ .bio_set = &iomap_ioend_bioset,
+};
+
+static inline const struct iomap_read_ops *
+xfs_get_iomap_read_ops(
+ const struct address_space *mapping)
+{
+ struct xfs_inode *ip = XFS_I(mapping->host);
+
+ if (bdev_has_integrity_csum(xfs_inode_buftarg(ip)->bt_bdev))
+ return &xfs_iomap_read_ops;
+ return &iomap_bio_read_ops;
+}
+
STATIC int
xfs_vm_read_folio(
- struct file *unused,
- struct folio *folio)
+ struct file *file,
+ struct folio *folio)
{
- iomap_bio_read_folio(folio, &xfs_read_iomap_ops);
+ struct iomap_read_folio_ctx ctx = { .cur_folio = folio };
+
+ ctx.ops = xfs_get_iomap_read_ops(folio->mapping);
+ iomap_read_folio(&xfs_read_iomap_ops, &ctx, NULL);
return 0;
}
xfs_vm_readahead(
struct readahead_control *rac)
{
- iomap_bio_readahead(rac, &xfs_read_iomap_ops);
+ struct iomap_read_folio_ctx ctx = { .rac = rac };
+
+ ctx.ops = xfs_get_iomap_read_ops(rac->mapping),
+ iomap_readahead(&xfs_read_iomap_ops, &ctx, NULL);
}
static int
}
iomap->offset = XFS_FSB_TO_B(mp, imap->br_startoff);
iomap->length = XFS_FSB_TO_B(mp, imap->br_blockcount);
- if (mapping_flags & IOMAP_DAX)
+ iomap->flags = iomap_flags;
+ if (mapping_flags & IOMAP_DAX) {
iomap->dax_dev = target->bt_daxdev;
- else
+ } else {
iomap->bdev = target->bt_bdev;
- iomap->flags = iomap_flags;
+ if (bdev_has_integrity_csum(iomap->bdev))
+ iomap->flags |= IOMAP_F_INTEGRITY;
+ }
/*
* If the inode is dirty for datasync purposes, let iomap know so it