lkml.org 
[lkml]   [2021]   [Nov]   [8]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v2 24/28] iomap: Simplify iomap_do_writepage()
    Date
    Rename end_offset to end_pos and offset_into_page to poff to match the
    rest of the file. Simplify the handling of the last page straddling
    i_size by doing the EOF check based on the byte granularity i_size
    instead of converting to a pgoff prematurely.

    Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
    Reviewed-by: Christoph Hellwig <hch@lst.de>
    Reviewed-by: Darrick J. Wong <djwong@kernel.org>
    ---
    fs/iomap/buffered-io.c | 23 ++++++++++-------------
    1 file changed, 10 insertions(+), 13 deletions(-)

    diff --git a/fs/iomap/buffered-io.c b/fs/iomap/buffered-io.c
    index 87190b86ef1f..b168cc0fe8be 100644
    --- a/fs/iomap/buffered-io.c
    +++ b/fs/iomap/buffered-io.c
    @@ -1394,9 +1394,7 @@ iomap_do_writepage(struct page *page, struct writeback_control *wbc, void *data)
    {
    struct iomap_writepage_ctx *wpc = data;
    struct inode *inode = page->mapping->host;
    - pgoff_t end_index;
    - u64 end_offset;
    - loff_t offset;
    + u64 end_pos, isize;

    trace_iomap_writepage(inode, page_offset(page), PAGE_SIZE);

    @@ -1427,11 +1425,9 @@ iomap_do_writepage(struct page *page, struct writeback_control *wbc, void *data)
    * | desired writeback range | see else |
    * ---------------------------------^------------------|
    */
    - offset = i_size_read(inode);
    - end_index = offset >> PAGE_SHIFT;
    - if (page->index < end_index)
    - end_offset = (loff_t)(page->index + 1) << PAGE_SHIFT;
    - else {
    + isize = i_size_read(inode);
    + end_pos = page_offset(page) + PAGE_SIZE;
    + if (end_pos > isize) {
    /*
    * Check whether the page to write out is beyond or straddles
    * i_size or not.
    @@ -1443,7 +1439,8 @@ iomap_do_writepage(struct page *page, struct writeback_control *wbc, void *data)
    * | | Straddles |
    * ---------------------------------^-----------|--------|
    */
    - unsigned offset_into_page = offset & (PAGE_SIZE - 1);
    + size_t poff = offset_in_page(isize);
    + pgoff_t end_index = isize >> PAGE_SHIFT;

    /*
    * Skip the page if it's fully outside i_size, e.g. due to a
    @@ -1463,7 +1460,7 @@ iomap_do_writepage(struct page *page, struct writeback_control *wbc, void *data)
    * offset is just equal to the EOF.
    */
    if (page->index > end_index ||
    - (page->index == end_index && offset_into_page == 0))
    + (page->index == end_index && poff == 0))
    goto redirty;

    /*
    @@ -1474,13 +1471,13 @@ iomap_do_writepage(struct page *page, struct writeback_control *wbc, void *data)
    * memory is zeroed when mapped, and writes to that region are
    * not written out to the file."
    */
    - zero_user_segment(page, offset_into_page, PAGE_SIZE);
    + zero_user_segment(page, poff, PAGE_SIZE);

    /* Adjust the end_offset to the end of file */
    - end_offset = offset;
    + end_pos = isize;
    }

    - return iomap_writepage_map(wpc, wbc, inode, page, end_offset);
    + return iomap_writepage_map(wpc, wbc, inode, page, end_pos);

    redirty:
    redirty_page_for_writepage(wbc, page);
    --
    2.33.0
    \
     
     \ /
      Last update: 2021-11-08 06:07    [W:5.197 / U:0.052 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site