• NeilBrown's avatar
    NFS: don't use STABLE writes during writeback. · e87b4c7a
    NeilBrown authored
    commit b31268ac
      FS: Use stable writes when not doing a bulk flush
    
    was a bit heavy handed.
    The particular problem that lead to this patch was that
    small writes to an O_SYNC file we being written as UNSTABLE writes
    followed by a commit.
    This is appropriate for large writes (which require multiple NFS
    requests) but for small writes (single NFS request), using
    NFS_FILE_SYNC is more efficient.
    
    So that patch causes the code to select between the two methods
    depending on how many nfs requests get generated.
    
    Unfortunately this ends up applying to non O_SYNC writes as well.
    In particular if you memory-map a file and update random pages, then
    when they are eventually written out by writeback they will go as
    NFS_FILE_SYNC.  This is inefficient and slows down the application.
    
    So: only set FLUSH_COND_STABLE when wbc->sync_mode is WB_SYNC_ALL.
    With this patch:
     O_SYNC writes are NFS_FILE_SYNC for single requests, and NFS_UNSTABLE
        followed by COMMIT for multiple requests
     Writing immediately before close of fsync follow the same pattern.
     Non-O_SYNC writes without an fsync of close eventually get flushed
     out as UNSTABLE and a commit follows eventually as appropriate.
    Signed-off-by: default avatarNeilBrown <neilb@suse.de>
    Signed-off-by: default avatarTrond Myklebust <trond.myklebust@primarydata.com>
    e87b4c7a
write.c 50.8 KB