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
462 new_bh->b_bdev = journal->j_dev; in jbd2_journal_write_metadata_buffer()
476 spin_lock(&journal->j_list_lock); in jbd2_journal_write_metadata_buffer()
478 spin_unlock(&journal->j_list_lock); in jbd2_journal_write_metadata_buffer()
494 int __jbd2_log_start_commit(journal_t *journal, tid_t target) in __jbd2_log_start_commit() argument
497 if (journal->j_commit_request == target) in __jbd2_log_start_commit()
505 if (journal->j_running_transaction && in __jbd2_log_start_commit()
506 journal->j_running_transaction->t_tid == target) { in __jbd2_log_start_commit()
512 journal->j_commit_request = target; in __jbd2_log_start_commit()
514 journal->j_commit_request, in __jbd2_log_start_commit()
515 journal->j_commit_sequence); in __jbd2_log_start_commit()
516 journal->j_running_transaction->t_requested = jiffies; in __jbd2_log_start_commit()
517 wake_up(&journal->j_wait_commit); in __jbd2_log_start_commit()
519 } else if (!tid_geq(journal->j_commit_request, target)) in __jbd2_log_start_commit()
524 journal->j_commit_request, in __jbd2_log_start_commit()
525 journal->j_commit_sequence, in __jbd2_log_start_commit()
526 target, journal->j_running_transaction ? in __jbd2_log_start_commit()
527 journal->j_running_transaction->t_tid : 0); in __jbd2_log_start_commit()
531 int jbd2_log_start_commit(journal_t *journal, tid_t tid) in jbd2_log_start_commit() argument
535 write_lock(&journal->j_state_lock); in jbd2_log_start_commit()
536 ret = __jbd2_log_start_commit(journal, tid); in jbd2_log_start_commit()
537 write_unlock(&journal->j_state_lock); in jbd2_log_start_commit()
548 static int __jbd2_journal_force_commit(journal_t *journal) in __jbd2_journal_force_commit() argument
554 read_lock(&journal->j_state_lock); in __jbd2_journal_force_commit()
555 if (journal->j_running_transaction && !current->journal_info) { in __jbd2_journal_force_commit()
556 transaction = journal->j_running_transaction; in __jbd2_journal_force_commit()
557 if (!tid_geq(journal->j_commit_request, transaction->t_tid)) in __jbd2_journal_force_commit()
559 } else if (journal->j_committing_transaction) in __jbd2_journal_force_commit()
560 transaction = journal->j_committing_transaction; in __jbd2_journal_force_commit()
564 read_unlock(&journal->j_state_lock); in __jbd2_journal_force_commit()
568 read_unlock(&journal->j_state_lock); in __jbd2_journal_force_commit()
570 jbd2_log_start_commit(journal, tid); in __jbd2_journal_force_commit()
571 ret = jbd2_log_wait_commit(journal, tid); in __jbd2_journal_force_commit()
586 int jbd2_journal_force_commit_nested(journal_t *journal) in jbd2_journal_force_commit_nested() argument
590 ret = __jbd2_journal_force_commit(journal); in jbd2_journal_force_commit_nested()
601 int jbd2_journal_force_commit(journal_t *journal) in jbd2_journal_force_commit() argument
606 ret = __jbd2_journal_force_commit(journal); in jbd2_journal_force_commit()
617 int jbd2_journal_start_commit(journal_t *journal, tid_t *ptid) in jbd2_journal_start_commit() argument
621 write_lock(&journal->j_state_lock); in jbd2_journal_start_commit()
622 if (journal->j_running_transaction) { in jbd2_journal_start_commit()
623 tid_t tid = journal->j_running_transaction->t_tid; in jbd2_journal_start_commit()
625 __jbd2_log_start_commit(journal, tid); in jbd2_journal_start_commit()
631 } else if (journal->j_committing_transaction) { in jbd2_journal_start_commit()
637 *ptid = journal->j_committing_transaction->t_tid; in jbd2_journal_start_commit()
640 write_unlock(&journal->j_state_lock); in jbd2_journal_start_commit()
650 int jbd2_trans_will_send_data_barrier(journal_t *journal, tid_t tid) in jbd2_trans_will_send_data_barrier() argument
655 if (!(journal->j_flags & JBD2_BARRIER)) in jbd2_trans_will_send_data_barrier()
657 read_lock(&journal->j_state_lock); in jbd2_trans_will_send_data_barrier()
659 if (tid_geq(journal->j_commit_sequence, tid)) in jbd2_trans_will_send_data_barrier()
661 commit_trans = journal->j_committing_transaction; in jbd2_trans_will_send_data_barrier()
670 if (journal->j_fs_dev != journal->j_dev) { in jbd2_trans_will_send_data_barrier()
680 read_unlock(&journal->j_state_lock); in jbd2_trans_will_send_data_barrier()
689 int jbd2_log_wait_commit(journal_t *journal, tid_t tid) in jbd2_log_wait_commit() argument
693 read_lock(&journal->j_state_lock); in jbd2_log_wait_commit()
695 if (!tid_geq(journal->j_commit_request, tid)) { in jbd2_log_wait_commit()
698 __func__, journal->j_commit_request, tid); in jbd2_log_wait_commit()
701 while (tid_gt(tid, journal->j_commit_sequence)) { in jbd2_log_wait_commit()
703 tid, journal->j_commit_sequence); in jbd2_log_wait_commit()
704 read_unlock(&journal->j_state_lock); in jbd2_log_wait_commit()
705 wake_up(&journal->j_wait_commit); in jbd2_log_wait_commit()
706 wait_event(journal->j_wait_done_commit, in jbd2_log_wait_commit()
707 !tid_gt(tid, journal->j_commit_sequence)); in jbd2_log_wait_commit()
708 read_lock(&journal->j_state_lock); in jbd2_log_wait_commit()
710 read_unlock(&journal->j_state_lock); in jbd2_log_wait_commit()
712 if (unlikely(is_journal_aborted(journal))) in jbd2_log_wait_commit()
724 int jbd2_complete_transaction(journal_t *journal, tid_t tid) in jbd2_complete_transaction() argument
728 read_lock(&journal->j_state_lock); in jbd2_complete_transaction()
729 if (journal->j_running_transaction && in jbd2_complete_transaction()
730 journal->j_running_transaction->t_tid == tid) { in jbd2_complete_transaction()
731 if (journal->j_commit_request != tid) { in jbd2_complete_transaction()
733 read_unlock(&journal->j_state_lock); in jbd2_complete_transaction()
734 jbd2_log_start_commit(journal, tid); in jbd2_complete_transaction()
737 } else if (!(journal->j_committing_transaction && in jbd2_complete_transaction()
738 journal->j_committing_transaction->t_tid == tid)) in jbd2_complete_transaction()
740 read_unlock(&journal->j_state_lock); in jbd2_complete_transaction()
744 return jbd2_log_wait_commit(journal, tid); in jbd2_complete_transaction()
752 int jbd2_journal_next_log_block(journal_t *journal, unsigned long long *retp) in jbd2_journal_next_log_block() argument
756 write_lock(&journal->j_state_lock); in jbd2_journal_next_log_block()
757 J_ASSERT(journal->j_free > 1); in jbd2_journal_next_log_block()
759 blocknr = journal->j_head; in jbd2_journal_next_log_block()
760 journal->j_head++; in jbd2_journal_next_log_block()
761 journal->j_free--; in jbd2_journal_next_log_block()
762 if (journal->j_head == journal->j_last) in jbd2_journal_next_log_block()
763 journal->j_head = journal->j_first; in jbd2_journal_next_log_block()
764 write_unlock(&journal->j_state_lock); in jbd2_journal_next_log_block()
765 return jbd2_journal_bmap(journal, blocknr, retp); in jbd2_journal_next_log_block()
775 int jbd2_journal_bmap(journal_t *journal, unsigned long blocknr, in jbd2_journal_bmap() argument
781 if (journal->j_inode) { in jbd2_journal_bmap()
782 ret = bmap(journal->j_inode, blocknr); in jbd2_journal_bmap()
788 __func__, blocknr, journal->j_devname); in jbd2_journal_bmap()
790 __journal_abort_soft(journal, err); in jbd2_journal_bmap()
808 struct buffer_head *jbd2_journal_get_descriptor_buffer(journal_t *journal) in jbd2_journal_get_descriptor_buffer() argument
814 err = jbd2_journal_next_log_block(journal, &blocknr); in jbd2_journal_get_descriptor_buffer()
819 bh = __getblk(journal->j_dev, blocknr, journal->j_blocksize); in jbd2_journal_get_descriptor_buffer()
823 memset(bh->b_data, 0, journal->j_blocksize); in jbd2_journal_get_descriptor_buffer()
840 int jbd2_journal_get_log_tail(journal_t *journal, tid_t *tid, in jbd2_journal_get_log_tail() argument
846 read_lock(&journal->j_state_lock); in jbd2_journal_get_log_tail()
847 spin_lock(&journal->j_list_lock); in jbd2_journal_get_log_tail()
848 transaction = journal->j_checkpoint_transactions; in jbd2_journal_get_log_tail()
852 } else if ((transaction = journal->j_committing_transaction) != NULL) { in jbd2_journal_get_log_tail()
855 } else if ((transaction = journal->j_running_transaction) != NULL) { in jbd2_journal_get_log_tail()
857 *block = journal->j_head; in jbd2_journal_get_log_tail()
859 *tid = journal->j_transaction_sequence; in jbd2_journal_get_log_tail()
860 *block = journal->j_head; in jbd2_journal_get_log_tail()
862 ret = tid_gt(*tid, journal->j_tail_sequence); in jbd2_journal_get_log_tail()
863 spin_unlock(&journal->j_list_lock); in jbd2_journal_get_log_tail()
864 read_unlock(&journal->j_state_lock); in jbd2_journal_get_log_tail()
879 int __jbd2_update_log_tail(journal_t *journal, tid_t tid, unsigned long block) in __jbd2_update_log_tail() argument
884 BUG_ON(!mutex_is_locked(&journal->j_checkpoint_mutex)); in __jbd2_update_log_tail()
892 ret = jbd2_journal_update_sb_log_tail(journal, tid, block, WRITE_FUA); in __jbd2_update_log_tail()
896 write_lock(&journal->j_state_lock); in __jbd2_update_log_tail()
897 freed = block - journal->j_tail; in __jbd2_update_log_tail()
898 if (block < journal->j_tail) in __jbd2_update_log_tail()
899 freed += journal->j_last - journal->j_first; in __jbd2_update_log_tail()
901 trace_jbd2_update_log_tail(journal, tid, block, freed); in __jbd2_update_log_tail()
905 journal->j_tail_sequence, tid, block, freed); in __jbd2_update_log_tail()
907 journal->j_free += freed; in __jbd2_update_log_tail()
908 journal->j_tail_sequence = tid; in __jbd2_update_log_tail()
909 journal->j_tail = block; in __jbd2_update_log_tail()
910 write_unlock(&journal->j_state_lock); in __jbd2_update_log_tail()
921 void jbd2_update_log_tail(journal_t *journal, tid_t tid, unsigned long block) in jbd2_update_log_tail() argument
923 mutex_lock(&journal->j_checkpoint_mutex); in jbd2_update_log_tail()
924 if (tid_gt(tid, journal->j_tail_sequence)) in jbd2_update_log_tail()
925 __jbd2_update_log_tail(journal, tid, block); in jbd2_update_log_tail()
926 mutex_unlock(&journal->j_checkpoint_mutex); in jbd2_update_log_tail()
930 journal_t *journal; member
955 s->journal->j_max_transaction_buffers); in jbd2_seq_info_show()
973 div_u64(s->journal->j_average_commit_time, 1000)); in jbd2_seq_info_show()
996 journal_t *journal = PDE_DATA(inode); in jbd2_seq_info_open() local
1009 spin_lock(&journal->j_history_lock); in jbd2_seq_info_open()
1010 memcpy(s->stats, &journal->j_stats, size); in jbd2_seq_info_open()
1011 s->journal = journal; in jbd2_seq_info_open()
1012 spin_unlock(&journal->j_history_lock); in jbd2_seq_info_open()
1045 static void jbd2_stats_proc_init(journal_t *journal) in jbd2_stats_proc_init() argument
1047 journal->j_proc_entry = proc_mkdir(journal->j_devname, proc_jbd2_stats); in jbd2_stats_proc_init()
1048 if (journal->j_proc_entry) { in jbd2_stats_proc_init()
1049 proc_create_data("info", S_IRUGO, journal->j_proc_entry, in jbd2_stats_proc_init()
1050 &jbd2_seq_info_fops, journal); in jbd2_stats_proc_init()
1054 static void jbd2_stats_proc_exit(journal_t *journal) in jbd2_stats_proc_exit() argument
1056 remove_proc_entry("info", journal->j_proc_entry); in jbd2_stats_proc_exit()
1057 remove_proc_entry(journal->j_devname, proc_jbd2_stats); in jbd2_stats_proc_exit()
1071 journal_t *journal; in journal_init_common() local
1074 journal = kzalloc(sizeof(*journal), GFP_KERNEL); in journal_init_common()
1075 if (!journal) in journal_init_common()
1078 init_waitqueue_head(&journal->j_wait_transaction_locked); in journal_init_common()
1079 init_waitqueue_head(&journal->j_wait_done_commit); in journal_init_common()
1080 init_waitqueue_head(&journal->j_wait_commit); in journal_init_common()
1081 init_waitqueue_head(&journal->j_wait_updates); in journal_init_common()
1082 init_waitqueue_head(&journal->j_wait_reserved); in journal_init_common()
1083 mutex_init(&journal->j_barrier); in journal_init_common()
1084 mutex_init(&journal->j_checkpoint_mutex); in journal_init_common()
1085 spin_lock_init(&journal->j_revoke_lock); in journal_init_common()
1086 spin_lock_init(&journal->j_list_lock); in journal_init_common()
1087 rwlock_init(&journal->j_state_lock); in journal_init_common()
1089 journal->j_commit_interval = (HZ * JBD2_DEFAULT_MAX_COMMIT_AGE); in journal_init_common()
1090 journal->j_min_batch_time = 0; in journal_init_common()
1091 journal->j_max_batch_time = 15000; /* 15ms */ in journal_init_common()
1092 atomic_set(&journal->j_reserved_credits, 0); in journal_init_common()
1095 journal->j_flags = JBD2_ABORT; in journal_init_common()
1098 err = jbd2_journal_init_revoke(journal, JOURNAL_REVOKE_DEFAULT_HASH); in journal_init_common()
1100 kfree(journal); in journal_init_common()
1104 spin_lock_init(&journal->j_history_lock); in journal_init_common()
1106 return journal; in journal_init_common()
1136 journal_t *journal = journal_init_common(); in jbd2_journal_init_dev() local
1140 if (!journal) in jbd2_journal_init_dev()
1144 journal->j_blocksize = blocksize; in jbd2_journal_init_dev()
1145 journal->j_dev = bdev; in jbd2_journal_init_dev()
1146 journal->j_fs_dev = fs_dev; in jbd2_journal_init_dev()
1147 journal->j_blk_offset = start; in jbd2_journal_init_dev()
1148 journal->j_maxlen = len; in jbd2_journal_init_dev()
1149 bdevname(journal->j_dev, journal->j_devname); in jbd2_journal_init_dev()
1150 strreplace(journal->j_devname, '/', '!'); in jbd2_journal_init_dev()
1151 jbd2_stats_proc_init(journal); in jbd2_journal_init_dev()
1152 n = journal->j_blocksize / sizeof(journal_block_tag_t); in jbd2_journal_init_dev()
1153 journal->j_wbufsize = n; in jbd2_journal_init_dev()
1154 journal->j_wbuf = kmalloc(n * sizeof(struct buffer_head*), GFP_KERNEL); in jbd2_journal_init_dev()
1155 if (!journal->j_wbuf) { in jbd2_journal_init_dev()
1161 bh = __getblk(journal->j_dev, start, journal->j_blocksize); in jbd2_journal_init_dev()
1168 journal->j_sb_buffer = bh; in jbd2_journal_init_dev()
1169 journal->j_superblock = (journal_superblock_t *)bh->b_data; in jbd2_journal_init_dev()
1171 return journal; in jbd2_journal_init_dev()
1173 kfree(journal->j_wbuf); in jbd2_journal_init_dev()
1174 jbd2_stats_proc_exit(journal); in jbd2_journal_init_dev()
1175 kfree(journal); in jbd2_journal_init_dev()
1190 journal_t *journal = journal_init_common(); in jbd2_journal_init_inode() local
1196 if (!journal) in jbd2_journal_init_inode()
1199 journal->j_dev = journal->j_fs_dev = inode->i_sb->s_bdev; in jbd2_journal_init_inode()
1200 journal->j_inode = inode; in jbd2_journal_init_inode()
1201 bdevname(journal->j_dev, journal->j_devname); in jbd2_journal_init_inode()
1202 p = strreplace(journal->j_devname, '/', '!'); in jbd2_journal_init_inode()
1203 sprintf(p, "-%lu", journal->j_inode->i_ino); in jbd2_journal_init_inode()
1206 journal, inode->i_sb->s_id, inode->i_ino, in jbd2_journal_init_inode()
1210 journal->j_maxlen = inode->i_size >> inode->i_sb->s_blocksize_bits; in jbd2_journal_init_inode()
1211 journal->j_blocksize = inode->i_sb->s_blocksize; in jbd2_journal_init_inode()
1212 jbd2_stats_proc_init(journal); in jbd2_journal_init_inode()
1215 n = journal->j_blocksize / sizeof(journal_block_tag_t); in jbd2_journal_init_inode()
1216 journal->j_wbufsize = n; in jbd2_journal_init_inode()
1217 journal->j_wbuf = kmalloc(n * sizeof(struct buffer_head*), GFP_KERNEL); in jbd2_journal_init_inode()
1218 if (!journal->j_wbuf) { in jbd2_journal_init_inode()
1224 err = jbd2_journal_bmap(journal, 0, &blocknr); in jbd2_journal_init_inode()
1232 bh = getblk_unmovable(journal->j_dev, blocknr, journal->j_blocksize); in jbd2_journal_init_inode()
1239 journal->j_sb_buffer = bh; in jbd2_journal_init_inode()
1240 journal->j_superblock = (journal_superblock_t *)bh->b_data; in jbd2_journal_init_inode()
1242 return journal; in jbd2_journal_init_inode()
1244 kfree(journal->j_wbuf); in jbd2_journal_init_inode()
1245 jbd2_stats_proc_exit(journal); in jbd2_journal_init_inode()
1246 kfree(journal); in jbd2_journal_init_inode()
1255 static void journal_fail_superblock (journal_t *journal) in journal_fail_superblock() argument
1257 struct buffer_head *bh = journal->j_sb_buffer; in journal_fail_superblock()
1259 journal->j_sb_buffer = NULL; in journal_fail_superblock()
1269 static int journal_reset(journal_t *journal) in journal_reset() argument
1271 journal_superblock_t *sb = journal->j_superblock; in journal_reset()
1279 journal_fail_superblock(journal); in journal_reset()
1283 journal->j_first = first; in journal_reset()
1284 journal->j_last = last; in journal_reset()
1286 journal->j_head = first; in journal_reset()
1287 journal->j_tail = first; in journal_reset()
1288 journal->j_free = last - first; in journal_reset()
1290 journal->j_tail_sequence = journal->j_transaction_sequence; in journal_reset()
1291 journal->j_commit_sequence = journal->j_transaction_sequence - 1; in journal_reset()
1292 journal->j_commit_request = journal->j_commit_sequence; in journal_reset()
1294 journal->j_max_transaction_buffers = journal->j_maxlen / 4; in journal_reset()
1305 journal->j_tail, journal->j_tail_sequence, in journal_reset()
1306 journal->j_errno); in journal_reset()
1307 journal->j_flags |= JBD2_FLUSHED; in journal_reset()
1310 mutex_lock(&journal->j_checkpoint_mutex); in journal_reset()
1317 jbd2_journal_update_sb_log_tail(journal, in journal_reset()
1318 journal->j_tail_sequence, in journal_reset()
1319 journal->j_tail, in journal_reset()
1321 mutex_unlock(&journal->j_checkpoint_mutex); in journal_reset()
1323 return jbd2_journal_start_thread(journal); in journal_reset()
1326 static int jbd2_write_superblock(journal_t *journal, int write_op) in jbd2_write_superblock() argument
1328 struct buffer_head *bh = journal->j_sb_buffer; in jbd2_write_superblock()
1329 journal_superblock_t *sb = journal->j_superblock; in jbd2_write_superblock()
1332 trace_jbd2_write_superblock(journal, write_op); in jbd2_write_superblock()
1333 if (!(journal->j_flags & JBD2_BARRIER)) in jbd2_write_superblock()
1347 journal->j_devname); in jbd2_write_superblock()
1351 jbd2_superblock_csum_set(journal, sb); in jbd2_write_superblock()
1364 journal->j_devname); in jbd2_write_superblock()
1365 jbd2_journal_abort(journal, ret); in jbd2_write_superblock()
1381 int jbd2_journal_update_sb_log_tail(journal_t *journal, tid_t tail_tid, in jbd2_journal_update_sb_log_tail() argument
1384 journal_superblock_t *sb = journal->j_superblock; in jbd2_journal_update_sb_log_tail()
1387 BUG_ON(!mutex_is_locked(&journal->j_checkpoint_mutex)); in jbd2_journal_update_sb_log_tail()
1394 ret = jbd2_write_superblock(journal, write_op); in jbd2_journal_update_sb_log_tail()
1399 write_lock(&journal->j_state_lock); in jbd2_journal_update_sb_log_tail()
1401 journal->j_flags &= ~JBD2_FLUSHED; in jbd2_journal_update_sb_log_tail()
1402 write_unlock(&journal->j_state_lock); in jbd2_journal_update_sb_log_tail()
1416 static void jbd2_mark_journal_empty(journal_t *journal, int write_op) in jbd2_mark_journal_empty() argument
1418 journal_superblock_t *sb = journal->j_superblock; in jbd2_mark_journal_empty()
1420 BUG_ON(!mutex_is_locked(&journal->j_checkpoint_mutex)); in jbd2_mark_journal_empty()
1421 read_lock(&journal->j_state_lock); in jbd2_mark_journal_empty()
1424 read_unlock(&journal->j_state_lock); in jbd2_mark_journal_empty()
1428 journal->j_tail_sequence); in jbd2_mark_journal_empty()
1430 sb->s_sequence = cpu_to_be32(journal->j_tail_sequence); in jbd2_mark_journal_empty()
1432 read_unlock(&journal->j_state_lock); in jbd2_mark_journal_empty()
1434 jbd2_write_superblock(journal, write_op); in jbd2_mark_journal_empty()
1437 write_lock(&journal->j_state_lock); in jbd2_mark_journal_empty()
1438 journal->j_flags |= JBD2_FLUSHED; in jbd2_mark_journal_empty()
1439 write_unlock(&journal->j_state_lock); in jbd2_mark_journal_empty()
1450 void jbd2_journal_update_sb_errno(journal_t *journal) in jbd2_journal_update_sb_errno() argument
1452 journal_superblock_t *sb = journal->j_superblock; in jbd2_journal_update_sb_errno()
1454 read_lock(&journal->j_state_lock); in jbd2_journal_update_sb_errno()
1456 journal->j_errno); in jbd2_journal_update_sb_errno()
1457 sb->s_errno = cpu_to_be32(journal->j_errno); in jbd2_journal_update_sb_errno()
1458 read_unlock(&journal->j_state_lock); in jbd2_journal_update_sb_errno()
1460 jbd2_write_superblock(journal, WRITE_FUA); in jbd2_journal_update_sb_errno()
1468 static int journal_get_superblock(journal_t *journal) in journal_get_superblock() argument
1474 bh = journal->j_sb_buffer; in journal_get_superblock()
1490 sb = journal->j_superblock; in journal_get_superblock()
1495 sb->s_blocksize != cpu_to_be32(journal->j_blocksize)) { in journal_get_superblock()
1502 journal->j_format_version = 1; in journal_get_superblock()
1505 journal->j_format_version = 2; in journal_get_superblock()
1512 if (be32_to_cpu(sb->s_maxlen) < journal->j_maxlen) in journal_get_superblock()
1513 journal->j_maxlen = be32_to_cpu(sb->s_maxlen); in journal_get_superblock()
1514 else if (be32_to_cpu(sb->s_maxlen) > journal->j_maxlen) { in journal_get_superblock()
1520 be32_to_cpu(sb->s_first) >= journal->j_maxlen) { in journal_get_superblock()
1527 if (jbd2_has_feature_csum2(journal) && in journal_get_superblock()
1528 jbd2_has_feature_csum3(journal)) { in journal_get_superblock()
1535 if (jbd2_journal_has_csum_v2or3_feature(journal) && in journal_get_superblock()
1536 jbd2_has_feature_checksum(journal)) { in journal_get_superblock()
1543 if (!jbd2_verify_csum_type(journal, sb)) { in journal_get_superblock()
1549 if (jbd2_journal_has_csum_v2or3_feature(journal)) { in journal_get_superblock()
1550 journal->j_chksum_driver = crypto_alloc_shash("crc32c", 0, 0); in journal_get_superblock()
1551 if (IS_ERR(journal->j_chksum_driver)) { in journal_get_superblock()
1553 err = PTR_ERR(journal->j_chksum_driver); in journal_get_superblock()
1554 journal->j_chksum_driver = NULL; in journal_get_superblock()
1560 if (!jbd2_superblock_csum_verify(journal, sb)) { in journal_get_superblock()
1567 if (jbd2_journal_has_csum_v2or3(journal)) in journal_get_superblock()
1568 journal->j_csum_seed = jbd2_chksum(journal, ~0, sb->s_uuid, in journal_get_superblock()
1576 journal_fail_superblock(journal); in journal_get_superblock()
1585 static int load_superblock(journal_t *journal) in load_superblock() argument
1590 err = journal_get_superblock(journal); in load_superblock()
1594 sb = journal->j_superblock; in load_superblock()
1596 journal->j_tail_sequence = be32_to_cpu(sb->s_sequence); in load_superblock()
1597 journal->j_tail = be32_to_cpu(sb->s_start); in load_superblock()
1598 journal->j_first = be32_to_cpu(sb->s_first); in load_superblock()
1599 journal->j_last = be32_to_cpu(sb->s_maxlen); in load_superblock()
1600 journal->j_errno = be32_to_cpu(sb->s_errno); in load_superblock()
1614 int jbd2_journal_load(journal_t *journal) in jbd2_journal_load() argument
1619 err = load_superblock(journal); in jbd2_journal_load()
1623 sb = journal->j_superblock; in jbd2_journal_load()
1627 if (journal->j_format_version >= 2) { in jbd2_journal_load()
1647 if (jbd2_journal_recover(journal)) in jbd2_journal_load()
1650 if (journal->j_failed_commit) { in jbd2_journal_load()
1652 "is corrupt.\n", journal->j_failed_commit, in jbd2_journal_load()
1653 journal->j_devname); in jbd2_journal_load()
1660 if (journal_reset(journal)) in jbd2_journal_load()
1663 journal->j_flags &= ~JBD2_ABORT; in jbd2_journal_load()
1664 journal->j_flags |= JBD2_LOADED; in jbd2_journal_load()
1680 int jbd2_journal_destroy(journal_t *journal) in jbd2_journal_destroy() argument
1685 journal_kill_thread(journal); in jbd2_journal_destroy()
1688 if (journal->j_running_transaction) in jbd2_journal_destroy()
1689 jbd2_journal_commit_transaction(journal); in jbd2_journal_destroy()
1694 spin_lock(&journal->j_list_lock); in jbd2_journal_destroy()
1695 while (journal->j_checkpoint_transactions != NULL) { in jbd2_journal_destroy()
1696 spin_unlock(&journal->j_list_lock); in jbd2_journal_destroy()
1697 mutex_lock(&journal->j_checkpoint_mutex); in jbd2_journal_destroy()
1698 err = jbd2_log_do_checkpoint(journal); in jbd2_journal_destroy()
1699 mutex_unlock(&journal->j_checkpoint_mutex); in jbd2_journal_destroy()
1705 jbd2_journal_destroy_checkpoint(journal); in jbd2_journal_destroy()
1706 spin_lock(&journal->j_list_lock); in jbd2_journal_destroy()
1709 spin_lock(&journal->j_list_lock); in jbd2_journal_destroy()
1712 J_ASSERT(journal->j_running_transaction == NULL); in jbd2_journal_destroy()
1713 J_ASSERT(journal->j_committing_transaction == NULL); in jbd2_journal_destroy()
1714 J_ASSERT(journal->j_checkpoint_transactions == NULL); in jbd2_journal_destroy()
1715 spin_unlock(&journal->j_list_lock); in jbd2_journal_destroy()
1717 if (journal->j_sb_buffer) { in jbd2_journal_destroy()
1718 if (!is_journal_aborted(journal)) { in jbd2_journal_destroy()
1719 mutex_lock(&journal->j_checkpoint_mutex); in jbd2_journal_destroy()
1721 write_lock(&journal->j_state_lock); in jbd2_journal_destroy()
1722 journal->j_tail_sequence = in jbd2_journal_destroy()
1723 ++journal->j_transaction_sequence; in jbd2_journal_destroy()
1724 write_unlock(&journal->j_state_lock); in jbd2_journal_destroy()
1726 jbd2_mark_journal_empty(journal, WRITE_FLUSH_FUA); in jbd2_journal_destroy()
1727 mutex_unlock(&journal->j_checkpoint_mutex); in jbd2_journal_destroy()
1730 brelse(journal->j_sb_buffer); in jbd2_journal_destroy()
1733 if (journal->j_proc_entry) in jbd2_journal_destroy()
1734 jbd2_stats_proc_exit(journal); in jbd2_journal_destroy()
1735 iput(journal->j_inode); in jbd2_journal_destroy()
1736 if (journal->j_revoke) in jbd2_journal_destroy()
1737 jbd2_journal_destroy_revoke(journal); in jbd2_journal_destroy()
1738 if (journal->j_chksum_driver) in jbd2_journal_destroy()
1739 crypto_free_shash(journal->j_chksum_driver); in jbd2_journal_destroy()
1740 kfree(journal->j_wbuf); in jbd2_journal_destroy()
1741 kfree(journal); in jbd2_journal_destroy()
1758 int jbd2_journal_check_used_features (journal_t *journal, unsigned long compat, in jbd2_journal_check_used_features() argument
1766 if (journal->j_format_version == 0 && in jbd2_journal_check_used_features()
1767 journal_get_superblock(journal) != 0) in jbd2_journal_check_used_features()
1769 if (journal->j_format_version == 1) in jbd2_journal_check_used_features()
1772 sb = journal->j_superblock; in jbd2_journal_check_used_features()
1793 int jbd2_journal_check_available_features (journal_t *journal, unsigned long compat, in jbd2_journal_check_available_features() argument
1803 if (journal->j_format_version != 2) in jbd2_journal_check_available_features()
1826 int jbd2_journal_set_features (journal_t *journal, unsigned long compat, in jbd2_journal_set_features() argument
1835 if (jbd2_journal_check_used_features(journal, compat, ro, incompat)) in jbd2_journal_set_features()
1838 if (!jbd2_journal_check_available_features(journal, compat, ro, incompat)) in jbd2_journal_set_features()
1855 sb = journal->j_superblock; in jbd2_journal_set_features()
1864 if (journal->j_chksum_driver == NULL) { in jbd2_journal_set_features()
1865 journal->j_chksum_driver = crypto_alloc_shash("crc32c", in jbd2_journal_set_features()
1867 if (IS_ERR(journal->j_chksum_driver)) { in jbd2_journal_set_features()
1870 journal->j_chksum_driver = NULL; in jbd2_journal_set_features()
1875 journal->j_csum_seed = jbd2_chksum(journal, ~0, in jbd2_journal_set_features()
1907 void jbd2_journal_clear_features(journal_t *journal, unsigned long compat, in jbd2_journal_clear_features() argument
1915 sb = journal->j_superblock; in jbd2_journal_clear_features()
1932 int jbd2_journal_flush(journal_t *journal) in jbd2_journal_flush() argument
1937 write_lock(&journal->j_state_lock); in jbd2_journal_flush()
1940 if (journal->j_running_transaction) { in jbd2_journal_flush()
1941 transaction = journal->j_running_transaction; in jbd2_journal_flush()
1942 __jbd2_log_start_commit(journal, transaction->t_tid); in jbd2_journal_flush()
1943 } else if (journal->j_committing_transaction) in jbd2_journal_flush()
1944 transaction = journal->j_committing_transaction; in jbd2_journal_flush()
1950 write_unlock(&journal->j_state_lock); in jbd2_journal_flush()
1951 jbd2_log_wait_commit(journal, tid); in jbd2_journal_flush()
1953 write_unlock(&journal->j_state_lock); in jbd2_journal_flush()
1957 spin_lock(&journal->j_list_lock); in jbd2_journal_flush()
1958 while (!err && journal->j_checkpoint_transactions != NULL) { in jbd2_journal_flush()
1959 spin_unlock(&journal->j_list_lock); in jbd2_journal_flush()
1960 mutex_lock(&journal->j_checkpoint_mutex); in jbd2_journal_flush()
1961 err = jbd2_log_do_checkpoint(journal); in jbd2_journal_flush()
1962 mutex_unlock(&journal->j_checkpoint_mutex); in jbd2_journal_flush()
1963 spin_lock(&journal->j_list_lock); in jbd2_journal_flush()
1965 spin_unlock(&journal->j_list_lock); in jbd2_journal_flush()
1967 if (is_journal_aborted(journal)) in jbd2_journal_flush()
1970 mutex_lock(&journal->j_checkpoint_mutex); in jbd2_journal_flush()
1972 err = jbd2_cleanup_journal_tail(journal); in jbd2_journal_flush()
1974 mutex_unlock(&journal->j_checkpoint_mutex); in jbd2_journal_flush()
1985 jbd2_mark_journal_empty(journal, WRITE_FUA); in jbd2_journal_flush()
1986 mutex_unlock(&journal->j_checkpoint_mutex); in jbd2_journal_flush()
1987 write_lock(&journal->j_state_lock); in jbd2_journal_flush()
1988 J_ASSERT(!journal->j_running_transaction); in jbd2_journal_flush()
1989 J_ASSERT(!journal->j_committing_transaction); in jbd2_journal_flush()
1990 J_ASSERT(!journal->j_checkpoint_transactions); in jbd2_journal_flush()
1991 J_ASSERT(journal->j_head == journal->j_tail); in jbd2_journal_flush()
1992 J_ASSERT(journal->j_tail_sequence == journal->j_transaction_sequence); in jbd2_journal_flush()
1993 write_unlock(&journal->j_state_lock); in jbd2_journal_flush()
2011 int jbd2_journal_wipe(journal_t *journal, int write) in jbd2_journal_wipe() argument
2015 J_ASSERT (!(journal->j_flags & JBD2_LOADED)); in jbd2_journal_wipe()
2017 err = load_superblock(journal); in jbd2_journal_wipe()
2021 if (!journal->j_tail) in jbd2_journal_wipe()
2027 err = jbd2_journal_skip_recovery(journal); in jbd2_journal_wipe()
2030 mutex_lock(&journal->j_checkpoint_mutex); in jbd2_journal_wipe()
2031 jbd2_mark_journal_empty(journal, WRITE_FUA); in jbd2_journal_wipe()
2032 mutex_unlock(&journal->j_checkpoint_mutex); in jbd2_journal_wipe()
2052 void __jbd2_journal_abort_hard(journal_t *journal) in __jbd2_journal_abort_hard() argument
2056 if (journal->j_flags & JBD2_ABORT) in __jbd2_journal_abort_hard()
2060 journal->j_devname); in __jbd2_journal_abort_hard()
2062 write_lock(&journal->j_state_lock); in __jbd2_journal_abort_hard()
2063 journal->j_flags |= JBD2_ABORT; in __jbd2_journal_abort_hard()
2064 transaction = journal->j_running_transaction; in __jbd2_journal_abort_hard()
2066 __jbd2_log_start_commit(journal, transaction->t_tid); in __jbd2_journal_abort_hard()
2067 write_unlock(&journal->j_state_lock); in __jbd2_journal_abort_hard()
2072 static void __journal_abort_soft (journal_t *journal, int errno) in __journal_abort_soft() argument
2074 if (journal->j_flags & JBD2_ABORT) in __journal_abort_soft()
2077 if (!journal->j_errno) in __journal_abort_soft()
2078 journal->j_errno = errno; in __journal_abort_soft()
2080 __jbd2_journal_abort_hard(journal); in __journal_abort_soft()
2083 jbd2_journal_update_sb_errno(journal); in __journal_abort_soft()
2084 write_lock(&journal->j_state_lock); in __journal_abort_soft()
2085 journal->j_flags |= JBD2_REC_ERR; in __journal_abort_soft()
2086 write_unlock(&journal->j_state_lock); in __journal_abort_soft()
2136 void jbd2_journal_abort(journal_t *journal, int errno) in jbd2_journal_abort() argument
2138 __journal_abort_soft(journal, errno); in jbd2_journal_abort()
2152 int jbd2_journal_errno(journal_t *journal) in jbd2_journal_errno() argument
2156 read_lock(&journal->j_state_lock); in jbd2_journal_errno()
2157 if (journal->j_flags & JBD2_ABORT) in jbd2_journal_errno()
2160 err = journal->j_errno; in jbd2_journal_errno()
2161 read_unlock(&journal->j_state_lock); in jbd2_journal_errno()
2172 int jbd2_journal_clear_err(journal_t *journal) in jbd2_journal_clear_err() argument
2176 write_lock(&journal->j_state_lock); in jbd2_journal_clear_err()
2177 if (journal->j_flags & JBD2_ABORT) in jbd2_journal_clear_err()
2180 journal->j_errno = 0; in jbd2_journal_clear_err()
2181 write_unlock(&journal->j_state_lock); in jbd2_journal_clear_err()
2192 void jbd2_journal_ack_err(journal_t *journal) in jbd2_journal_ack_err() argument
2194 write_lock(&journal->j_state_lock); in jbd2_journal_ack_err()
2195 if (journal->j_errno) in jbd2_journal_ack_err()
2196 journal->j_flags |= JBD2_ACK_ERR; in jbd2_journal_ack_err()
2197 write_unlock(&journal->j_state_lock); in jbd2_journal_ack_err()
2208 size_t journal_tag_bytes(journal_t *journal) in journal_tag_bytes() argument
2212 if (jbd2_has_feature_csum3(journal)) in journal_tag_bytes()
2217 if (jbd2_has_feature_csum2(journal)) in journal_tag_bytes()
2220 if (jbd2_has_feature_64bit(journal)) in journal_tag_bytes()
2567 void jbd2_journal_release_jbd_inode(journal_t *journal, in jbd2_journal_release_jbd_inode() argument
2570 if (!journal) in jbd2_journal_release_jbd_inode()
2573 spin_lock(&journal->j_list_lock); in jbd2_journal_release_jbd_inode()
2580 spin_unlock(&journal->j_list_lock); in jbd2_journal_release_jbd_inode()
2590 spin_unlock(&journal->j_list_lock); in jbd2_journal_release_jbd_inode()