• Andrew Morton's avatar
    [PATCH] restructure direct-io to suit bio_add_page · a9577554
    Andrew Morton authored
    The direct IO code was initially designed to allocate a known-sized
    BIO, to fill it with pages and to then send it off.
    
    Then along came bio_add_page().  Really, it broke direct-io.c - it
    meant that the direct-IO BIO assembly code no longer had a-priori
    knowledge of whether a page would fit into the current BIO.
    
    Our attempts to rework the initial design to play well with
    bio_add_page() really weren't adequate.  The code was getting more and
    more twisty and we kept finding corner-cases which failed.
    
    So this patch redesigns the BIO assembly and submission path of the
    direct-IO code so that it better suits the bio_add_page() semantics.
    
    It introduces another layer in the assembly phase: the 'cur_page' which
    is cached in the dio structure.
    
    The function which walks the file mapping do_direct_IO() simply emits a
    sequence of (page,offset,len,sector) quads into the next layer down -
    submit_page_section().
    
    submit_page_section() is responsible for looking for a merge of the new
    quad against the previous page section (same page).  If no merge is
    possible it passes the currently-cached page down to the next level,
    dio_send_cur_page().
    
    dio_send_cur_page() will try to add the current page to the current
    BIO.  If that fails, the current BIO is submitted for IO and we open a
    new one.
    
    So it's all nicely layered.  The assembly of sections-of-page into the
    current page closely mirrors the assembly of sections-of-BIO into the
    current BIO.
    
    At both of these levels everything is done in a "deferred" manner: try
    to merge a new request onto the currently-cached one.  If that fails
    then send the currently-cached request and then cache this one instead.
    
    Some variables have been renamed to more closely represent their usage.
    
    Some thought has been put into ownership of the various state variables
    within `struct dio'.  We were updating and inspecting these in various
    places in a rather hard-to-follow manner.  So things have been reworked
    so that particular functions "own" particular parts of the dio
    structure.  Violators have been exterminated and commentary has been
    added to describe this ownership.
    
    The handling of file holes has been simplified.
    
    As a consequence of all this, the code is clearer and simpler than it
    used to be, and it now passes the modified-for-O_DIRECT fsx-linux
    testing again.
    a9577554
direct-io.c 19.8 KB