• Jan Kara's avatar
    ext4: fix waiting and sending of a barrier in ext4_sync_file() · 93628ffb
    Jan Kara authored
    jbd2_log_start_commit() returns 1 only when we really start a
    transaction.  But we also need to wait for a transaction when the
    commit is already running.  Fix this problem by waiting for
    transaction commit unconditionally (which is just a quick check if the
    transaction is already committed).
    
    Also we have to be more careful with sending of a barrier because when
    transaction is being committed in parallel to ext4_sync_file()
    running, we cannot be sure that the barrier the journalling code sends
    happens after we wrote all the data for fsync (note that not every
    data writeout needs to trigger metadata changes thus commit of some
    metadata changes can be running while other data is still written
    out). So use jbd2_will_send_data_barrier() helper to detect the common
    cases when we can be sure barrier will be issued by the commit code
    and issue the barrier ourselves in the remaining cases.
    Reported-by: default avatarEdward Goggin <egoggin@vmware.com>
    Signed-off-by: default avatarJan Kara <jack@suse.cz>
    Signed-off-by: default avatar"Theodore Ts'o" <tytso@mit.edu>
    93628ffb
fsync.c 6.81 KB