Use LARGE_ZERO_PAGE instead of custom allocated 64k zero pages. The downside is we might end up using ZERO_PAGE on systems that do not enable LARGE_ZERO_PAGE feature. Signed-off-by: Pankaj Raghav <p.raghav@xxxxxxxxxxx> --- fs/iomap/direct-io.c | 31 +++++++++---------------------- 1 file changed, 9 insertions(+), 22 deletions(-) diff --git a/fs/iomap/direct-io.c b/fs/iomap/direct-io.c index 844261a31156..6a2b6726a156 100644 --- a/fs/iomap/direct-io.c +++ b/fs/iomap/direct-io.c @@ -29,13 +29,6 @@ #define IOMAP_DIO_WRITE (1U << 30) #define IOMAP_DIO_DIRTY (1U << 31) -/* - * Used for sub block zeroing in iomap_dio_zero() - */ -#define IOMAP_ZERO_PAGE_SIZE (SZ_64K) -#define IOMAP_ZERO_PAGE_ORDER (get_order(IOMAP_ZERO_PAGE_SIZE)) -static struct page *zero_page; - struct iomap_dio { struct kiocb *iocb; const struct iomap_dio_ops *dops; @@ -290,23 +283,29 @@ static int iomap_dio_zero(const struct iomap_iter *iter, struct iomap_dio *dio, { struct inode *inode = file_inode(dio->iocb->ki_filp); struct bio *bio; + int nr_vecs = max(1, i_blocksize(inode) / ZERO_LARGE_PAGE_SIZE); if (!len) return 0; /* * Max block size supported is 64k */ - if (WARN_ON_ONCE(len > IOMAP_ZERO_PAGE_SIZE)) + if (WARN_ON_ONCE(len > SZ_64K)) return -EINVAL; - bio = iomap_dio_alloc_bio(iter, dio, 1, REQ_OP_WRITE | REQ_SYNC | REQ_IDLE); + bio = iomap_dio_alloc_bio(iter, dio, nr_vecs, REQ_OP_WRITE | REQ_SYNC | REQ_IDLE); fscrypt_set_bio_crypt_ctx(bio, inode, pos >> inode->i_blkbits, GFP_KERNEL); bio->bi_iter.bi_sector = iomap_sector(&iter->iomap, pos); bio->bi_private = dio; bio->bi_end_io = iomap_dio_bio_end_io; - __bio_add_page(bio, zero_page, len, 0); + while (len) { + unsigned int io_len = min_t(unsigned int, len, ZERO_LARGE_PAGE_SIZE); + + __bio_add_page(bio, ZERO_LARGE_PAGE(0), len, 0); + len -= io_len; + } iomap_dio_submit_bio(iter, dio, bio, pos); return 0; } @@ -827,15 +826,3 @@ iomap_dio_rw(struct kiocb *iocb, struct iov_iter *iter, return iomap_dio_complete(dio); } EXPORT_SYMBOL_GPL(iomap_dio_rw); - -static int __init iomap_dio_init(void) -{ - zero_page = alloc_pages(GFP_KERNEL | __GFP_ZERO, - IOMAP_ZERO_PAGE_ORDER); - - if (!zero_page) - return -ENOMEM; - - return 0; -} -fs_initcall(iomap_dio_init); -- 2.47.2