• Piotr Jaroszynski's avatar
    fs/iomap.c: get/put the page in iomap_page_create/release() · 61c6de66
    Piotr Jaroszynski authored
    migrate_page_move_mapping() expects pages with private data set to have
    a page_count elevated by 1.  This is what used to happen for xfs through
    the buffer_heads code before the switch to iomap in commit 82cb1417
    ("xfs: add support for sub-pagesize writeback without buffer_heads").
    Not having the count elevated causes move_pages() to fail on memory
    mapped files coming from xfs.
    Make iomap compatible with the migrate_page_move_mapping() assumption by
    elevating the page count as part of iomap_page_create() and lowering it
    in iomap_page_release().
    It causes the move_pages() syscall to misbehave on memory mapped files
    from xfs.  It does not not move any pages, which I suppose is "just" a
    perf issue, but it also ends up returning a positive number which is out
    of spec for the syscall.  Talking to Michal Hocko, it sounds like
    returning positive numbers might be a necessary update to move_pages()
    anyway though
    I only hit this in tests that verify that move_pages() actually moved
    the pages.  The test also got confused by the positive return from
    move_pages() (it got treated as a success as positive numbers were not
    expected and not handled) making it a bit harder to track down what's
    going on.
    Link: http://lkml.kernel.org/r/20181115184140.1388751-1-pjaroszynski@nvidia.com
    Fixes: 82cb1417
     ("xfs: add support for sub-pagesize writeback without buffer_heads")
    Signed-off-by: default avatarPiotr Jaroszynski <pjaroszynski@nvidia.com>
    Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
    Cc: William Kucharski <william.kucharski@oracle.com>
    Cc: Darrick J. Wong <darrick.wong@oracle.com>
    Cc: Brian Foster <bfoster@redhat.com>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
iomap.c 53.1 KB