iomap: move the zeroing case out of iomap_read_page_sync
authorChristoph Hellwig <hch@lst.de>
Fri, 18 Oct 2019 23:42:24 +0000 (16:42 -0700)
committerDarrick J. Wong <darrick.wong@oracle.com>
Mon, 21 Oct 2019 15:51:59 +0000 (08:51 -0700)
That keeps the function a little easier to understand, and easier to
modify for pending enhancements.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
fs/iomap/buffered-io.c

index 30df87a..7e9d7fd 100644 (file)
@@ -562,19 +562,12 @@ iomap_write_failed(struct inode *inode, loff_t pos, unsigned len)
 }
 
 static int
-iomap_read_page_sync(struct inode *inode, loff_t block_start, struct page *page,
-               unsigned poff, unsigned plen, unsigned from, unsigned to,
-               struct iomap *iomap)
+iomap_read_page_sync(loff_t block_start, struct page *page, unsigned poff,
+               unsigned plen, struct iomap *iomap)
 {
        struct bio_vec bvec;
        struct bio bio;
 
-       if (iomap_block_needs_zeroing(inode, iomap, block_start)) {
-               zero_user_segments(page, poff, from, to, poff + plen);
-               iomap_set_range_uptodate(page, poff, plen);
-               return 0;
-       }
-
        bio_init(&bio, &bvec, 1);
        bio.bi_opf = REQ_OP_READ;
        bio.bi_iter.bi_sector = iomap_sector(iomap, block_start);
@@ -592,7 +585,7 @@ __iomap_write_begin(struct inode *inode, loff_t pos, unsigned len,
        loff_t block_start = pos & ~(block_size - 1);
        loff_t block_end = (pos + len + block_size - 1) & ~(block_size - 1);
        unsigned from = offset_in_page(pos), to = from + len, poff, plen;
-       int status = 0;
+       int status;
 
        if (PageUptodate(page))
                return 0;
@@ -603,17 +596,23 @@ __iomap_write_begin(struct inode *inode, loff_t pos, unsigned len,
                if (plen == 0)
                        break;
 
-               if ((from > poff && from < poff + plen) ||
-                   (to > poff && to < poff + plen)) {
-                       status = iomap_read_page_sync(inode, block_start, page,
-                                       poff, plen, from, to, iomap);
-                       if (status)
-                               break;
+               if ((from <= poff || from >= poff + plen) &&
+                   (to <= poff || to >= poff + plen))
+                       continue;
+
+               if (iomap_block_needs_zeroing(inode, iomap, block_start)) {
+                       zero_user_segments(page, poff, from, to, poff + plen);
+                       iomap_set_range_uptodate(page, poff, plen);
+                       continue;
                }
 
+               status = iomap_read_page_sync(block_start, page, poff, plen,
+                               iomap);
+               if (status)
+                       return status;
        } while ((block_start += plen) < block_end);
 
-       return status;
+       return 0;
 }
 
 static int