Lines Matching full:journal

9  * Journal commit routines for the generic filesystem journaling code;
30 * IO end handler for temporary buffer_heads handling writes to the journal.
109 * mode we can now just skip the rest of the journal write
112 * Returns 1 if the journal needs to be aborted or 0 on success
114 static int journal_submit_commit_record(journal_t *journal, in journal_submit_commit_record() argument
126 if (is_journal_aborted(journal)) in journal_submit_commit_record()
139 if (jbd2_has_feature_checksum(journal)) { in journal_submit_commit_record()
144 jbd2_commit_block_csum_set(journal, bh); in journal_submit_commit_record()
152 if (journal->j_flags & JBD2_BARRIER && in journal_submit_commit_record()
153 !jbd2_has_feature_async_commit(journal)) in journal_submit_commit_record()
165 static int journal_wait_on_commit_record(journal_t *journal, in journal_wait_on_commit_record() argument
181 int jbd2_submit_inode_data(journal_t *journal, struct jbd2_inode *jinode) in jbd2_submit_inode_data() argument
187 return journal->j_submit_inode_data_buffers(jinode); in jbd2_submit_inode_data()
192 int jbd2_wait_inode_data(journal_t *journal, struct jbd2_inode *jinode) in jbd2_wait_inode_data() argument
211 static int journal_submit_data_buffers(journal_t *journal, in journal_submit_data_buffers() argument
217 spin_lock(&journal->j_list_lock); in journal_submit_data_buffers()
222 spin_unlock(&journal->j_list_lock); in journal_submit_data_buffers()
225 if (journal->j_submit_inode_data_buffers) { in journal_submit_data_buffers()
226 err = journal->j_submit_inode_data_buffers(jinode); in journal_submit_data_buffers()
230 spin_lock(&journal->j_list_lock); in journal_submit_data_buffers()
236 spin_unlock(&journal->j_list_lock); in journal_submit_data_buffers()
254 static int journal_finish_inode_data_buffers(journal_t *journal, in journal_finish_inode_data_buffers() argument
261 spin_lock(&journal->j_list_lock); in journal_finish_inode_data_buffers()
266 spin_unlock(&journal->j_list_lock); in journal_finish_inode_data_buffers()
268 if (journal->j_finish_inode_data_buffers) { in journal_finish_inode_data_buffers()
269 err = journal->j_finish_inode_data_buffers(jinode); in journal_finish_inode_data_buffers()
274 spin_lock(&journal->j_list_lock); in journal_finish_inode_data_buffers()
295 spin_unlock(&journal->j_list_lock); in journal_finish_inode_data_buffers()
346 * function is called by the journal thread to begin a complete commit.
348 void jbd2_journal_commit_transaction(journal_t *journal) in jbd2_journal_commit_transaction() argument
354 struct buffer_head **wbuf = journal->j_wbuf; in jbd2_journal_commit_transaction()
367 int tag_bytes = journal_tag_bytes(journal); in jbd2_journal_commit_transaction()
371 /* Tail of the journal */ in jbd2_journal_commit_transaction()
379 if (jbd2_journal_has_csum_v2or3(journal)) in jbd2_journal_commit_transaction()
388 if (journal->j_flags & JBD2_FLUSHED) { in jbd2_journal_commit_transaction()
390 mutex_lock_io(&journal->j_checkpoint_mutex); in jbd2_journal_commit_transaction()
394 * since journal is empty and it is ok for write to be in jbd2_journal_commit_transaction()
397 jbd2_journal_update_sb_log_tail(journal, in jbd2_journal_commit_transaction()
398 journal->j_tail_sequence, in jbd2_journal_commit_transaction()
399 journal->j_tail, 0); in jbd2_journal_commit_transaction()
400 mutex_unlock(&journal->j_checkpoint_mutex); in jbd2_journal_commit_transaction()
405 J_ASSERT(journal->j_running_transaction != NULL); in jbd2_journal_commit_transaction()
406 J_ASSERT(journal->j_committing_transaction == NULL); in jbd2_journal_commit_transaction()
408 write_lock(&journal->j_state_lock); in jbd2_journal_commit_transaction()
409 journal->j_flags |= JBD2_FULL_COMMIT_ONGOING; in jbd2_journal_commit_transaction()
410 while (journal->j_flags & JBD2_FAST_COMMIT_ONGOING) { in jbd2_journal_commit_transaction()
413 prepare_to_wait(&journal->j_fc_wait, &wait, in jbd2_journal_commit_transaction()
415 write_unlock(&journal->j_state_lock); in jbd2_journal_commit_transaction()
417 write_lock(&journal->j_state_lock); in jbd2_journal_commit_transaction()
418 finish_wait(&journal->j_fc_wait, &wait); in jbd2_journal_commit_transaction()
429 write_unlock(&journal->j_state_lock); in jbd2_journal_commit_transaction()
431 commit_transaction = journal->j_running_transaction; in jbd2_journal_commit_transaction()
433 trace_jbd2_start_commit(journal, commit_transaction); in jbd2_journal_commit_transaction()
437 write_lock(&journal->j_state_lock); in jbd2_journal_commit_transaction()
438 journal->j_fc_off = 0; in jbd2_journal_commit_transaction()
442 trace_jbd2_commit_locking(journal, commit_transaction); in jbd2_journal_commit_transaction()
454 jbd2_journal_wait_updates(journal); in jbd2_journal_commit_transaction()
459 journal->j_max_transaction_buffers); in jbd2_journal_commit_transaction()
476 * We use journal->j_state_lock here to serialize processing of in jbd2_journal_commit_transaction()
494 jbd2_journal_refile_buffer(journal, jh); in jbd2_journal_commit_transaction()
497 write_unlock(&journal->j_state_lock); in jbd2_journal_commit_transaction()
499 * Now try to drop any written-back buffers from the journal's in jbd2_journal_commit_transaction()
503 spin_lock(&journal->j_list_lock); in jbd2_journal_commit_transaction()
504 __jbd2_journal_clean_checkpoint_list(journal, false); in jbd2_journal_commit_transaction()
505 spin_unlock(&journal->j_list_lock); in jbd2_journal_commit_transaction()
513 jbd2_clear_buffer_revoked_flags(journal); in jbd2_journal_commit_transaction()
518 jbd2_journal_switch_revoke_table(journal); in jbd2_journal_commit_transaction()
520 write_lock(&journal->j_state_lock); in jbd2_journal_commit_transaction()
524 atomic_sub(atomic_read(&journal->j_reserved_credits), in jbd2_journal_commit_transaction()
527 trace_jbd2_commit_flushing(journal, commit_transaction); in jbd2_journal_commit_transaction()
533 journal->j_committing_transaction = commit_transaction; in jbd2_journal_commit_transaction()
534 journal->j_running_transaction = NULL; in jbd2_journal_commit_transaction()
536 commit_transaction->t_log_start = journal->j_head; in jbd2_journal_commit_transaction()
537 wake_up_all(&journal->j_wait_transaction_locked); in jbd2_journal_commit_transaction()
538 write_unlock(&journal->j_state_lock); in jbd2_journal_commit_transaction()
546 err = journal_submit_data_buffers(journal, commit_transaction); in jbd2_journal_commit_transaction()
548 jbd2_journal_abort(journal, err); in jbd2_journal_commit_transaction()
560 write_lock(&journal->j_state_lock); in jbd2_journal_commit_transaction()
562 write_unlock(&journal->j_state_lock); in jbd2_journal_commit_transaction()
564 trace_jbd2_commit_logging(journal, commit_transaction); in jbd2_journal_commit_transaction()
583 /* If we're in abort mode, we just un-journal the buffer and in jbd2_journal_commit_transaction()
586 if (is_journal_aborted(journal)) { in jbd2_journal_commit_transaction()
588 JBUFFER_TRACE(jh, "journal is aborting: refile"); in jbd2_journal_commit_transaction()
593 jbd2_journal_refile_buffer(journal, jh); in jbd2_journal_commit_transaction()
615 jbd2_journal_abort(journal, -EIO); in jbd2_journal_commit_transaction()
638 err = jbd2_journal_next_log_block(journal, &blocknr); in jbd2_journal_commit_transaction()
643 jbd2_journal_abort(journal, err); in jbd2_journal_commit_transaction()
667 jbd2_journal_abort(journal, flags); in jbd2_journal_commit_transaction()
682 write_tag_block(journal, tag, jh2bh(jh)->b_blocknr); in jbd2_journal_commit_transaction()
684 jbd2_block_tag_csum_set(journal, tag, wbuf[bufs], in jbd2_journal_commit_transaction()
691 memcpy (tagp, journal->j_uuid, 16); in jbd2_journal_commit_transaction()
700 if (bufs == journal->j_wbufsize || in jbd2_journal_commit_transaction()
713 jbd2_descriptor_block_csum_set(journal, in jbd2_journal_commit_transaction()
722 if (jbd2_has_feature_checksum(journal)) { in jbd2_journal_commit_transaction()
743 err = journal_finish_inode_data_buffers(journal, commit_transaction); in jbd2_journal_commit_transaction()
747 "on %s\n", journal->j_devname); in jbd2_journal_commit_transaction()
748 if (journal->j_flags & JBD2_ABORT_ON_SYNCDATA_ERR) in jbd2_journal_commit_transaction()
749 jbd2_journal_abort(journal, err); in jbd2_journal_commit_transaction()
757 * storage and we will be safe to update journal start in the in jbd2_journal_commit_transaction()
761 jbd2_journal_get_log_tail(journal, &first_tid, &first_block); in jbd2_journal_commit_transaction()
763 write_lock(&journal->j_state_lock); in jbd2_journal_commit_transaction()
765 long freed = first_block - journal->j_tail; in jbd2_journal_commit_transaction()
767 if (first_block < journal->j_tail) in jbd2_journal_commit_transaction()
768 freed += journal->j_last - journal->j_first; in jbd2_journal_commit_transaction()
770 if (freed < journal->j_max_transaction_buffers) in jbd2_journal_commit_transaction()
775 write_unlock(&journal->j_state_lock); in jbd2_journal_commit_transaction()
778 * If the journal is not located on the file system device, in jbd2_journal_commit_transaction()
780 * the commit record and update the journal tail sequence. in jbd2_journal_commit_transaction()
783 (journal->j_fs_dev != journal->j_dev) && in jbd2_journal_commit_transaction()
784 (journal->j_flags & JBD2_BARRIER)) in jbd2_journal_commit_transaction()
785 blkdev_issue_flush(journal->j_fs_dev); in jbd2_journal_commit_transaction()
788 if (jbd2_has_feature_async_commit(journal)) { in jbd2_journal_commit_transaction()
789 err = journal_submit_commit_record(journal, commit_transaction, in jbd2_journal_commit_transaction()
792 jbd2_journal_abort(journal, err); in jbd2_journal_commit_transaction()
873 jbd2_journal_abort(journal, err); in jbd2_journal_commit_transaction()
876 write_lock(&journal->j_state_lock); in jbd2_journal_commit_transaction()
879 write_unlock(&journal->j_state_lock); in jbd2_journal_commit_transaction()
881 if (!jbd2_has_feature_async_commit(journal)) { in jbd2_journal_commit_transaction()
882 err = journal_submit_commit_record(journal, commit_transaction, in jbd2_journal_commit_transaction()
885 jbd2_journal_abort(journal, err); in jbd2_journal_commit_transaction()
888 err = journal_wait_on_commit_record(journal, cbh); in jbd2_journal_commit_transaction()
890 if (jbd2_has_feature_async_commit(journal) && in jbd2_journal_commit_transaction()
891 journal->j_flags & JBD2_BARRIER) { in jbd2_journal_commit_transaction()
892 blkdev_issue_flush(journal->j_dev); in jbd2_journal_commit_transaction()
896 jbd2_journal_abort(journal, err); in jbd2_journal_commit_transaction()
903 * erase checkpointed transactions from the log by updating journal in jbd2_journal_commit_transaction()
907 jbd2_update_log_tail(journal, first_tid, first_block); in jbd2_journal_commit_transaction()
926 spin_lock(&journal->j_list_lock); in jbd2_journal_commit_transaction()
934 spin_unlock(&journal->j_list_lock); in jbd2_journal_commit_transaction()
971 spin_lock(&journal->j_list_lock); in jbd2_journal_commit_transaction()
1024 if (is_journal_aborted(journal)) in jbd2_journal_commit_transaction()
1049 cond_resched_lock(&journal->j_list_lock); in jbd2_journal_commit_transaction()
1051 spin_unlock(&journal->j_list_lock); in jbd2_journal_commit_transaction()
1058 write_lock(&journal->j_state_lock); in jbd2_journal_commit_transaction()
1059 spin_lock(&journal->j_list_lock); in jbd2_journal_commit_transaction()
1065 spin_unlock(&journal->j_list_lock); in jbd2_journal_commit_transaction()
1066 write_unlock(&journal->j_state_lock); in jbd2_journal_commit_transaction()
1073 if (journal->j_checkpoint_transactions == NULL) { in jbd2_journal_commit_transaction()
1074 journal->j_checkpoint_transactions = commit_transaction; in jbd2_journal_commit_transaction()
1079 journal->j_checkpoint_transactions; in jbd2_journal_commit_transaction()
1087 spin_unlock(&journal->j_list_lock); in jbd2_journal_commit_transaction()
1105 trace_jbd2_run_stats(journal->j_fs_dev->bd_dev, in jbd2_journal_commit_transaction()
1110 J_ASSERT(commit_transaction == journal->j_committing_transaction); in jbd2_journal_commit_transaction()
1111 journal->j_commit_sequence = commit_transaction->t_tid; in jbd2_journal_commit_transaction()
1112 journal->j_committing_transaction = NULL; in jbd2_journal_commit_transaction()
1119 if (likely(journal->j_average_commit_time)) in jbd2_journal_commit_transaction()
1120 journal->j_average_commit_time = (commit_time + in jbd2_journal_commit_transaction()
1121 journal->j_average_commit_time*3) / 4; in jbd2_journal_commit_transaction()
1123 journal->j_average_commit_time = commit_time; in jbd2_journal_commit_transaction()
1125 write_unlock(&journal->j_state_lock); in jbd2_journal_commit_transaction()
1127 if (journal->j_commit_callback) in jbd2_journal_commit_transaction()
1128 journal->j_commit_callback(journal, commit_transaction); in jbd2_journal_commit_transaction()
1129 if (journal->j_fc_cleanup_callback) in jbd2_journal_commit_transaction()
1130 journal->j_fc_cleanup_callback(journal, 1, commit_transaction->t_tid); in jbd2_journal_commit_transaction()
1132 trace_jbd2_end_commit(journal, commit_transaction); in jbd2_journal_commit_transaction()
1134 journal->j_commit_sequence, journal->j_tail_sequence); in jbd2_journal_commit_transaction()
1136 write_lock(&journal->j_state_lock); in jbd2_journal_commit_transaction()
1137 journal->j_flags &= ~JBD2_FULL_COMMIT_ONGOING; in jbd2_journal_commit_transaction()
1138 journal->j_flags &= ~JBD2_FAST_COMMIT_ONGOING; in jbd2_journal_commit_transaction()
1139 spin_lock(&journal->j_list_lock); in jbd2_journal_commit_transaction()
1143 __jbd2_journal_drop_transaction(journal, commit_transaction); in jbd2_journal_commit_transaction()
1146 spin_unlock(&journal->j_list_lock); in jbd2_journal_commit_transaction()
1147 write_unlock(&journal->j_state_lock); in jbd2_journal_commit_transaction()
1148 wake_up(&journal->j_wait_done_commit); in jbd2_journal_commit_transaction()
1149 wake_up(&journal->j_fc_wait); in jbd2_journal_commit_transaction()
1154 spin_lock(&journal->j_history_lock); in jbd2_journal_commit_transaction()
1155 journal->j_stats.ts_tid++; in jbd2_journal_commit_transaction()
1156 journal->j_stats.ts_requested += stats.ts_requested; in jbd2_journal_commit_transaction()
1157 journal->j_stats.run.rs_wait += stats.run.rs_wait; in jbd2_journal_commit_transaction()
1158 journal->j_stats.run.rs_request_delay += stats.run.rs_request_delay; in jbd2_journal_commit_transaction()
1159 journal->j_stats.run.rs_running += stats.run.rs_running; in jbd2_journal_commit_transaction()
1160 journal->j_stats.run.rs_locked += stats.run.rs_locked; in jbd2_journal_commit_transaction()
1161 journal->j_stats.run.rs_flushing += stats.run.rs_flushing; in jbd2_journal_commit_transaction()
1162 journal->j_stats.run.rs_logging += stats.run.rs_logging; in jbd2_journal_commit_transaction()
1163 journal->j_stats.run.rs_handle_count += stats.run.rs_handle_count; in jbd2_journal_commit_transaction()
1164 journal->j_stats.run.rs_blocks += stats.run.rs_blocks; in jbd2_journal_commit_transaction()
1165 journal->j_stats.run.rs_blocks_logged += stats.run.rs_blocks_logged; in jbd2_journal_commit_transaction()
1166 spin_unlock(&journal->j_history_lock); in jbd2_journal_commit_transaction()