• Christoph Hellwig's avatar
    iomap: add support for sub-pagesize buffered I/O without buffer heads · 9dc55f13
    Christoph Hellwig authored
    After already supporting a simple implementation of buffered writes for
    the blocksize == PAGE_SIZE case in the last commit this adds full support
    even for smaller block sizes.   There are three bits of per-block
    information in the buffer_head structure that really matter for the iomap
    read and write path:
    
     - uptodate status (BH_uptodate)
     - marked as currently under read I/O (BH_Async_Read)
     - marked as currently under write I/O (BH_Async_Write)
    
    Instead of having new per-block structures this now adds a per-page
    structure called struct iomap_page to track this information in a slightly
    different form:
    
     - a bitmap for the per-block uptodate status.  For worst case of a 64k
       page size system this bitmap needs to contain 128 bits.  For the
       typical 4k page size case it only needs 8 bits, although we still
       need a full unsigned long due to the way the atomic bitmap API works.
     - two atomic_t counters are used to track the outstanding read and write
       counts
    
    There is quite a bit of boilerplate code as the buffered I/O path uses
    various helper methods, but the actual code is very straight forward.
    Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
    Reviewed-by: default avatarBrian Foster <bfoster@redhat.com>
    Reviewed-by: default avatarDarrick J. Wong <darrick.wong@oracle.com>
    Signed-off-by: default avatarDarrick J. Wong <darrick.wong@oracle.com>
    9dc55f13
iomap.c 52.2 KB