diff options
author | Jan Kara <jack@suse.cz> | 2010-04-15 16:16:24 -0400 |
---|---|---|
committer | Jan Kara <jack@suse.cz> | 2010-05-21 13:30:40 -0400 |
commit | 03f4d804a1b4748885dc4613a4afe10089a731c8 (patch) | |
tree | f2d7be9a0205496f14d61e6a8fe62277e653fab8 /fs/jbd | |
parent | 311b9549ed2bb0f2c2257781c3e88cb00505e80e (diff) |
jbd: Provide function to check whether transaction will issue data barrier
Provide a function which returns whether a transaction with given tid
will send a barrier to the filesystem device. The function will be used
by ext3 to detect whether fsync needs to send a separate barrier or not.
Signed-off-by: Jan Kara <jack@suse.cz>
Diffstat (limited to 'fs/jbd')
-rw-r--r-- | fs/jbd/commit.c | 8 | ||||
-rw-r--r-- | fs/jbd/journal.c | 33 |
2 files changed, 40 insertions, 1 deletions
diff --git a/fs/jbd/commit.c b/fs/jbd/commit.c index ecb44c94ba8d..28a9ddaa0c49 100644 --- a/fs/jbd/commit.c +++ b/fs/jbd/commit.c | |||
@@ -786,6 +786,12 @@ wait_for_iobuf: | |||
786 | 786 | ||
787 | jbd_debug(3, "JBD: commit phase 6\n"); | 787 | jbd_debug(3, "JBD: commit phase 6\n"); |
788 | 788 | ||
789 | /* All metadata is written, now write commit record and do cleanup */ | ||
790 | spin_lock(&journal->j_state_lock); | ||
791 | J_ASSERT(commit_transaction->t_state == T_COMMIT); | ||
792 | commit_transaction->t_state = T_COMMIT_RECORD; | ||
793 | spin_unlock(&journal->j_state_lock); | ||
794 | |||
789 | if (journal_write_commit_record(journal, commit_transaction)) | 795 | if (journal_write_commit_record(journal, commit_transaction)) |
790 | err = -EIO; | 796 | err = -EIO; |
791 | 797 | ||
@@ -923,7 +929,7 @@ restart_loop: | |||
923 | 929 | ||
924 | jbd_debug(3, "JBD: commit phase 8\n"); | 930 | jbd_debug(3, "JBD: commit phase 8\n"); |
925 | 931 | ||
926 | J_ASSERT(commit_transaction->t_state == T_COMMIT); | 932 | J_ASSERT(commit_transaction->t_state == T_COMMIT_RECORD); |
927 | 933 | ||
928 | commit_transaction->t_state = T_FINISHED; | 934 | commit_transaction->t_state = T_FINISHED; |
929 | J_ASSERT(commit_transaction == journal->j_committing_transaction); | 935 | J_ASSERT(commit_transaction == journal->j_committing_transaction); |
diff --git a/fs/jbd/journal.c b/fs/jbd/journal.c index bd224eec9b07..99c71940155a 100644 --- a/fs/jbd/journal.c +++ b/fs/jbd/journal.c | |||
@@ -565,6 +565,38 @@ int log_wait_commit(journal_t *journal, tid_t tid) | |||
565 | } | 565 | } |
566 | 566 | ||
567 | /* | 567 | /* |
568 | * Return 1 if a given transaction has not yet sent barrier request | ||
569 | * connected with a transaction commit. If 0 is returned, transaction | ||
570 | * may or may not have sent the barrier. Used to avoid sending barrier | ||
571 | * twice in common cases. | ||
572 | */ | ||
573 | int journal_trans_will_send_data_barrier(journal_t *journal, tid_t tid) | ||
574 | { | ||
575 | int ret = 0; | ||
576 | transaction_t *commit_trans; | ||
577 | |||
578 | if (!(journal->j_flags & JFS_BARRIER)) | ||
579 | return 0; | ||
580 | spin_lock(&journal->j_state_lock); | ||
581 | /* Transaction already committed? */ | ||
582 | if (tid_geq(journal->j_commit_sequence, tid)) | ||
583 | goto out; | ||
584 | /* | ||
585 | * Transaction is being committed and we already proceeded to | ||
586 | * writing commit record? | ||
587 | */ | ||
588 | commit_trans = journal->j_committing_transaction; | ||
589 | if (commit_trans && commit_trans->t_tid == tid && | ||
590 | commit_trans->t_state >= T_COMMIT_RECORD) | ||
591 | goto out; | ||
592 | ret = 1; | ||
593 | out: | ||
594 | spin_unlock(&journal->j_state_lock); | ||
595 | return ret; | ||
596 | } | ||
597 | EXPORT_SYMBOL(journal_commit_will_send_barrier); | ||
598 | |||
599 | /* | ||
568 | * Log buffer allocation routines: | 600 | * Log buffer allocation routines: |
569 | */ | 601 | */ |
570 | 602 | ||
@@ -1157,6 +1189,7 @@ int journal_destroy(journal_t *journal) | |||
1157 | { | 1189 | { |
1158 | int err = 0; | 1190 | int err = 0; |
1159 | 1191 | ||
1192 | |||
1160 | /* Wait for the commit thread to wake up and die. */ | 1193 | /* Wait for the commit thread to wake up and die. */ |
1161 | journal_kill_thread(journal); | 1194 | journal_kill_thread(journal); |
1162 | 1195 | ||