• Matthew Wilcox (Oracle)'s avatar
    block: Remove special-casing of compound pages · 1b151e24
    Matthew Wilcox (Oracle) authored
    The special casing was originally added in pre-git history; reproducing
    the commit log here:
    
    > commit a318a92567d77
    > Author: Andrew Morton <akpm@osdl.org>
    > Date:   Sun Sep 21 01:42:22 2003 -0700
    >
    >     [PATCH] Speed up direct-io hugetlbpage handling
    >
    >     This patch short-circuits all the direct-io page dirtying logic for
    >     higher-order pages.  Without this, we pointlessly bounce BIOs up to
    >     keventd all the time.
    
    In the last twenty years, compound pages have become used for more than
    just hugetlb.  Rewrite these functions to operate on folios instead
    of pages and remove the special case for hugetlbfs; I don't think
    it's needed any more (and if it is, we can put it back in as a call
    to folio_test_hugetlb()).
    
    This was found by inspection; as far as I can tell, this bug can lead
    to pages used as the destination of a direct I/O read not being marked
    as dirty.  If those pages are then reclaimed by the MM without being
    dirtied for some other reason, they won't be written out.  Then when
    they're faulted back in, they will not contain the data they should.
    It'll take a pretty unusual setup to produce this problem with several
    races all going the wrong way.
    
    This problem predates the folio work; it could for example have been
    triggered by mmaping a THP in tmpfs and using that as the target of an
    O_DIRECT read.
    
    Fixes: 800d8c63
    
     ("shmem: add huge pages support")
    Cc:  <stable@vger.kernel.org>
    Signed-off-by: default avatarMatthew Wilcox (Oracle) <willy@infradead.org>
    Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
    1b151e24
bio.c 48.3 KB