• David Howells's avatar
    cachefiles, netfs: Fix write to partial block at EOF · c4f1450e
    David Howells authored
    Because it uses DIO writes, cachefiles is unable to make a write to the
    backing file if that write is not aligned to and sized according to the
    backing file's DIO block alignment.  This makes it tricky to handle a write
    to the cache where the EOF on the network file is not correctly aligned.
    
    To get around this, netfslib attempts to tell the driver it is calling how
    much more data there is available beyond the EOF that it can use to pad the
    write (netfslib preclears the part of the folio above the EOF).  However,
    it tries to tell the cache what the maximum length is, but doesn't
    calculate this correctly; and, in any case, cachefiles actually ignores the
    value and just skips the block.
    
    Fix this by:
    
     (1) Change the value passed to indicate the amount of extra data that can
         be added to the operation (now ->submit_extendable_to).  This is much
         simpler to calculate as it's just the end of the folio minus the top
         of the data within the folio - rather than having to account for data
         spread over multiple folios.
    
     (2) Make cachefiles add some of this data if the subrequest it is given
         ends at the network file's i_size if the extra data is sufficient to
         pad out to a whole block.
    Signed-off-by: default avatarDavid Howells <dhowells@redhat.com>
    cc: Jeff Layton <jlayton@kernel.org>
    cc: netfs@lists.linux.dev
    cc: linux-fsdevel@vger.kernel.org
    Link: https://lore.kernel.org/r/20240814203850.2240469-22-dhowells@redhat.com/ # v2
    Signed-off-by: default avatarChristian Brauner <brauner@kernel.org>
    c4f1450e
io.c 20.4 KB