iomap: Permit pages without an iop to enter writeback

Create an iop in the writeback path if one doesn't exist.  This allows us
to avoid creating the iop in some cases.  We'll initially do that for pages
with inline data, but it can be extended to pages which are entirely within
an extent.  It also allows for an iop to be removed from pages in the
future (eg page split).

Co-developed-by: Matthew Wilcox (Oracle) <willy@infradead.org>
Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
Signed-off-by: Andreas Gruenbacher <agruenba@redhat.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Darrick J. Wong <djwong@kernel.org>
Signed-off-by: Darrick J. Wong <djwong@kernel.org>
This commit is contained in:
Andreas Gruenbacher 2021-07-15 09:58:05 -07:00 committed by Darrick J. Wong
parent 49694d14ff
commit 8e1bcef8e1
1 changed files with 1 additions and 2 deletions

View File

@ -1304,14 +1304,13 @@ iomap_writepage_map(struct iomap_writepage_ctx *wpc,
struct writeback_control *wbc, struct inode *inode, struct writeback_control *wbc, struct inode *inode,
struct page *page, u64 end_offset) struct page *page, u64 end_offset)
{ {
struct iomap_page *iop = to_iomap_page(page); struct iomap_page *iop = iomap_page_create(inode, page);
struct iomap_ioend *ioend, *next; struct iomap_ioend *ioend, *next;
unsigned len = i_blocksize(inode); unsigned len = i_blocksize(inode);
u64 file_offset; /* file offset of page */ u64 file_offset; /* file offset of page */
int error = 0, count = 0, i; int error = 0, count = 0, i;
LIST_HEAD(submit_list); LIST_HEAD(submit_list);
WARN_ON_ONCE(i_blocks_per_page(inode, page) > 1 && !iop);
WARN_ON_ONCE(iop && atomic_read(&iop->write_bytes_pending) != 0); WARN_ON_ONCE(iop && atomic_read(&iop->write_bytes_pending) != 0);
/* /*