• David Howells's avatar
    netfs: Fix io_uring based write-through · 9b038d00
    David Howells authored
    This can be triggered by mounting a cifs filesystem with a cache=strict
    mount option and then, using the fsx program from xfstests, doing:
    
            ltp/fsx -A -d -N 1000 -S 11463 -P /tmp /cifs-mount/foo \
              --replay-ops=gen112-fsxops
    
    Where gen112-fsxops holds:
    
            fallocate 0x6be7 0x8fc5 0x377d3
            copy_range 0x9c71 0x77e8 0x2edaf 0x377d3
            write 0x2776d 0x8f65 0x377d3
    
    The problem is that netfs_io_request::len is being used for two purposes
    and ends up getting set to the amount of data we transferred, not the
    amount of data the caller asked to be transferred (for various reasons,
    such as mmap'd writes, we might end up rounding out the data written to the
    server to include the entire folio at each end).
    
    Fix this by keeping the amount we were asked to write in ->len and using
    ->submitted to track what we issued ops for.  Then, when we come to calling
    ->ki_complete(), ->len is the right size.
    
    This also required netfs_cleanup_dio_write() to change since we're no
    longer advancing wreq->len.  Use wreq->transferred instead as we might have
    done a short read.
    
    With this, the generic/112 xfstest passes if cifs is forced to put all
    non-DIO opens into write-through mode.
    
    Fixes: 288ace2f ("netfs: New writeback implementation")
    Signed-off-by: default avatarDavid Howells <dhowells@redhat.com>
    Link: https://lore.kernel.org/r/295086.1716298663@warthog.procyon.org.uk
    cc: Jeff Layton <jlayton@kernel.org>
    cc: Steve French <stfrench@microsoft.com>
    cc: Enzo Matsumiya <ematsumiya@suse.de>
    cc: netfs@lists.linux.dev
    cc: v9fs@lists.linux.dev
    cc: linux-afs@lists.infradead.org
    cc: linux-cifs@vger.kernel.org
    cc: linux-fsdevel@vger.kernel.org
    Signed-off-by: default avatarChristian Brauner <brauner@kernel.org>
    9b038d00
write_collect.c 23.5 KB