mirror of
https://github.com/torvalds/linux.git
synced 2026-04-18 06:44:00 -04:00
iomap: refactor the writeback interface
Replace ->map_blocks with a new ->writeback_range, which differs in the following ways: - it must also queue up the I/O for writeback, that is called into the slightly refactored and extended in scope iomap_add_to_ioend for each region - can handle only a part of the requested region, that is the retry loop for partial mappings moves to the caller - handles cleanup on failures as well, and thus also replaces the discard_folio method only implemented by XFS. This will allow to use the iomap writeback code also for file systems that are not block based like fuse. Co-developed-by: Joanne Koong <joannelkoong@gmail.com> Signed-off-by: Joanne Koong <joannelkoong@gmail.com> Signed-off-by: Christoph Hellwig <hch@lst.de> Link: https://lore.kernel.org/20250710133343.399917-5-hch@lst.de Acked-by: Damien Le Moal <dlemoal@kernel.org> # zonefs Reviewed-by: Brian Foster <bfoster@redhat.com> Reviewed-by: Darrick J. Wong <djwong@kernel.org> Signed-off-by: Christian Brauner <brauner@kernel.org>
This commit is contained in:
committed by
Christian Brauner
parent
40368a6acb
commit
fb7399cf2d
@@ -124,29 +124,33 @@ static void zonefs_readahead(struct readahead_control *rac)
|
||||
* Map blocks for page writeback. This is used only on conventional zone files,
|
||||
* which implies that the page range can only be within the fixed inode size.
|
||||
*/
|
||||
static int zonefs_write_map_blocks(struct iomap_writepage_ctx *wpc,
|
||||
struct inode *inode, loff_t offset,
|
||||
unsigned int len)
|
||||
static ssize_t zonefs_writeback_range(struct iomap_writepage_ctx *wpc,
|
||||
struct folio *folio, u64 offset, unsigned len, u64 end_pos)
|
||||
{
|
||||
struct zonefs_zone *z = zonefs_inode_zone(inode);
|
||||
struct zonefs_zone *z = zonefs_inode_zone(wpc->inode);
|
||||
|
||||
if (WARN_ON_ONCE(zonefs_zone_is_seq(z)))
|
||||
return -EIO;
|
||||
if (WARN_ON_ONCE(offset >= i_size_read(inode)))
|
||||
if (WARN_ON_ONCE(offset >= i_size_read(wpc->inode)))
|
||||
return -EIO;
|
||||
|
||||
/* If the mapping is already OK, nothing needs to be done */
|
||||
if (offset >= wpc->iomap.offset &&
|
||||
offset < wpc->iomap.offset + wpc->iomap.length)
|
||||
return 0;
|
||||
if (offset < wpc->iomap.offset ||
|
||||
offset >= wpc->iomap.offset + wpc->iomap.length) {
|
||||
int error;
|
||||
|
||||
return zonefs_write_iomap_begin(inode, offset,
|
||||
z->z_capacity - offset,
|
||||
IOMAP_WRITE, &wpc->iomap, NULL);
|
||||
error = zonefs_write_iomap_begin(wpc->inode, offset,
|
||||
z->z_capacity - offset, IOMAP_WRITE,
|
||||
&wpc->iomap, NULL);
|
||||
if (error)
|
||||
return error;
|
||||
}
|
||||
|
||||
return iomap_add_to_ioend(wpc, folio, offset, end_pos, len);
|
||||
}
|
||||
|
||||
static const struct iomap_writeback_ops zonefs_writeback_ops = {
|
||||
.map_blocks = zonefs_write_map_blocks,
|
||||
.writeback_range = zonefs_writeback_range,
|
||||
};
|
||||
|
||||
static int zonefs_writepages(struct address_space *mapping,
|
||||
|
||||
Reference in New Issue
Block a user