Skip to content

Commit 2f87fc4

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 301363b commit 2f87fc4

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
@@ -1527,7 +1527,18 @@ vm_fault_t iomap_page_mkwrite(struct vm_fault *vmf, const struct iomap_ops *ops,
15271527
}
15281528
EXPORT_SYMBOL_GPL(iomap_page_mkwrite);
15291529

1530-
static void iomap_finish_folio_write(struct inode *inode, struct folio *folio,
1530+
void iomap_start_folio_write(struct inode *inode, struct folio *folio,
1531+
size_t len)
1532+
{
1533+
struct iomap_folio_state *ifs = folio->private;
1534+
1535+
WARN_ON_ONCE(i_blocks_per_folio(inode, folio) > 1 && !ifs);
1536+
if (ifs)
1537+
atomic_add(len, &ifs->write_bytes_pending);
1538+
}
1539+
EXPORT_SYMBOL_GPL(iomap_start_folio_write);
1540+
1541+
void iomap_finish_folio_write(struct inode *inode, struct folio *folio,
15311542
size_t len)
15321543
{
15331544
struct iomap_folio_state *ifs = folio->private;
@@ -1538,6 +1549,7 @@ static void iomap_finish_folio_write(struct inode *inode, struct folio *folio,
15381549
if (!ifs || atomic_sub_and_test(len, &ifs->write_bytes_pending))
15391550
folio_end_writeback(folio);
15401551
}
1552+
EXPORT_SYMBOL_GPL(iomap_finish_folio_write);
15411553

15421554
/*
15431555
* We're now finished for good with this ioend structure. Update the page
@@ -1660,7 +1672,6 @@ ssize_t iomap_add_to_ioend(struct iomap_writepage_ctx *wpc, struct folio *folio,
16601672
loff_t pos, loff_t end_pos, unsigned int dirty_len)
16611673
{
16621674
struct iomap_ioend *ioend = wpc->wb_ctx;
1663-
struct iomap_folio_state *ifs = folio->private;
16641675
size_t poff = offset_in_folio(folio, pos);
16651676
unsigned int ioend_flags = 0;
16661677
unsigned int map_len = min_t(u64, dirty_len,
@@ -1703,8 +1714,7 @@ ssize_t iomap_add_to_ioend(struct iomap_writepage_ctx *wpc, struct folio *folio,
17031714
if (!bio_add_folio(&ioend->io_bio, folio, map_len, poff))
17041715
goto new_ioend;
17051716

1706-
if (ifs)
1707-
atomic_add(map_len, &ifs->write_bytes_pending);
1717+
iomap_start_folio_write(wpc->inode, folio, map_len);
17081718

17091719
/*
17101720
* Clamp io_offset and io_size to the incore EOF so that ondisk
@@ -1877,7 +1887,7 @@ static int iomap_writepage_map(struct iomap_writepage_ctx *wpc,
18771887
* all blocks.
18781888
*/
18791889
WARN_ON_ONCE(atomic_read(&ifs->write_bytes_pending) != 0);
1880-
atomic_inc(&ifs->write_bytes_pending);
1890+
iomap_start_folio_write(inode, folio, 1);
18811891
}
18821892

18831893
/*

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)