Skip to content

Commit c6f18f9

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 2dbca5a commit c6f18f9

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

1528-
static void iomap_finish_folio_write(struct inode *inode, struct folio *folio,
1528+
void iomap_start_folio_write(struct inode *inode, struct folio *folio,
1529+
size_t len)
1530+
{
1531+
struct iomap_folio_state *ifs = folio->private;
1532+
1533+
WARN_ON_ONCE(i_blocks_per_folio(inode, folio) > 1 && !ifs);
1534+
if (ifs)
1535+
atomic_add(len, &ifs->write_bytes_pending);
1536+
}
1537+
EXPORT_SYMBOL_GPL(iomap_start_folio_write);
1538+
1539+
void iomap_finish_folio_write(struct inode *inode, struct folio *folio,
15291540
size_t len)
15301541
{
15311542
struct iomap_folio_state *ifs = folio->private;
@@ -1536,6 +1547,7 @@ static void iomap_finish_folio_write(struct inode *inode, struct folio *folio,
15361547
if (!ifs || atomic_sub_and_test(len, &ifs->write_bytes_pending))
15371548
folio_end_writeback(folio);
15381549
}
1550+
EXPORT_SYMBOL_GPL(iomap_finish_folio_write);
15391551

15401552
/*
15411553
* We're now finished for good with this ioend structure. Update the page
@@ -1658,7 +1670,6 @@ ssize_t iomap_add_to_ioend(struct iomap_writepage_ctx *wpc, struct folio *folio,
16581670
loff_t pos, loff_t end_pos, unsigned int dirty_len)
16591671
{
16601672
struct iomap_ioend *ioend = wpc->wb_ctx;
1661-
struct iomap_folio_state *ifs = folio->private;
16621673
size_t poff = offset_in_folio(folio, pos);
16631674
unsigned int ioend_flags = 0;
16641675
unsigned int map_len = min_t(u64, dirty_len,
@@ -1701,8 +1712,7 @@ ssize_t iomap_add_to_ioend(struct iomap_writepage_ctx *wpc, struct folio *folio,
17011712
if (!bio_add_folio(&ioend->io_bio, folio, map_len, poff))
17021713
goto new_ioend;
17031714

1704-
if (ifs)
1705-
atomic_add(map_len, &ifs->write_bytes_pending);
1715+
iomap_start_folio_write(wpc->inode, folio, map_len);
17061716

17071717
/*
17081718
* Clamp io_offset and io_size to the incore EOF so that ondisk
@@ -1875,7 +1885,7 @@ static int iomap_writepage_map(struct iomap_writepage_ctx *wpc,
18751885
* all blocks.
18761886
*/
18771887
WARN_ON_ONCE(atomic_read(&ifs->write_bytes_pending) != 0);
1878-
atomic_inc(&ifs->write_bytes_pending);
1888+
iomap_start_folio_write(inode, folio, 1);
18791889
}
18801890

18811891
/*

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)