Skip to content

Commit 8cecd0b

Browse files
goldwynrkdave
authored andcommitted
iomap: add a filesystem hook for direct I/O bio submission
This helps filesystems to perform tasks on the bio while submitting for I/O. This could be post-write operations such as data CRC or data replication for fs-handled RAID. Reviewed-by: Johannes Thumshirn <[email protected]> Reviewed-by: Nikolay Borisov <[email protected]> Reviewed-by: Christoph Hellwig <[email protected]> Reviewed-by: Darrick J. Wong <[email protected]> Signed-off-by: Goldwyn Rodrigues <[email protected]> Signed-off-by: David Sterba <[email protected]>
1 parent d85dc2e commit 8cecd0b

File tree

2 files changed

+12
-5
lines changed

2 files changed

+12
-5
lines changed

fs/iomap/direct-io.c

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -59,15 +59,20 @@ int iomap_dio_iopoll(struct kiocb *kiocb, bool spin)
5959
EXPORT_SYMBOL_GPL(iomap_dio_iopoll);
6060

6161
static void iomap_dio_submit_bio(struct iomap_dio *dio, struct iomap *iomap,
62-
struct bio *bio)
62+
struct bio *bio, loff_t pos)
6363
{
6464
atomic_inc(&dio->ref);
6565

6666
if (dio->iocb->ki_flags & IOCB_HIPRI)
6767
bio_set_polled(bio, dio->iocb);
6868

6969
dio->submit.last_queue = bdev_get_queue(iomap->bdev);
70-
dio->submit.cookie = submit_bio(bio);
70+
if (dio->dops && dio->dops->submit_io)
71+
dio->submit.cookie = dio->dops->submit_io(
72+
file_inode(dio->iocb->ki_filp),
73+
iomap, bio, pos);
74+
else
75+
dio->submit.cookie = submit_bio(bio);
7176
}
7277

7378
static ssize_t iomap_dio_complete(struct iomap_dio *dio)
@@ -191,7 +196,7 @@ iomap_dio_zero(struct iomap_dio *dio, struct iomap *iomap, loff_t pos,
191196
get_page(page);
192197
__bio_add_page(bio, page, len, 0);
193198
bio_set_op_attrs(bio, REQ_OP_WRITE, flags);
194-
iomap_dio_submit_bio(dio, iomap, bio);
199+
iomap_dio_submit_bio(dio, iomap, bio, pos);
195200
}
196201

197202
static loff_t
@@ -299,11 +304,11 @@ iomap_dio_bio_actor(struct inode *inode, loff_t pos, loff_t length,
299304
}
300305

301306
dio->size += n;
302-
pos += n;
303307
copied += n;
304308

305309
nr_pages = iov_iter_npages(dio->submit.iter, BIO_MAX_PAGES);
306-
iomap_dio_submit_bio(dio, iomap, bio);
310+
iomap_dio_submit_bio(dio, iomap, bio, pos);
311+
pos += n;
307312
} while (nr_pages);
308313

309314
/*

include/linux/iomap.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -252,6 +252,8 @@ int iomap_writepages(struct address_space *mapping,
252252
struct iomap_dio_ops {
253253
int (*end_io)(struct kiocb *iocb, ssize_t size, int error,
254254
unsigned flags);
255+
blk_qc_t (*submit_io)(struct inode *inode, struct iomap *iomap,
256+
struct bio *bio, loff_t file_offset);
255257
};
256258

257259
ssize_t iomap_dio_rw(struct kiocb *iocb, struct iov_iter *iter,

0 commit comments

Comments
 (0)