Skip to content

Commit 6b865d6

Browse files
Christoph Hellwigbrauner
authored andcommitted
iomap: only call mapping_set_error once for each failed bio
Instead of clling mapping_set_error once per folio, only do that once per bio, and consolidate all the writeback error handling code in iomap_finish_ioend. Signed-off-by: Christoph Hellwig <hch@lst.de> Link: https://lore.kernel.org/r/20231207072710.176093-11-hch@lst.de Reviewed-by: Darrick J. Wong <djwong@kernel.org> Signed-off-by: Christian Brauner <brauner@kernel.org>
1 parent ae5535e commit 6b865d6

File tree

1 file changed

+14
-13
lines changed

1 file changed

+14
-13
lines changed

fs/iomap/buffered-io.c

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1454,15 +1454,10 @@ vm_fault_t iomap_page_mkwrite(struct vm_fault *vmf, const struct iomap_ops *ops)
14541454
EXPORT_SYMBOL_GPL(iomap_page_mkwrite);
14551455

14561456
static void iomap_finish_folio_write(struct inode *inode, struct folio *folio,
1457-
size_t len, int error)
1457+
size_t len)
14581458
{
14591459
struct iomap_folio_state *ifs = folio->private;
14601460

1461-
if (error) {
1462-
folio_set_error(folio);
1463-
mapping_set_error(inode->i_mapping, error);
1464-
}
1465-
14661461
WARN_ON_ONCE(i_blocks_per_folio(inode, folio) > 1 && !ifs);
14671462
WARN_ON_ONCE(ifs && atomic_read(&ifs->write_bytes_pending) <= 0);
14681463

@@ -1483,18 +1478,24 @@ iomap_finish_ioend(struct iomap_ioend *ioend, int error)
14831478
struct folio_iter fi;
14841479
u32 folio_count = 0;
14851480

1481+
if (error) {
1482+
mapping_set_error(inode->i_mapping, error);
1483+
if (!bio_flagged(bio, BIO_QUIET)) {
1484+
pr_err_ratelimited(
1485+
"%s: writeback error on inode %lu, offset %lld, sector %llu",
1486+
inode->i_sb->s_id, inode->i_ino,
1487+
ioend->io_offset, ioend->io_sector);
1488+
}
1489+
}
1490+
14861491
/* walk all folios in bio, ending page IO on them */
14871492
bio_for_each_folio_all(fi, bio) {
1488-
iomap_finish_folio_write(inode, fi.folio, fi.length, error);
1493+
if (error)
1494+
folio_set_error(fi.folio);
1495+
iomap_finish_folio_write(inode, fi.folio, fi.length);
14891496
folio_count++;
14901497
}
14911498

1492-
if (unlikely(error && !bio_flagged(bio, BIO_QUIET))) {
1493-
printk_ratelimited(KERN_ERR
1494-
"%s: writeback error on inode %lu, offset %lld, sector %llu",
1495-
inode->i_sb->s_id, inode->i_ino,
1496-
ioend->io_offset, ioend->io_sector);
1497-
}
14981499
bio_put(bio); /* frees the ioend */
14991500
return folio_count;
15001501
}

0 commit comments

Comments
 (0)