lkml.org 
[lkml]   [2020]   [Aug]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 05/11] iomap: Support THPs in iomap_adjust_read_range
    Date
    Pass the struct page instead of the iomap_page so we can determine the
    size of the page. Use offset_in_thp() instead of offset_in_page() and
    use thp_size() instead of PAGE_SIZE. Convert the arguments to be size_t
    instead of unsigned int, in case pages ever get larger than 2^31 bytes.

    Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
    ---
    fs/iomap/buffered-io.c | 23 ++++++++++++-----------
    1 file changed, 12 insertions(+), 11 deletions(-)

    diff --git a/fs/iomap/buffered-io.c b/fs/iomap/buffered-io.c
    index 2dba054095e8..5cc0343b6a8e 100644
    --- a/fs/iomap/buffered-io.c
    +++ b/fs/iomap/buffered-io.c
    @@ -76,16 +76,16 @@ iomap_page_release(struct page *page)
    /*
    * Calculate the range inside the page that we actually need to read.
    */
    -static void
    -iomap_adjust_read_range(struct inode *inode, struct iomap_page *iop,
    - loff_t *pos, loff_t length, unsigned *offp, unsigned *lenp)
    +static void iomap_adjust_read_range(struct inode *inode, struct page *page,
    + loff_t *pos, loff_t length, size_t *offp, size_t *lenp)
    {
    + struct iomap_page *iop = to_iomap_page(page);
    loff_t orig_pos = *pos;
    loff_t isize = i_size_read(inode);
    unsigned block_bits = inode->i_blkbits;
    unsigned block_size = (1 << block_bits);
    - unsigned poff = offset_in_page(*pos);
    - unsigned plen = min_t(loff_t, PAGE_SIZE - poff, length);
    + size_t poff = offset_in_thp(page, *pos);
    + size_t plen = min_t(loff_t, thp_size(page) - poff, length);
    unsigned first = poff >> block_bits;
    unsigned last = (poff + plen - 1) >> block_bits;

    @@ -123,7 +123,7 @@ iomap_adjust_read_range(struct inode *inode, struct iomap_page *iop,
    * page cache for blocks that are entirely outside of i_size.
    */
    if (orig_pos <= isize && orig_pos + length > isize) {
    - unsigned end = offset_in_page(isize - 1) >> block_bits;
    + unsigned end = offset_in_thp(page, isize - 1) >> block_bits;

    if (first <= end && last > end)
    plen -= (last - end) * block_size;
    @@ -234,7 +234,7 @@ iomap_readpage_actor(struct inode *inode, loff_t pos, loff_t length, void *data,
    struct iomap_page *iop = iomap_page_create(inode, page);
    bool same_page = false, is_contig = false;
    loff_t orig_pos = pos;
    - unsigned poff, plen;
    + size_t poff, plen;
    sector_t sector;

    if (iomap->type == IOMAP_INLINE) {
    @@ -244,7 +244,7 @@ iomap_readpage_actor(struct inode *inode, loff_t pos, loff_t length, void *data,
    }

    /* zero post-eof blocks as the page may be mapped */
    - iomap_adjust_read_range(inode, iop, &pos, length, &poff, &plen);
    + iomap_adjust_read_range(inode, page, &pos, length, &poff, &plen);
    if (plen == 0)
    goto done;

    @@ -550,18 +550,19 @@ static int
    __iomap_write_begin(struct inode *inode, loff_t pos, unsigned len, int flags,
    struct page *page, struct iomap *srcmap)
    {
    - struct iomap_page *iop = iomap_page_create(inode, page);
    loff_t block_size = i_blocksize(inode);
    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;
    + unsigned from = offset_in_page(pos), to = from + len;
    + size_t poff, plen;
    int status;

    if (PageUptodate(page))
    return 0;
    + iomap_page_create(inode, page);

    do {
    - iomap_adjust_read_range(inode, iop, &block_start,
    + iomap_adjust_read_range(inode, page, &block_start,
    block_end - block_start, &poff, &plen);
    if (plen == 0)
    break;
    --
    2.28.0
    \
     
     \ /
      Last update: 2020-08-24 17:25    [W:4.616 / U:0.080 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site