• Miklos Szeredi's avatar
    fuse: writepages: handle same page rewrites · 8b284dc4
    Miklos Szeredi authored
    As Maxim Patlasov pointed out, it's possible to get a dirty page while it's
    copy is still under writeback, despite fuse_page_mkwrite() doing its thing
    (direct IO).
    
    This could result in two concurrent write request for the same offset, with
    data corruption if they get mixed up.
    
    To prevent this, fuse needs to check and delay such writes.  This
    implementation does this by:
    
     1. check if page is still under writeout, if so create a new, single page
        secondary request for it
    
     2. chain this secondary request onto the in-flight request
    
     2/a. if a seconday request for the same offset was already chained to the
        in-flight request, then just copy the contents of the page and discard
        the new secondary request.  This makes sure that for each page will
        have at most two requests associated with it
    
     3. when the in-flight request finished, send off all secondary requests
        chained onto it
    Signed-off-by: default avatarMiklos Szeredi <mszeredi@suse.cz>
    8b284dc4
fuse_i.h 20.5 KB