lkml.org 
[lkml]   [2016]   [Oct]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCHv4 41/43] ext4: make fallocate() operations work with huge pages
    Date
    __ext4_block_zero_page_range() adjusted to calculate starting iblock
    correctry for huge pages.

    ext4_{collapse,insert}_range() requires page cache invalidation. We need
    the invalidation to be aligning to huge page border if huge pages are
    possible in page cache.

    Signed-off-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
    ---
    fs/ext4/extents.c | 10 ++++++++--
    fs/ext4/inode.c | 3 +--
    2 files changed, 9 insertions(+), 4 deletions(-)

    diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c
    index c930a0110fb4..16a6bdeac36f 100644
    --- a/fs/ext4/extents.c
    +++ b/fs/ext4/extents.c
    @@ -5511,7 +5511,10 @@ int ext4_collapse_range(struct inode *inode, loff_t offset, loff_t len)
    * Need to round down offset to be aligned with page size boundary
    * for page size > block size.
    */
    - ioffset = round_down(offset, PAGE_SIZE);
    + if (IS_ENABLED(CONFIG_TRANSPARENT_HUGE_PAGECACHE))
    + ioffset = round_down(offset, HPAGE_PMD_SIZE);
    + else
    + ioffset = round_down(offset, PAGE_SIZE);
    /*
    * Write tail of the last page before removed range since it will get
    * removed from the page cache below.
    @@ -5660,7 +5663,10 @@ int ext4_insert_range(struct inode *inode, loff_t offset, loff_t len)
    * Need to round down to align start offset to page size boundary
    * for page size > block size.
    */
    - ioffset = round_down(offset, PAGE_SIZE);
    + if (IS_ENABLED(CONFIG_TRANSPARENT_HUGE_PAGECACHE))
    + ioffset = round_down(offset, HPAGE_PMD_SIZE);
    + else
    + ioffset = round_down(offset, PAGE_SIZE);
    /* Write out all dirty pages */
    ret = filemap_write_and_wait_range(inode->i_mapping, ioffset,
    LLONG_MAX);
    diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c
    index d179467f82e7..95b64a7cee67 100644
    --- a/fs/ext4/inode.c
    +++ b/fs/ext4/inode.c
    @@ -3716,7 +3716,6 @@ void ext4_set_aops(struct inode *inode)
    static int __ext4_block_zero_page_range(handle_t *handle,
    struct address_space *mapping, loff_t from, loff_t length)
    {
    - ext4_fsblk_t index = from >> PAGE_SHIFT;
    unsigned offset;
    unsigned blocksize, pos;
    ext4_lblk_t iblock;
    @@ -3735,7 +3734,7 @@ static int __ext4_block_zero_page_range(handle_t *handle,

    blocksize = inode->i_sb->s_blocksize;

    - iblock = index << (PAGE_SHIFT - inode->i_sb->s_blocksize_bits);
    + iblock = page->index << (PAGE_SHIFT - inode->i_sb->s_blocksize_bits);

    if (!page_has_buffers(page))
    create_empty_buffers(page, blocksize, 0);
    --
    2.9.3
    \
     
     \ /
      Last update: 2016-10-25 02:20    [W:3.695 / U:0.196 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site