mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-12-21 11:44:01 +08:00
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: Christoph Hellwig <hch@lst.de> Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com> Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
This commit is contained in:
parent
3590c4d897
commit
d3b4043969
@ -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,
|
|||||||
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,
|
|||||||
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
|
||||||
|
Loading…
Reference in New Issue
Block a user