Add an iomap_folio_done() helper to encapsulate unlocking the folio,
calling ->page_done(), and putting the folio.  This doesn't change the
functionality.

Signed-off-by: Andreas Gruenbacher <agrue...@redhat.com>
---
 fs/iomap/buffered-io.c | 28 +++++++++++++++++-----------
 1 file changed, 17 insertions(+), 11 deletions(-)

diff --git a/fs/iomap/buffered-io.c b/fs/iomap/buffered-io.c
index 347010c6a652..8ce9abb29d46 100644
--- a/fs/iomap/buffered-io.c
+++ b/fs/iomap/buffered-io.c
@@ -575,6 +575,19 @@ static int __iomap_write_begin(const struct iomap_iter 
*iter, loff_t pos,
        return 0;
 }
 
+static void iomap_folio_done(struct iomap_iter *iter, loff_t pos, size_t ret,
+               struct folio *folio)
+{
+       const struct iomap_page_ops *page_ops = iter->iomap.page_ops;
+
+       if (folio)
+               folio_unlock(folio);
+       if (page_ops && page_ops->page_done)
+               page_ops->page_done(iter->inode, pos, ret, &folio->page);
+       if (folio)
+               folio_put(folio);
+}
+
 static int iomap_write_begin_inline(const struct iomap_iter *iter,
                struct folio *folio)
 {
@@ -616,7 +629,8 @@ static int iomap_write_begin(struct iomap_iter *iter, 
loff_t pos,
                        fgp, mapping_gfp_mask(iter->inode->i_mapping));
        if (!folio) {
                status = (iter->flags & IOMAP_NOWAIT) ? -EAGAIN : -ENOMEM;
-               goto out_no_page;
+               iomap_folio_done(iter, pos, 0, NULL);
+               return status;
        }
 
        /*
@@ -656,13 +670,9 @@ static int iomap_write_begin(struct iomap_iter *iter, 
loff_t pos,
        return 0;
 
 out_unlock:
-       folio_unlock(folio);
-       folio_put(folio);
+       iomap_folio_done(iter, pos, 0, folio);
        iomap_write_failed(iter->inode, pos, len);
 
-out_no_page:
-       if (page_ops && page_ops->page_done)
-               page_ops->page_done(iter->inode, pos, 0, NULL);
        return status;
 }
 
@@ -712,7 +722,6 @@ static size_t iomap_write_end_inline(const struct 
iomap_iter *iter,
 static size_t iomap_write_end(struct iomap_iter *iter, loff_t pos, size_t len,
                size_t copied, struct folio *folio)
 {
-       const struct iomap_page_ops *page_ops = iter->iomap.page_ops;
        const struct iomap *srcmap = iomap_iter_srcmap(iter);
        loff_t old_size = iter->inode->i_size;
        size_t ret;
@@ -736,11 +745,8 @@ static size_t iomap_write_end(struct iomap_iter *iter, 
loff_t pos, size_t len,
                iter->iomap.flags |= IOMAP_F_SIZE_CHANGED;
                folio_may_straddle_isize(iter->inode, folio, old_size, pos);
        }
-       folio_unlock(folio);
 
-       if (page_ops && page_ops->page_done)
-               page_ops->page_done(iter->inode, pos, ret, &folio->page);
-       folio_put(folio);
+       iomap_folio_done(iter, pos, ret, folio);
 
        if (ret < len)
                iomap_write_failed(iter->inode, pos + ret, len - ret);
-- 
2.38.1

Reply via email to