Skip to content

Commit 94bce81

Browse files
joannekoongkawasaki
authored andcommitted
iomap: add public helpers for uptodate state manipulation
Add a new iomap_start_folio_write helper to abstract away the write_bytes_pending handling, and export it and the existing iomap_finish_folio_write for non-iomap writeback in fuse. Signed-off-by: Joanne Koong <[email protected]> [hch: split from a larger patch] Signed-off-by: Christoph Hellwig <[email protected]> Reviewed-by: Brian Foster <[email protected]> Reviewed-by: "Darrick J. Wong" <[email protected]>
1 parent 81cf931 commit 94bce81

2 files changed

Lines changed: 20 additions & 5 deletions

File tree

fs/iomap/buffered-io.c

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1530,7 +1530,18 @@ vm_fault_t iomap_page_mkwrite(struct vm_fault *vmf, const struct iomap_ops *ops,
15301530
}
15311531
EXPORT_SYMBOL_GPL(iomap_page_mkwrite);
15321532

1533-
static void iomap_finish_folio_write(struct inode *inode, struct folio *folio,
1533+
void iomap_start_folio_write(struct inode *inode, struct folio *folio,
1534+
size_t len)
1535+
{
1536+
struct iomap_folio_state *ifs = folio->private;
1537+
1538+
WARN_ON_ONCE(i_blocks_per_folio(inode, folio) > 1 && !ifs);
1539+
if (ifs)
1540+
atomic_add(len, &ifs->write_bytes_pending);
1541+
}
1542+
EXPORT_SYMBOL_GPL(iomap_start_folio_write);
1543+
1544+
void iomap_finish_folio_write(struct inode *inode, struct folio *folio,
15341545
size_t len)
15351546
{
15361547
struct iomap_folio_state *ifs = folio->private;
@@ -1541,6 +1552,7 @@ static void iomap_finish_folio_write(struct inode *inode, struct folio *folio,
15411552
if (!ifs || atomic_sub_and_test(len, &ifs->write_bytes_pending))
15421553
folio_end_writeback(folio);
15431554
}
1555+
EXPORT_SYMBOL_GPL(iomap_finish_folio_write);
15441556

15451557
/*
15461558
* We're now finished for good with this ioend structure. Update the page
@@ -1663,7 +1675,6 @@ ssize_t iomap_add_to_ioend(struct iomap_writepage_ctx *wpc, struct folio *folio,
16631675
loff_t pos, loff_t end_pos, unsigned int dirty_len)
16641676
{
16651677
struct iomap_ioend *ioend = wpc->wb_ctx;
1666-
struct iomap_folio_state *ifs = folio->private;
16671678
size_t poff = offset_in_folio(folio, pos);
16681679
unsigned int ioend_flags = 0;
16691680
unsigned int map_len = min_t(u64, dirty_len,
@@ -1706,8 +1717,7 @@ ssize_t iomap_add_to_ioend(struct iomap_writepage_ctx *wpc, struct folio *folio,
17061717
if (!bio_add_folio(&ioend->io_bio, folio, map_len, poff))
17071718
goto new_ioend;
17081719

1709-
if (ifs)
1710-
atomic_add(map_len, &ifs->write_bytes_pending);
1720+
iomap_start_folio_write(wpc->inode, folio, map_len);
17111721

17121722
/*
17131723
* Clamp io_offset and io_size to the incore EOF so that ondisk
@@ -1880,7 +1890,7 @@ static int iomap_writepage_map(struct iomap_writepage_ctx *wpc,
18801890
* all blocks.
18811891
*/
18821892
WARN_ON_ONCE(atomic_read(&ifs->write_bytes_pending) != 0);
1883-
atomic_inc(&ifs->write_bytes_pending);
1893+
iomap_start_folio_write(inode, folio, 1);
18841894
}
18851895

18861896
/*

include/linux/iomap.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -461,6 +461,11 @@ ssize_t iomap_add_to_ioend(struct iomap_writepage_ctx *wpc, struct folio *folio,
461461
loff_t pos, loff_t end_pos, unsigned int dirty_len);
462462
int iomap_ioend_writeback_submit(struct iomap_writepage_ctx *wpc, int error);
463463

464+
void iomap_start_folio_write(struct inode *inode, struct folio *folio,
465+
size_t len);
466+
void iomap_finish_folio_write(struct inode *inode, struct folio *folio,
467+
size_t len);
468+
464469
int iomap_writepages(struct iomap_writepage_ctx *wpc);
465470

466471
/*

0 commit comments

Comments
 (0)