• Maxim Patlasov's avatar
    fuse: writepages: crop secondary requests · 6eaf4782
    Maxim Patlasov authored
    
    
    If writeback happens while fuse is in FUSE_NOWRITE condition, the request
    will be queued but not processed immediately (see fuse_flush_writepages()).
    Until FUSE_NOWRITE becomes relaxed, more writebacks can happen.  They will
    be queued as "secondary" requests to that first ("primary") request.
    
    Existing implementation crops only primary request.  This is not correct
    because a subsequent extending write(2) may increase i_size and then
    secondary requests won't be cropped properly.  The result would be stale
    data written to the server to a file offset where zeros must be.
    
    Similar problem may happen if secondary requests are attached to an
    in-flight request that was already cropped.
    
    The patch solves the issue by cropping all secondary requests in
    fuse_writepage_end().  Thanks to Miklos for idea.
    Signed-off-by: default avatarMaxim Patlasov <MPatlasov@parallels.com>
    Signed-off-by: default avatarMiklos Szeredi <mszeredi@suse.cz>
    6eaf4782
file.c 70.9 KB