Commit 7058548cd50e5bda8db086bb2e5c1d82f746d047
1 parent
afd4672dc7
Exists in
master
and in
7 other branches
ext4: Use WRITE_SYNC for commits which are caused by fsync()
If a commit is triggered by fsync(), set a flag indicating the journal blocks associated with the transaction should be flushed out using WRITE_SYNC. Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
Showing 3 changed files with 12 additions and 1 deletions Side-by-side Diff
fs/jbd2/commit.c
... | ... | @@ -367,6 +367,7 @@ |
367 | 367 | int tag_bytes = journal_tag_bytes(journal); |
368 | 368 | struct buffer_head *cbh = NULL; /* For transactional checksums */ |
369 | 369 | __u32 crc32_sum = ~0; |
370 | + int write_op = WRITE; | |
370 | 371 | |
371 | 372 | /* |
372 | 373 | * First job: lock down the current transaction and wait for |
... | ... | @@ -401,6 +402,8 @@ |
401 | 402 | spin_lock(&journal->j_state_lock); |
402 | 403 | commit_transaction->t_state = T_LOCKED; |
403 | 404 | |
405 | + if (commit_transaction->t_synchronous_commit) | |
406 | + write_op = WRITE_SYNC; | |
404 | 407 | stats.u.run.rs_wait = commit_transaction->t_max_wait; |
405 | 408 | stats.u.run.rs_locked = jiffies; |
406 | 409 | stats.u.run.rs_running = jbd2_time_diff(commit_transaction->t_start, |
... | ... | @@ -680,7 +683,7 @@ |
680 | 683 | clear_buffer_dirty(bh); |
681 | 684 | set_buffer_uptodate(bh); |
682 | 685 | bh->b_end_io = journal_end_buffer_io_sync; |
683 | - submit_bh(WRITE, bh); | |
686 | + submit_bh(write_op, bh); | |
684 | 687 | } |
685 | 688 | cond_resched(); |
686 | 689 | stats.u.run.rs_blocks_logged += bufs; |
fs/jbd2/transaction.c
include/linux/jbd2.h
... | ... | @@ -649,6 +649,12 @@ |
649 | 649 | int t_handle_count; |
650 | 650 | |
651 | 651 | /* |
652 | + * This transaction is being forced and some process is | |
653 | + * waiting for it to finish. | |
654 | + */ | |
655 | + int t_synchronous_commit:1; | |
656 | + | |
657 | + /* | |
652 | 658 | * For use by the filesystem to store fs-specific data |
653 | 659 | * structures associated with the transaction |
654 | 660 | */ |