diff mbox series

[05/19] iomap: move the zeroing case out of iomap_read_page_sync

Message ID 20190909182722.16783-6-hch@lst.de (mailing list archive)
State Superseded
Headers show
Series [01/19] iomap: better document the IOMAP_F_* flags | expand

Commit Message

Christoph Hellwig Sept. 9, 2019, 6:27 p.m. UTC
That keeps the function a little easier to understand, and easier to
modify for pending enhancements.

Signed-off-by: Christoph Hellwig <hch@lst.de>
---
 fs/iomap/buffered-io.c | 33 ++++++++++++++++-----------------
 1 file changed, 16 insertions(+), 17 deletions(-)

Comments

Darrick J. Wong Sept. 16, 2019, 6:17 p.m. UTC | #1
On Mon, Sep 09, 2019 at 08:27:08PM +0200, Christoph Hellwig wrote:
> That keeps the function a little easier to understand, and easier to
> modify for pending enhancements.
> 
> Signed-off-by: Christoph Hellwig <hch@lst.de>

Looks ok,
Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>

--D

> ---
>  fs/iomap/buffered-io.c | 33 ++++++++++++++++-----------------
>  1 file changed, 16 insertions(+), 17 deletions(-)
> 
> diff --git a/fs/iomap/buffered-io.c b/fs/iomap/buffered-io.c
> index 0b05551d9b5a..fe099faf540f 100644
> --- a/fs/iomap/buffered-io.c
> +++ b/fs/iomap/buffered-io.c
> @@ -547,19 +547,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);
> @@ -577,7 +570,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;
> @@ -588,17 +581,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
> -- 
> 2.20.1
>
diff mbox series

Patch

diff --git a/fs/iomap/buffered-io.c b/fs/iomap/buffered-io.c
index 0b05551d9b5a..fe099faf540f 100644
--- a/fs/iomap/buffered-io.c
+++ b/fs/iomap/buffered-io.c
@@ -547,19 +547,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);
@@ -577,7 +570,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;
@@ -588,17 +581,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