Commit d3b40439 authored by Christoph Hellwig's avatar Christoph Hellwig Committed by Darrick J. Wong

iomap: move the zeroing case out of iomap_read_page_sync

That keeps the function a little easier to understand, and easier to
modify for pending enhancements.
Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
Reviewed-by: default avatarDarrick J. Wong <darrick.wong@oracle.com>
Signed-off-by: default avatarDarrick J. Wong <darrick.wong@oracle.com>
parent 3590c4d8
...@@ -562,19 +562,12 @@ iomap_write_failed(struct inode *inode, loff_t pos, unsigned len) ...@@ -562,19 +562,12 @@ iomap_write_failed(struct inode *inode, loff_t pos, unsigned len)
} }
static int static int
iomap_read_page_sync(struct inode *inode, loff_t block_start, struct page *page, iomap_read_page_sync(loff_t block_start, struct page *page, unsigned poff,
unsigned poff, unsigned plen, unsigned from, unsigned to, unsigned plen, struct iomap *iomap)
struct iomap *iomap)
{ {
struct bio_vec bvec; struct bio_vec bvec;
struct bio bio; 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_init(&bio, &bvec, 1);
bio.bi_opf = REQ_OP_READ; bio.bi_opf = REQ_OP_READ;
bio.bi_iter.bi_sector = iomap_sector(iomap, block_start); 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, ...@@ -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_start = pos & ~(block_size - 1);
loff_t block_end = (pos + len + block_size - 1) & ~(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; unsigned from = offset_in_page(pos), to = from + len, poff, plen;
int status = 0; int status;
if (PageUptodate(page)) if (PageUptodate(page))
return 0; return 0;
...@@ -603,17 +596,23 @@ __iomap_write_begin(struct inode *inode, loff_t pos, unsigned len, ...@@ -603,17 +596,23 @@ __iomap_write_begin(struct inode *inode, loff_t pos, unsigned len,
if (plen == 0) if (plen == 0)
break; break;
if ((from > poff && from < poff + plen) || if ((from <= poff || from >= poff + plen) &&
(to > poff && to < poff + plen)) { (to <= poff || to >= poff + plen))
status = iomap_read_page_sync(inode, block_start, page, continue;
poff, plen, from, to, iomap);
if (status) if (iomap_block_needs_zeroing(inode, iomap, block_start)) {
break; 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); } while ((block_start += plen) < block_end);
return status; return 0;
} }
static int static int
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment