Lines Matching refs:journal
103 static void __journal_abort_soft (journal_t *journal, int errno);
191 journal_t *journal = arg; in kjournald2() local
198 setup_timer(&journal->j_commit_timer, commit_timeout, in kjournald2()
204 journal->j_task = current; in kjournald2()
205 wake_up(&journal->j_wait_done_commit); in kjournald2()
210 write_lock(&journal->j_state_lock); in kjournald2()
213 if (journal->j_flags & JBD2_UNMOUNT) in kjournald2()
217 journal->j_commit_sequence, journal->j_commit_request); in kjournald2()
219 if (journal->j_commit_sequence != journal->j_commit_request) { in kjournald2()
221 write_unlock(&journal->j_state_lock); in kjournald2()
222 del_timer_sync(&journal->j_commit_timer); in kjournald2()
223 jbd2_journal_commit_transaction(journal); in kjournald2()
224 write_lock(&journal->j_state_lock); in kjournald2()
228 wake_up(&journal->j_wait_done_commit); in kjournald2()
236 write_unlock(&journal->j_state_lock); in kjournald2()
238 write_lock(&journal->j_state_lock); in kjournald2()
247 prepare_to_wait(&journal->j_wait_commit, &wait, in kjournald2()
249 if (journal->j_commit_sequence != journal->j_commit_request) in kjournald2()
251 transaction = journal->j_running_transaction; in kjournald2()
255 if (journal->j_flags & JBD2_UNMOUNT) in kjournald2()
258 write_unlock(&journal->j_state_lock); in kjournald2()
260 write_lock(&journal->j_state_lock); in kjournald2()
262 finish_wait(&journal->j_wait_commit, &wait); in kjournald2()
270 transaction = journal->j_running_transaction; in kjournald2()
272 journal->j_commit_request = transaction->t_tid; in kjournald2()
278 write_unlock(&journal->j_state_lock); in kjournald2()
279 del_timer_sync(&journal->j_commit_timer); in kjournald2()
280 journal->j_task = NULL; in kjournald2()
281 wake_up(&journal->j_wait_done_commit); in kjournald2()
286 static int jbd2_journal_start_thread(journal_t *journal) in jbd2_journal_start_thread() argument
290 t = kthread_run(kjournald2, journal, "jbd2/%s", in jbd2_journal_start_thread()
291 journal->j_devname); in jbd2_journal_start_thread()
295 wait_event(journal->j_wait_done_commit, journal->j_task != NULL); in jbd2_journal_start_thread()
299 static void journal_kill_thread(journal_t *journal) in journal_kill_thread() argument
301 write_lock(&journal->j_state_lock); in journal_kill_thread()
302 journal->j_flags |= JBD2_UNMOUNT; in journal_kill_thread()
304 while (journal->j_task) { in journal_kill_thread()
305 write_unlock(&journal->j_state_lock); in journal_kill_thread()
306 wake_up(&journal->j_wait_commit); in journal_kill_thread()
307 wait_event(journal->j_wait_done_commit, journal->j_task == NULL); in journal_kill_thread()
308 write_lock(&journal->j_state_lock); in journal_kill_thread()
310 write_unlock(&journal->j_state_lock); in journal_kill_thread()
361 journal_t *journal = transaction->t_journal; in jbd2_journal_write_metadata_buffer() local
471 new_bh->b_bdev = journal->j_dev; in jbd2_journal_write_metadata_buffer()
485 spin_lock(&journal->j_list_lock); in jbd2_journal_write_metadata_buffer()
487 spin_unlock(&journal->j_list_lock); in jbd2_journal_write_metadata_buffer()
503 int __jbd2_log_start_commit(journal_t *journal, tid_t target) in __jbd2_log_start_commit() argument
506 if (journal->j_commit_request == target) in __jbd2_log_start_commit()
514 if (journal->j_running_transaction && in __jbd2_log_start_commit()
515 journal->j_running_transaction->t_tid == target) { in __jbd2_log_start_commit()
521 journal->j_commit_request = target; in __jbd2_log_start_commit()
523 journal->j_commit_request, in __jbd2_log_start_commit()
524 journal->j_commit_sequence); in __jbd2_log_start_commit()
525 journal->j_running_transaction->t_requested = jiffies; in __jbd2_log_start_commit()
526 wake_up(&journal->j_wait_commit); in __jbd2_log_start_commit()
528 } else if (!tid_geq(journal->j_commit_request, target)) in __jbd2_log_start_commit()
533 journal->j_commit_request, in __jbd2_log_start_commit()
534 journal->j_commit_sequence, in __jbd2_log_start_commit()
535 target, journal->j_running_transaction ? in __jbd2_log_start_commit()
536 journal->j_running_transaction->t_tid : 0); in __jbd2_log_start_commit()
540 int jbd2_log_start_commit(journal_t *journal, tid_t tid) in jbd2_log_start_commit() argument
544 write_lock(&journal->j_state_lock); in jbd2_log_start_commit()
545 ret = __jbd2_log_start_commit(journal, tid); in jbd2_log_start_commit()
546 write_unlock(&journal->j_state_lock); in jbd2_log_start_commit()
557 static int __jbd2_journal_force_commit(journal_t *journal) in __jbd2_journal_force_commit() argument
563 read_lock(&journal->j_state_lock); in __jbd2_journal_force_commit()
564 if (journal->j_running_transaction && !current->journal_info) { in __jbd2_journal_force_commit()
565 transaction = journal->j_running_transaction; in __jbd2_journal_force_commit()
566 if (!tid_geq(journal->j_commit_request, transaction->t_tid)) in __jbd2_journal_force_commit()
568 } else if (journal->j_committing_transaction) in __jbd2_journal_force_commit()
569 transaction = journal->j_committing_transaction; in __jbd2_journal_force_commit()
573 read_unlock(&journal->j_state_lock); in __jbd2_journal_force_commit()
577 read_unlock(&journal->j_state_lock); in __jbd2_journal_force_commit()
579 jbd2_log_start_commit(journal, tid); in __jbd2_journal_force_commit()
580 ret = jbd2_log_wait_commit(journal, tid); in __jbd2_journal_force_commit()
595 int jbd2_journal_force_commit_nested(journal_t *journal) in jbd2_journal_force_commit_nested() argument
599 ret = __jbd2_journal_force_commit(journal); in jbd2_journal_force_commit_nested()
610 int jbd2_journal_force_commit(journal_t *journal) in jbd2_journal_force_commit() argument
615 ret = __jbd2_journal_force_commit(journal); in jbd2_journal_force_commit()
626 int jbd2_journal_start_commit(journal_t *journal, tid_t *ptid) in jbd2_journal_start_commit() argument
630 write_lock(&journal->j_state_lock); in jbd2_journal_start_commit()
631 if (journal->j_running_transaction) { in jbd2_journal_start_commit()
632 tid_t tid = journal->j_running_transaction->t_tid; in jbd2_journal_start_commit()
634 __jbd2_log_start_commit(journal, tid); in jbd2_journal_start_commit()
640 } else if (journal->j_committing_transaction) { in jbd2_journal_start_commit()
646 *ptid = journal->j_committing_transaction->t_tid; in jbd2_journal_start_commit()
649 write_unlock(&journal->j_state_lock); in jbd2_journal_start_commit()
659 int jbd2_trans_will_send_data_barrier(journal_t *journal, tid_t tid) in jbd2_trans_will_send_data_barrier() argument
664 if (!(journal->j_flags & JBD2_BARRIER)) in jbd2_trans_will_send_data_barrier()
666 read_lock(&journal->j_state_lock); in jbd2_trans_will_send_data_barrier()
668 if (tid_geq(journal->j_commit_sequence, tid)) in jbd2_trans_will_send_data_barrier()
670 commit_trans = journal->j_committing_transaction; in jbd2_trans_will_send_data_barrier()
679 if (journal->j_fs_dev != journal->j_dev) { in jbd2_trans_will_send_data_barrier()
689 read_unlock(&journal->j_state_lock); in jbd2_trans_will_send_data_barrier()
698 int jbd2_log_wait_commit(journal_t *journal, tid_t tid) in jbd2_log_wait_commit() argument
702 read_lock(&journal->j_state_lock); in jbd2_log_wait_commit()
704 if (!tid_geq(journal->j_commit_request, tid)) { in jbd2_log_wait_commit()
707 __func__, journal->j_commit_request, tid); in jbd2_log_wait_commit()
710 while (tid_gt(tid, journal->j_commit_sequence)) { in jbd2_log_wait_commit()
712 tid, journal->j_commit_sequence); in jbd2_log_wait_commit()
713 read_unlock(&journal->j_state_lock); in jbd2_log_wait_commit()
714 wake_up(&journal->j_wait_commit); in jbd2_log_wait_commit()
715 wait_event(journal->j_wait_done_commit, in jbd2_log_wait_commit()
716 !tid_gt(tid, journal->j_commit_sequence)); in jbd2_log_wait_commit()
717 read_lock(&journal->j_state_lock); in jbd2_log_wait_commit()
719 read_unlock(&journal->j_state_lock); in jbd2_log_wait_commit()
721 if (unlikely(is_journal_aborted(journal))) in jbd2_log_wait_commit()
733 int jbd2_complete_transaction(journal_t *journal, tid_t tid) in jbd2_complete_transaction() argument
737 read_lock(&journal->j_state_lock); in jbd2_complete_transaction()
738 if (journal->j_running_transaction && in jbd2_complete_transaction()
739 journal->j_running_transaction->t_tid == tid) { in jbd2_complete_transaction()
740 if (journal->j_commit_request != tid) { in jbd2_complete_transaction()
742 read_unlock(&journal->j_state_lock); in jbd2_complete_transaction()
743 jbd2_log_start_commit(journal, tid); in jbd2_complete_transaction()
746 } else if (!(journal->j_committing_transaction && in jbd2_complete_transaction()
747 journal->j_committing_transaction->t_tid == tid)) in jbd2_complete_transaction()
749 read_unlock(&journal->j_state_lock); in jbd2_complete_transaction()
753 return jbd2_log_wait_commit(journal, tid); in jbd2_complete_transaction()
761 int jbd2_journal_next_log_block(journal_t *journal, unsigned long long *retp) in jbd2_journal_next_log_block() argument
765 write_lock(&journal->j_state_lock); in jbd2_journal_next_log_block()
766 J_ASSERT(journal->j_free > 1); in jbd2_journal_next_log_block()
768 blocknr = journal->j_head; in jbd2_journal_next_log_block()
769 journal->j_head++; in jbd2_journal_next_log_block()
770 journal->j_free--; in jbd2_journal_next_log_block()
771 if (journal->j_head == journal->j_last) in jbd2_journal_next_log_block()
772 journal->j_head = journal->j_first; in jbd2_journal_next_log_block()
773 write_unlock(&journal->j_state_lock); in jbd2_journal_next_log_block()
774 return jbd2_journal_bmap(journal, blocknr, retp); in jbd2_journal_next_log_block()
784 int jbd2_journal_bmap(journal_t *journal, unsigned long blocknr, in jbd2_journal_bmap() argument
790 if (journal->j_inode) { in jbd2_journal_bmap()
791 ret = bmap(journal->j_inode, blocknr); in jbd2_journal_bmap()
797 __func__, blocknr, journal->j_devname); in jbd2_journal_bmap()
799 __journal_abort_soft(journal, err); in jbd2_journal_bmap()
817 struct buffer_head *jbd2_journal_get_descriptor_buffer(journal_t *journal) in jbd2_journal_get_descriptor_buffer() argument
823 err = jbd2_journal_next_log_block(journal, &blocknr); in jbd2_journal_get_descriptor_buffer()
828 bh = __getblk(journal->j_dev, blocknr, journal->j_blocksize); in jbd2_journal_get_descriptor_buffer()
832 memset(bh->b_data, 0, journal->j_blocksize); in jbd2_journal_get_descriptor_buffer()
849 int jbd2_journal_get_log_tail(journal_t *journal, tid_t *tid, in jbd2_journal_get_log_tail() argument
855 read_lock(&journal->j_state_lock); in jbd2_journal_get_log_tail()
856 spin_lock(&journal->j_list_lock); in jbd2_journal_get_log_tail()
857 transaction = journal->j_checkpoint_transactions; in jbd2_journal_get_log_tail()
861 } else if ((transaction = journal->j_committing_transaction) != NULL) { in jbd2_journal_get_log_tail()
864 } else if ((transaction = journal->j_running_transaction) != NULL) { in jbd2_journal_get_log_tail()
866 *block = journal->j_head; in jbd2_journal_get_log_tail()
868 *tid = journal->j_transaction_sequence; in jbd2_journal_get_log_tail()
869 *block = journal->j_head; in jbd2_journal_get_log_tail()
871 ret = tid_gt(*tid, journal->j_tail_sequence); in jbd2_journal_get_log_tail()
872 spin_unlock(&journal->j_list_lock); in jbd2_journal_get_log_tail()
873 read_unlock(&journal->j_state_lock); in jbd2_journal_get_log_tail()
888 int __jbd2_update_log_tail(journal_t *journal, tid_t tid, unsigned long block) in __jbd2_update_log_tail() argument
893 BUG_ON(!mutex_is_locked(&journal->j_checkpoint_mutex)); in __jbd2_update_log_tail()
901 ret = jbd2_journal_update_sb_log_tail(journal, tid, block, WRITE_FUA); in __jbd2_update_log_tail()
905 write_lock(&journal->j_state_lock); in __jbd2_update_log_tail()
906 freed = block - journal->j_tail; in __jbd2_update_log_tail()
907 if (block < journal->j_tail) in __jbd2_update_log_tail()
908 freed += journal->j_last - journal->j_first; in __jbd2_update_log_tail()
910 trace_jbd2_update_log_tail(journal, tid, block, freed); in __jbd2_update_log_tail()
914 journal->j_tail_sequence, tid, block, freed); in __jbd2_update_log_tail()
916 journal->j_free += freed; in __jbd2_update_log_tail()
917 journal->j_tail_sequence = tid; in __jbd2_update_log_tail()
918 journal->j_tail = block; in __jbd2_update_log_tail()
919 write_unlock(&journal->j_state_lock); in __jbd2_update_log_tail()
930 void jbd2_update_log_tail(journal_t *journal, tid_t tid, unsigned long block) in jbd2_update_log_tail() argument
932 mutex_lock(&journal->j_checkpoint_mutex); in jbd2_update_log_tail()
933 if (tid_gt(tid, journal->j_tail_sequence)) in jbd2_update_log_tail()
934 __jbd2_update_log_tail(journal, tid, block); in jbd2_update_log_tail()
935 mutex_unlock(&journal->j_checkpoint_mutex); in jbd2_update_log_tail()
939 journal_t *journal; member
964 s->journal->j_max_transaction_buffers); in jbd2_seq_info_show()
982 div_u64(s->journal->j_average_commit_time, 1000)); in jbd2_seq_info_show()
1005 journal_t *journal = PDE_DATA(inode); in jbd2_seq_info_open() local
1018 spin_lock(&journal->j_history_lock); in jbd2_seq_info_open()
1019 memcpy(s->stats, &journal->j_stats, size); in jbd2_seq_info_open()
1020 s->journal = journal; in jbd2_seq_info_open()
1021 spin_unlock(&journal->j_history_lock); in jbd2_seq_info_open()
1054 static void jbd2_stats_proc_init(journal_t *journal) in jbd2_stats_proc_init() argument
1056 journal->j_proc_entry = proc_mkdir(journal->j_devname, proc_jbd2_stats); in jbd2_stats_proc_init()
1057 if (journal->j_proc_entry) { in jbd2_stats_proc_init()
1058 proc_create_data("info", S_IRUGO, journal->j_proc_entry, in jbd2_stats_proc_init()
1059 &jbd2_seq_info_fops, journal); in jbd2_stats_proc_init()
1063 static void jbd2_stats_proc_exit(journal_t *journal) in jbd2_stats_proc_exit() argument
1065 remove_proc_entry("info", journal->j_proc_entry); in jbd2_stats_proc_exit()
1066 remove_proc_entry(journal->j_devname, proc_jbd2_stats); in jbd2_stats_proc_exit()
1080 journal_t *journal; in journal_init_common() local
1083 journal = kzalloc(sizeof(*journal), GFP_KERNEL); in journal_init_common()
1084 if (!journal) in journal_init_common()
1087 init_waitqueue_head(&journal->j_wait_transaction_locked); in journal_init_common()
1088 init_waitqueue_head(&journal->j_wait_done_commit); in journal_init_common()
1089 init_waitqueue_head(&journal->j_wait_commit); in journal_init_common()
1090 init_waitqueue_head(&journal->j_wait_updates); in journal_init_common()
1091 init_waitqueue_head(&journal->j_wait_reserved); in journal_init_common()
1092 mutex_init(&journal->j_barrier); in journal_init_common()
1093 mutex_init(&journal->j_checkpoint_mutex); in journal_init_common()
1094 spin_lock_init(&journal->j_revoke_lock); in journal_init_common()
1095 spin_lock_init(&journal->j_list_lock); in journal_init_common()
1096 rwlock_init(&journal->j_state_lock); in journal_init_common()
1098 journal->j_commit_interval = (HZ * JBD2_DEFAULT_MAX_COMMIT_AGE); in journal_init_common()
1099 journal->j_min_batch_time = 0; in journal_init_common()
1100 journal->j_max_batch_time = 15000; /* 15ms */ in journal_init_common()
1101 atomic_set(&journal->j_reserved_credits, 0); in journal_init_common()
1104 journal->j_flags = JBD2_ABORT; in journal_init_common()
1107 err = jbd2_journal_init_revoke(journal, JOURNAL_REVOKE_DEFAULT_HASH); in journal_init_common()
1109 kfree(journal); in journal_init_common()
1113 spin_lock_init(&journal->j_history_lock); in journal_init_common()
1115 return journal; in journal_init_common()
1145 journal_t *journal = journal_init_common(); in jbd2_journal_init_dev() local
1150 if (!journal) in jbd2_journal_init_dev()
1154 journal->j_blocksize = blocksize; in jbd2_journal_init_dev()
1155 journal->j_dev = bdev; in jbd2_journal_init_dev()
1156 journal->j_fs_dev = fs_dev; in jbd2_journal_init_dev()
1157 journal->j_blk_offset = start; in jbd2_journal_init_dev()
1158 journal->j_maxlen = len; in jbd2_journal_init_dev()
1159 bdevname(journal->j_dev, journal->j_devname); in jbd2_journal_init_dev()
1160 p = journal->j_devname; in jbd2_journal_init_dev()
1163 jbd2_stats_proc_init(journal); in jbd2_journal_init_dev()
1164 n = journal->j_blocksize / sizeof(journal_block_tag_t); in jbd2_journal_init_dev()
1165 journal->j_wbufsize = n; in jbd2_journal_init_dev()
1166 journal->j_wbuf = kmalloc(n * sizeof(struct buffer_head*), GFP_KERNEL); in jbd2_journal_init_dev()
1167 if (!journal->j_wbuf) { in jbd2_journal_init_dev()
1173 bh = __getblk(journal->j_dev, start, journal->j_blocksize); in jbd2_journal_init_dev()
1180 journal->j_sb_buffer = bh; in jbd2_journal_init_dev()
1181 journal->j_superblock = (journal_superblock_t *)bh->b_data; in jbd2_journal_init_dev()
1183 return journal; in jbd2_journal_init_dev()
1185 kfree(journal->j_wbuf); in jbd2_journal_init_dev()
1186 jbd2_stats_proc_exit(journal); in jbd2_journal_init_dev()
1187 kfree(journal); in jbd2_journal_init_dev()
1202 journal_t *journal = journal_init_common(); in jbd2_journal_init_inode() local
1208 if (!journal) in jbd2_journal_init_inode()
1211 journal->j_dev = journal->j_fs_dev = inode->i_sb->s_bdev; in jbd2_journal_init_inode()
1212 journal->j_inode = inode; in jbd2_journal_init_inode()
1213 bdevname(journal->j_dev, journal->j_devname); in jbd2_journal_init_inode()
1214 p = journal->j_devname; in jbd2_journal_init_inode()
1217 p = journal->j_devname + strlen(journal->j_devname); in jbd2_journal_init_inode()
1218 sprintf(p, "-%lu", journal->j_inode->i_ino); in jbd2_journal_init_inode()
1221 journal, inode->i_sb->s_id, inode->i_ino, in jbd2_journal_init_inode()
1225 journal->j_maxlen = inode->i_size >> inode->i_sb->s_blocksize_bits; in jbd2_journal_init_inode()
1226 journal->j_blocksize = inode->i_sb->s_blocksize; in jbd2_journal_init_inode()
1227 jbd2_stats_proc_init(journal); in jbd2_journal_init_inode()
1230 n = journal->j_blocksize / sizeof(journal_block_tag_t); in jbd2_journal_init_inode()
1231 journal->j_wbufsize = n; in jbd2_journal_init_inode()
1232 journal->j_wbuf = kmalloc(n * sizeof(struct buffer_head*), GFP_KERNEL); in jbd2_journal_init_inode()
1233 if (!journal->j_wbuf) { in jbd2_journal_init_inode()
1239 err = jbd2_journal_bmap(journal, 0, &blocknr); in jbd2_journal_init_inode()
1247 bh = getblk_unmovable(journal->j_dev, blocknr, journal->j_blocksize); in jbd2_journal_init_inode()
1254 journal->j_sb_buffer = bh; in jbd2_journal_init_inode()
1255 journal->j_superblock = (journal_superblock_t *)bh->b_data; in jbd2_journal_init_inode()
1257 return journal; in jbd2_journal_init_inode()
1259 kfree(journal->j_wbuf); in jbd2_journal_init_inode()
1260 jbd2_stats_proc_exit(journal); in jbd2_journal_init_inode()
1261 kfree(journal); in jbd2_journal_init_inode()
1270 static void journal_fail_superblock (journal_t *journal) in journal_fail_superblock() argument
1272 struct buffer_head *bh = journal->j_sb_buffer; in journal_fail_superblock()
1274 journal->j_sb_buffer = NULL; in journal_fail_superblock()
1284 static int journal_reset(journal_t *journal) in journal_reset() argument
1286 journal_superblock_t *sb = journal->j_superblock; in journal_reset()
1294 journal_fail_superblock(journal); in journal_reset()
1298 journal->j_first = first; in journal_reset()
1299 journal->j_last = last; in journal_reset()
1301 journal->j_head = first; in journal_reset()
1302 journal->j_tail = first; in journal_reset()
1303 journal->j_free = last - first; in journal_reset()
1305 journal->j_tail_sequence = journal->j_transaction_sequence; in journal_reset()
1306 journal->j_commit_sequence = journal->j_transaction_sequence - 1; in journal_reset()
1307 journal->j_commit_request = journal->j_commit_sequence; in journal_reset()
1309 journal->j_max_transaction_buffers = journal->j_maxlen / 4; in journal_reset()
1320 journal->j_tail, journal->j_tail_sequence, in journal_reset()
1321 journal->j_errno); in journal_reset()
1322 journal->j_flags |= JBD2_FLUSHED; in journal_reset()
1325 mutex_lock(&journal->j_checkpoint_mutex); in journal_reset()
1332 jbd2_journal_update_sb_log_tail(journal, in journal_reset()
1333 journal->j_tail_sequence, in journal_reset()
1334 journal->j_tail, in journal_reset()
1336 mutex_unlock(&journal->j_checkpoint_mutex); in journal_reset()
1338 return jbd2_journal_start_thread(journal); in journal_reset()
1341 static int jbd2_write_superblock(journal_t *journal, int write_op) in jbd2_write_superblock() argument
1343 struct buffer_head *bh = journal->j_sb_buffer; in jbd2_write_superblock()
1344 journal_superblock_t *sb = journal->j_superblock; in jbd2_write_superblock()
1347 trace_jbd2_write_superblock(journal, write_op); in jbd2_write_superblock()
1348 if (!(journal->j_flags & JBD2_BARRIER)) in jbd2_write_superblock()
1362 journal->j_devname); in jbd2_write_superblock()
1366 jbd2_superblock_csum_set(journal, sb); in jbd2_write_superblock()
1379 journal->j_devname); in jbd2_write_superblock()
1380 jbd2_journal_abort(journal, ret); in jbd2_write_superblock()
1396 int jbd2_journal_update_sb_log_tail(journal_t *journal, tid_t tail_tid, in jbd2_journal_update_sb_log_tail() argument
1399 journal_superblock_t *sb = journal->j_superblock; in jbd2_journal_update_sb_log_tail()
1402 BUG_ON(!mutex_is_locked(&journal->j_checkpoint_mutex)); in jbd2_journal_update_sb_log_tail()
1409 ret = jbd2_write_superblock(journal, write_op); in jbd2_journal_update_sb_log_tail()
1414 write_lock(&journal->j_state_lock); in jbd2_journal_update_sb_log_tail()
1416 journal->j_flags &= ~JBD2_FLUSHED; in jbd2_journal_update_sb_log_tail()
1417 write_unlock(&journal->j_state_lock); in jbd2_journal_update_sb_log_tail()
1431 static void jbd2_mark_journal_empty(journal_t *journal, int write_op) in jbd2_mark_journal_empty() argument
1433 journal_superblock_t *sb = journal->j_superblock; in jbd2_mark_journal_empty()
1435 BUG_ON(!mutex_is_locked(&journal->j_checkpoint_mutex)); in jbd2_mark_journal_empty()
1436 read_lock(&journal->j_state_lock); in jbd2_mark_journal_empty()
1439 read_unlock(&journal->j_state_lock); in jbd2_mark_journal_empty()
1443 journal->j_tail_sequence); in jbd2_mark_journal_empty()
1445 sb->s_sequence = cpu_to_be32(journal->j_tail_sequence); in jbd2_mark_journal_empty()
1447 read_unlock(&journal->j_state_lock); in jbd2_mark_journal_empty()
1449 jbd2_write_superblock(journal, write_op); in jbd2_mark_journal_empty()
1452 write_lock(&journal->j_state_lock); in jbd2_mark_journal_empty()
1453 journal->j_flags |= JBD2_FLUSHED; in jbd2_mark_journal_empty()
1454 write_unlock(&journal->j_state_lock); in jbd2_mark_journal_empty()
1465 void jbd2_journal_update_sb_errno(journal_t *journal) in jbd2_journal_update_sb_errno() argument
1467 journal_superblock_t *sb = journal->j_superblock; in jbd2_journal_update_sb_errno()
1469 read_lock(&journal->j_state_lock); in jbd2_journal_update_sb_errno()
1471 journal->j_errno); in jbd2_journal_update_sb_errno()
1472 sb->s_errno = cpu_to_be32(journal->j_errno); in jbd2_journal_update_sb_errno()
1473 read_unlock(&journal->j_state_lock); in jbd2_journal_update_sb_errno()
1475 jbd2_write_superblock(journal, WRITE_SYNC); in jbd2_journal_update_sb_errno()
1483 static int journal_get_superblock(journal_t *journal) in journal_get_superblock() argument
1489 bh = journal->j_sb_buffer; in journal_get_superblock()
1505 sb = journal->j_superblock; in journal_get_superblock()
1510 sb->s_blocksize != cpu_to_be32(journal->j_blocksize)) { in journal_get_superblock()
1517 journal->j_format_version = 1; in journal_get_superblock()
1520 journal->j_format_version = 2; in journal_get_superblock()
1527 if (be32_to_cpu(sb->s_maxlen) < journal->j_maxlen) in journal_get_superblock()
1528 journal->j_maxlen = be32_to_cpu(sb->s_maxlen); in journal_get_superblock()
1529 else if (be32_to_cpu(sb->s_maxlen) > journal->j_maxlen) { in journal_get_superblock()
1535 be32_to_cpu(sb->s_first) >= journal->j_maxlen) { in journal_get_superblock()
1542 if (JBD2_HAS_INCOMPAT_FEATURE(journal, JBD2_FEATURE_INCOMPAT_CSUM_V2) && in journal_get_superblock()
1543 JBD2_HAS_INCOMPAT_FEATURE(journal, JBD2_FEATURE_INCOMPAT_CSUM_V3)) { in journal_get_superblock()
1550 if (jbd2_journal_has_csum_v2or3(journal) && in journal_get_superblock()
1551 JBD2_HAS_COMPAT_FEATURE(journal, JBD2_FEATURE_COMPAT_CHECKSUM)) { in journal_get_superblock()
1558 if (!jbd2_verify_csum_type(journal, sb)) { in journal_get_superblock()
1564 if (jbd2_journal_has_csum_v2or3(journal)) { in journal_get_superblock()
1565 journal->j_chksum_driver = crypto_alloc_shash("crc32c", 0, 0); in journal_get_superblock()
1566 if (IS_ERR(journal->j_chksum_driver)) { in journal_get_superblock()
1568 err = PTR_ERR(journal->j_chksum_driver); in journal_get_superblock()
1569 journal->j_chksum_driver = NULL; in journal_get_superblock()
1575 if (!jbd2_superblock_csum_verify(journal, sb)) { in journal_get_superblock()
1581 if (jbd2_journal_has_csum_v2or3(journal)) in journal_get_superblock()
1582 journal->j_csum_seed = jbd2_chksum(journal, ~0, sb->s_uuid, in journal_get_superblock()
1590 journal_fail_superblock(journal); in journal_get_superblock()
1599 static int load_superblock(journal_t *journal) in load_superblock() argument
1604 err = journal_get_superblock(journal); in load_superblock()
1608 sb = journal->j_superblock; in load_superblock()
1610 journal->j_tail_sequence = be32_to_cpu(sb->s_sequence); in load_superblock()
1611 journal->j_tail = be32_to_cpu(sb->s_start); in load_superblock()
1612 journal->j_first = be32_to_cpu(sb->s_first); in load_superblock()
1613 journal->j_last = be32_to_cpu(sb->s_maxlen); in load_superblock()
1614 journal->j_errno = be32_to_cpu(sb->s_errno); in load_superblock()
1628 int jbd2_journal_load(journal_t *journal) in jbd2_journal_load() argument
1633 err = load_superblock(journal); in jbd2_journal_load()
1637 sb = journal->j_superblock; in jbd2_journal_load()
1641 if (journal->j_format_version >= 2) { in jbd2_journal_load()
1661 if (jbd2_journal_recover(journal)) in jbd2_journal_load()
1664 if (journal->j_failed_commit) { in jbd2_journal_load()
1666 "is corrupt.\n", journal->j_failed_commit, in jbd2_journal_load()
1667 journal->j_devname); in jbd2_journal_load()
1674 if (journal_reset(journal)) in jbd2_journal_load()
1677 journal->j_flags &= ~JBD2_ABORT; in jbd2_journal_load()
1678 journal->j_flags |= JBD2_LOADED; in jbd2_journal_load()
1694 int jbd2_journal_destroy(journal_t *journal) in jbd2_journal_destroy() argument
1699 journal_kill_thread(journal); in jbd2_journal_destroy()
1702 if (journal->j_running_transaction) in jbd2_journal_destroy()
1703 jbd2_journal_commit_transaction(journal); in jbd2_journal_destroy()
1708 spin_lock(&journal->j_list_lock); in jbd2_journal_destroy()
1709 while (journal->j_checkpoint_transactions != NULL) { in jbd2_journal_destroy()
1710 spin_unlock(&journal->j_list_lock); in jbd2_journal_destroy()
1711 mutex_lock(&journal->j_checkpoint_mutex); in jbd2_journal_destroy()
1712 err = jbd2_log_do_checkpoint(journal); in jbd2_journal_destroy()
1713 mutex_unlock(&journal->j_checkpoint_mutex); in jbd2_journal_destroy()
1719 jbd2_journal_destroy_checkpoint(journal); in jbd2_journal_destroy()
1720 spin_lock(&journal->j_list_lock); in jbd2_journal_destroy()
1723 spin_lock(&journal->j_list_lock); in jbd2_journal_destroy()
1726 J_ASSERT(journal->j_running_transaction == NULL); in jbd2_journal_destroy()
1727 J_ASSERT(journal->j_committing_transaction == NULL); in jbd2_journal_destroy()
1728 J_ASSERT(journal->j_checkpoint_transactions == NULL); in jbd2_journal_destroy()
1729 spin_unlock(&journal->j_list_lock); in jbd2_journal_destroy()
1731 if (journal->j_sb_buffer) { in jbd2_journal_destroy()
1732 if (!is_journal_aborted(journal)) { in jbd2_journal_destroy()
1733 mutex_lock(&journal->j_checkpoint_mutex); in jbd2_journal_destroy()
1735 write_lock(&journal->j_state_lock); in jbd2_journal_destroy()
1736 journal->j_tail_sequence = in jbd2_journal_destroy()
1737 ++journal->j_transaction_sequence; in jbd2_journal_destroy()
1738 write_unlock(&journal->j_state_lock); in jbd2_journal_destroy()
1740 jbd2_mark_journal_empty(journal, WRITE_FLUSH_FUA); in jbd2_journal_destroy()
1741 mutex_unlock(&journal->j_checkpoint_mutex); in jbd2_journal_destroy()
1744 brelse(journal->j_sb_buffer); in jbd2_journal_destroy()
1747 if (journal->j_proc_entry) in jbd2_journal_destroy()
1748 jbd2_stats_proc_exit(journal); in jbd2_journal_destroy()
1749 iput(journal->j_inode); in jbd2_journal_destroy()
1750 if (journal->j_revoke) in jbd2_journal_destroy()
1751 jbd2_journal_destroy_revoke(journal); in jbd2_journal_destroy()
1752 if (journal->j_chksum_driver) in jbd2_journal_destroy()
1753 crypto_free_shash(journal->j_chksum_driver); in jbd2_journal_destroy()
1754 kfree(journal->j_wbuf); in jbd2_journal_destroy()
1755 kfree(journal); in jbd2_journal_destroy()
1772 int jbd2_journal_check_used_features (journal_t *journal, unsigned long compat, in jbd2_journal_check_used_features() argument
1780 if (journal->j_format_version == 0 && in jbd2_journal_check_used_features()
1781 journal_get_superblock(journal) != 0) in jbd2_journal_check_used_features()
1783 if (journal->j_format_version == 1) in jbd2_journal_check_used_features()
1786 sb = journal->j_superblock; in jbd2_journal_check_used_features()
1807 int jbd2_journal_check_available_features (journal_t *journal, unsigned long compat, in jbd2_journal_check_available_features() argument
1817 if (journal->j_format_version != 2) in jbd2_journal_check_available_features()
1840 int jbd2_journal_set_features (journal_t *journal, unsigned long compat, in jbd2_journal_set_features() argument
1849 if (jbd2_journal_check_used_features(journal, compat, ro, incompat)) in jbd2_journal_set_features()
1852 if (!jbd2_journal_check_available_features(journal, compat, ro, incompat)) in jbd2_journal_set_features()
1869 sb = journal->j_superblock; in jbd2_journal_set_features()
1878 if (journal->j_chksum_driver == NULL) { in jbd2_journal_set_features()
1879 journal->j_chksum_driver = crypto_alloc_shash("crc32c", in jbd2_journal_set_features()
1881 if (IS_ERR(journal->j_chksum_driver)) { in jbd2_journal_set_features()
1884 journal->j_chksum_driver = NULL; in jbd2_journal_set_features()
1889 journal->j_csum_seed = jbd2_chksum(journal, ~0, in jbd2_journal_set_features()
1921 void jbd2_journal_clear_features(journal_t *journal, unsigned long compat, in jbd2_journal_clear_features() argument
1929 sb = journal->j_superblock; in jbd2_journal_clear_features()
1946 int jbd2_journal_flush(journal_t *journal) in jbd2_journal_flush() argument
1951 write_lock(&journal->j_state_lock); in jbd2_journal_flush()
1954 if (journal->j_running_transaction) { in jbd2_journal_flush()
1955 transaction = journal->j_running_transaction; in jbd2_journal_flush()
1956 __jbd2_log_start_commit(journal, transaction->t_tid); in jbd2_journal_flush()
1957 } else if (journal->j_committing_transaction) in jbd2_journal_flush()
1958 transaction = journal->j_committing_transaction; in jbd2_journal_flush()
1964 write_unlock(&journal->j_state_lock); in jbd2_journal_flush()
1965 jbd2_log_wait_commit(journal, tid); in jbd2_journal_flush()
1967 write_unlock(&journal->j_state_lock); in jbd2_journal_flush()
1971 spin_lock(&journal->j_list_lock); in jbd2_journal_flush()
1972 while (!err && journal->j_checkpoint_transactions != NULL) { in jbd2_journal_flush()
1973 spin_unlock(&journal->j_list_lock); in jbd2_journal_flush()
1974 mutex_lock(&journal->j_checkpoint_mutex); in jbd2_journal_flush()
1975 err = jbd2_log_do_checkpoint(journal); in jbd2_journal_flush()
1976 mutex_unlock(&journal->j_checkpoint_mutex); in jbd2_journal_flush()
1977 spin_lock(&journal->j_list_lock); in jbd2_journal_flush()
1979 spin_unlock(&journal->j_list_lock); in jbd2_journal_flush()
1981 if (is_journal_aborted(journal)) in jbd2_journal_flush()
1984 mutex_lock(&journal->j_checkpoint_mutex); in jbd2_journal_flush()
1986 err = jbd2_cleanup_journal_tail(journal); in jbd2_journal_flush()
1988 mutex_unlock(&journal->j_checkpoint_mutex); in jbd2_journal_flush()
1999 jbd2_mark_journal_empty(journal, WRITE_FUA); in jbd2_journal_flush()
2000 mutex_unlock(&journal->j_checkpoint_mutex); in jbd2_journal_flush()
2001 write_lock(&journal->j_state_lock); in jbd2_journal_flush()
2002 J_ASSERT(!journal->j_running_transaction); in jbd2_journal_flush()
2003 J_ASSERT(!journal->j_committing_transaction); in jbd2_journal_flush()
2004 J_ASSERT(!journal->j_checkpoint_transactions); in jbd2_journal_flush()
2005 J_ASSERT(journal->j_head == journal->j_tail); in jbd2_journal_flush()
2006 J_ASSERT(journal->j_tail_sequence == journal->j_transaction_sequence); in jbd2_journal_flush()
2007 write_unlock(&journal->j_state_lock); in jbd2_journal_flush()
2025 int jbd2_journal_wipe(journal_t *journal, int write) in jbd2_journal_wipe() argument
2029 J_ASSERT (!(journal->j_flags & JBD2_LOADED)); in jbd2_journal_wipe()
2031 err = load_superblock(journal); in jbd2_journal_wipe()
2035 if (!journal->j_tail) in jbd2_journal_wipe()
2041 err = jbd2_journal_skip_recovery(journal); in jbd2_journal_wipe()
2044 mutex_lock(&journal->j_checkpoint_mutex); in jbd2_journal_wipe()
2045 jbd2_mark_journal_empty(journal, WRITE_FUA); in jbd2_journal_wipe()
2046 mutex_unlock(&journal->j_checkpoint_mutex); in jbd2_journal_wipe()
2066 void __jbd2_journal_abort_hard(journal_t *journal) in __jbd2_journal_abort_hard() argument
2070 if (journal->j_flags & JBD2_ABORT) in __jbd2_journal_abort_hard()
2074 journal->j_devname); in __jbd2_journal_abort_hard()
2076 write_lock(&journal->j_state_lock); in __jbd2_journal_abort_hard()
2077 journal->j_flags |= JBD2_ABORT; in __jbd2_journal_abort_hard()
2078 transaction = journal->j_running_transaction; in __jbd2_journal_abort_hard()
2080 __jbd2_log_start_commit(journal, transaction->t_tid); in __jbd2_journal_abort_hard()
2081 write_unlock(&journal->j_state_lock); in __jbd2_journal_abort_hard()
2086 static void __journal_abort_soft (journal_t *journal, int errno) in __journal_abort_soft() argument
2088 if (journal->j_flags & JBD2_ABORT) in __journal_abort_soft()
2091 if (!journal->j_errno) in __journal_abort_soft()
2092 journal->j_errno = errno; in __journal_abort_soft()
2094 __jbd2_journal_abort_hard(journal); in __journal_abort_soft()
2097 jbd2_journal_update_sb_errno(journal); in __journal_abort_soft()
2098 write_lock(&journal->j_state_lock); in __journal_abort_soft()
2099 journal->j_flags |= JBD2_REC_ERR; in __journal_abort_soft()
2100 write_unlock(&journal->j_state_lock); in __journal_abort_soft()
2150 void jbd2_journal_abort(journal_t *journal, int errno) in jbd2_journal_abort() argument
2152 __journal_abort_soft(journal, errno); in jbd2_journal_abort()
2166 int jbd2_journal_errno(journal_t *journal) in jbd2_journal_errno() argument
2170 read_lock(&journal->j_state_lock); in jbd2_journal_errno()
2171 if (journal->j_flags & JBD2_ABORT) in jbd2_journal_errno()
2174 err = journal->j_errno; in jbd2_journal_errno()
2175 read_unlock(&journal->j_state_lock); in jbd2_journal_errno()
2186 int jbd2_journal_clear_err(journal_t *journal) in jbd2_journal_clear_err() argument
2190 write_lock(&journal->j_state_lock); in jbd2_journal_clear_err()
2191 if (journal->j_flags & JBD2_ABORT) in jbd2_journal_clear_err()
2194 journal->j_errno = 0; in jbd2_journal_clear_err()
2195 write_unlock(&journal->j_state_lock); in jbd2_journal_clear_err()
2206 void jbd2_journal_ack_err(journal_t *journal) in jbd2_journal_ack_err() argument
2208 write_lock(&journal->j_state_lock); in jbd2_journal_ack_err()
2209 if (journal->j_errno) in jbd2_journal_ack_err()
2210 journal->j_flags |= JBD2_ACK_ERR; in jbd2_journal_ack_err()
2211 write_unlock(&journal->j_state_lock); in jbd2_journal_ack_err()
2222 size_t journal_tag_bytes(journal_t *journal) in journal_tag_bytes() argument
2226 if (JBD2_HAS_INCOMPAT_FEATURE(journal, JBD2_FEATURE_INCOMPAT_CSUM_V3)) in journal_tag_bytes()
2231 if (JBD2_HAS_INCOMPAT_FEATURE(journal, JBD2_FEATURE_INCOMPAT_CSUM_V2)) in journal_tag_bytes()
2234 if (JBD2_HAS_INCOMPAT_FEATURE(journal, JBD2_FEATURE_INCOMPAT_64BIT)) in journal_tag_bytes()
2583 void jbd2_journal_release_jbd_inode(journal_t *journal, in jbd2_journal_release_jbd_inode() argument
2586 if (!journal) in jbd2_journal_release_jbd_inode()
2589 spin_lock(&journal->j_list_lock); in jbd2_journal_release_jbd_inode()
2596 spin_unlock(&journal->j_list_lock); in jbd2_journal_release_jbd_inode()
2606 spin_unlock(&journal->j_list_lock); in jbd2_journal_release_jbd_inode()