Lines Matching refs:journal
68 static int jbd2_descriptor_blocks_per_trans(journal_t *journal) in jbd2_descriptor_blocks_per_trans() argument
70 int tag_space = journal->j_blocksize - sizeof(journal_header_t); in jbd2_descriptor_blocks_per_trans()
75 if (jbd2_journal_has_csum_v2or3(journal)) in jbd2_descriptor_blocks_per_trans()
78 tags_per_block = (tag_space - 16) / journal_tag_bytes(journal); in jbd2_descriptor_blocks_per_trans()
83 return 1 + DIV_ROUND_UP(journal->j_max_transaction_buffers, in jbd2_descriptor_blocks_per_trans()
102 static void jbd2_get_transaction(journal_t *journal, in jbd2_get_transaction() argument
105 transaction->t_journal = journal; in jbd2_get_transaction()
108 transaction->t_tid = journal->j_transaction_sequence++; in jbd2_get_transaction()
109 transaction->t_expires = jiffies + journal->j_commit_interval; in jbd2_get_transaction()
113 jbd2_descriptor_blocks_per_trans(journal) + in jbd2_get_transaction()
114 atomic_read(&journal->j_reserved_credits)); in jbd2_get_transaction()
121 journal->j_commit_timer.expires = round_jiffies_up(transaction->t_expires); in jbd2_get_transaction()
122 add_timer(&journal->j_commit_timer); in jbd2_get_transaction()
124 J_ASSERT(journal->j_running_transaction == NULL); in jbd2_get_transaction()
125 journal->j_running_transaction = transaction; in jbd2_get_transaction()
169 static void wait_transaction_locked(journal_t *journal) in wait_transaction_locked() argument
170 __releases(journal->j_state_lock) in wait_transaction_locked()
174 tid_t tid = journal->j_running_transaction->t_tid; in wait_transaction_locked()
176 prepare_to_wait_exclusive(&journal->j_wait_transaction_locked, &wait, in wait_transaction_locked()
178 need_to_start = !tid_geq(journal->j_commit_request, tid); in wait_transaction_locked()
179 read_unlock(&journal->j_state_lock); in wait_transaction_locked()
181 jbd2_log_start_commit(journal, tid); in wait_transaction_locked()
182 jbd2_might_wait_for_commit(journal); in wait_transaction_locked()
184 finish_wait(&journal->j_wait_transaction_locked, &wait); in wait_transaction_locked()
192 static void wait_transaction_switching(journal_t *journal) in wait_transaction_switching() argument
193 __releases(journal->j_state_lock) in wait_transaction_switching()
197 if (WARN_ON(!journal->j_running_transaction || in wait_transaction_switching()
198 journal->j_running_transaction->t_state != T_SWITCH)) { in wait_transaction_switching()
199 read_unlock(&journal->j_state_lock); in wait_transaction_switching()
202 prepare_to_wait_exclusive(&journal->j_wait_transaction_locked, &wait, in wait_transaction_switching()
204 read_unlock(&journal->j_state_lock); in wait_transaction_switching()
212 finish_wait(&journal->j_wait_transaction_locked, &wait); in wait_transaction_switching()
215 static void sub_reserved_credits(journal_t *journal, int blocks) in sub_reserved_credits() argument
217 atomic_sub(blocks, &journal->j_reserved_credits); in sub_reserved_credits()
218 wake_up(&journal->j_wait_reserved); in sub_reserved_credits()
227 static int add_transaction_credits(journal_t *journal, int blocks, in add_transaction_credits() argument
230 transaction_t *t = journal->j_running_transaction; in add_transaction_credits()
240 wait_transaction_locked(journal); in add_transaction_credits()
250 if (needed > journal->j_max_transaction_buffers) { in add_transaction_credits()
262 if (atomic_read(&journal->j_reserved_credits) + total > in add_transaction_credits()
263 journal->j_max_transaction_buffers) { in add_transaction_credits()
264 read_unlock(&journal->j_state_lock); in add_transaction_credits()
265 jbd2_might_wait_for_commit(journal); in add_transaction_credits()
266 wait_event(journal->j_wait_reserved, in add_transaction_credits()
267 atomic_read(&journal->j_reserved_credits) + total <= in add_transaction_credits()
268 journal->j_max_transaction_buffers); in add_transaction_credits()
272 wait_transaction_locked(journal); in add_transaction_credits()
287 if (jbd2_log_space_left(journal) < journal->j_max_transaction_buffers) { in add_transaction_credits()
289 read_unlock(&journal->j_state_lock); in add_transaction_credits()
290 jbd2_might_wait_for_commit(journal); in add_transaction_credits()
291 write_lock(&journal->j_state_lock); in add_transaction_credits()
292 if (jbd2_log_space_left(journal) < in add_transaction_credits()
293 journal->j_max_transaction_buffers) in add_transaction_credits()
294 __jbd2_log_wait_for_space(journal); in add_transaction_credits()
295 write_unlock(&journal->j_state_lock); in add_transaction_credits()
303 needed = atomic_add_return(rsv_blocks, &journal->j_reserved_credits); in add_transaction_credits()
305 if (needed > journal->j_max_transaction_buffers / 2) { in add_transaction_credits()
306 sub_reserved_credits(journal, rsv_blocks); in add_transaction_credits()
308 read_unlock(&journal->j_state_lock); in add_transaction_credits()
309 jbd2_might_wait_for_commit(journal); in add_transaction_credits()
310 wait_event(journal->j_wait_reserved, in add_transaction_credits()
311 atomic_read(&journal->j_reserved_credits) + rsv_blocks in add_transaction_credits()
312 <= journal->j_max_transaction_buffers / 2); in add_transaction_credits()
325 static int start_this_handle(journal_t *journal, handle_t *handle, in start_this_handle() argument
341 if ((rsv_blocks > journal->j_max_transaction_buffers / 2) || in start_this_handle()
342 (rsv_blocks + blocks > journal->j_max_transaction_buffers)) { in start_this_handle()
346 journal->j_max_transaction_buffers); in start_this_handle()
357 if (!data_race(journal->j_running_transaction)) { in start_this_handle()
377 read_lock(&journal->j_state_lock); in start_this_handle()
378 BUG_ON(journal->j_flags & JBD2_UNMOUNT); in start_this_handle()
379 if (is_journal_aborted(journal) || in start_this_handle()
380 (journal->j_errno != 0 && !(journal->j_flags & JBD2_ACK_ERR))) { in start_this_handle()
381 read_unlock(&journal->j_state_lock); in start_this_handle()
391 if (!handle->h_reserved && journal->j_barrier_count) { in start_this_handle()
392 read_unlock(&journal->j_state_lock); in start_this_handle()
393 wait_event(journal->j_wait_transaction_locked, in start_this_handle()
394 journal->j_barrier_count == 0); in start_this_handle()
398 if (!journal->j_running_transaction) { in start_this_handle()
399 read_unlock(&journal->j_state_lock); in start_this_handle()
402 write_lock(&journal->j_state_lock); in start_this_handle()
403 if (!journal->j_running_transaction && in start_this_handle()
404 (handle->h_reserved || !journal->j_barrier_count)) { in start_this_handle()
405 jbd2_get_transaction(journal, new_transaction); in start_this_handle()
408 write_unlock(&journal->j_state_lock); in start_this_handle()
412 transaction = journal->j_running_transaction; in start_this_handle()
416 if (add_transaction_credits(journal, blocks, rsv_blocks)) in start_this_handle()
427 wait_transaction_switching(journal); in start_this_handle()
430 sub_reserved_credits(journal, blocks); in start_this_handle()
447 jbd2_log_space_left(journal)); in start_this_handle()
448 read_unlock(&journal->j_state_lock); in start_this_handle()
451 rwsem_acquire_read(&journal->j_trans_commit_map, 0, 0, _THIS_IP_); in start_this_handle()
473 handle_t *jbd2__journal_start(journal_t *journal, int nblocks, int rsv_blocks, in jbd2__journal_start() argument
480 if (!journal) in jbd2__journal_start()
484 J_ASSERT(handle->h_transaction->t_journal == journal); in jbd2__journal_start()
490 journal->j_revoke_records_per_block); in jbd2__journal_start()
503 rsv_handle->h_journal = journal; in jbd2__journal_start()
508 err = start_this_handle(journal, handle, gfp_mask); in jbd2__journal_start()
517 trace_jbd2_handle_start(journal->j_fs_dev->bd_dev, in jbd2__journal_start()
545 handle_t *jbd2_journal_start(journal_t *journal, int nblocks) in jbd2_journal_start() argument
547 return jbd2__journal_start(journal, nblocks, 0, 0, GFP_NOFS, 0, 0); in jbd2_journal_start()
553 journal_t *journal = handle->h_journal; in __jbd2_journal_unreserve_handle() local
556 sub_reserved_credits(journal, handle->h_total_credits); in __jbd2_journal_unreserve_handle()
563 journal_t *journal = handle->h_journal; in jbd2_journal_free_reserved() local
566 read_lock(&journal->j_state_lock); in jbd2_journal_free_reserved()
567 __jbd2_journal_unreserve_handle(handle, journal->j_running_transaction); in jbd2_journal_free_reserved()
568 read_unlock(&journal->j_state_lock); in jbd2_journal_free_reserved()
590 journal_t *journal = handle->h_journal; in jbd2_journal_start_reserved() local
612 ret = start_this_handle(journal, handle, GFP_NOFS); in jbd2_journal_start_reserved()
614 handle->h_journal = journal; in jbd2_journal_start_reserved()
620 trace_jbd2_handle_start(journal->j_fs_dev->bd_dev, in jbd2_journal_start_reserved()
651 journal_t *journal; in jbd2_journal_extend() local
657 journal = transaction->t_journal; in jbd2_journal_extend()
661 read_lock(&journal->j_state_lock); in jbd2_journal_extend()
672 journal->j_revoke_records_per_block) - in jbd2_journal_extend()
675 journal->j_revoke_records_per_block); in jbd2_journal_extend()
680 if (wanted > journal->j_max_transaction_buffers) { in jbd2_journal_extend()
687 trace_jbd2_handle_extend(journal->j_fs_dev->bd_dev, in jbd2_journal_extend()
703 read_unlock(&journal->j_state_lock); in jbd2_journal_extend()
710 journal_t *journal = transaction->t_journal; in stop_this_handle() local
725 int rr_per_blk = journal->j_revoke_records_per_block; in stop_this_handle()
742 wake_up(&journal->j_wait_updates); in stop_this_handle()
744 rwsem_release(&journal->j_trans_commit_map, _THIS_IP_); in stop_this_handle()
773 journal_t *journal; in jbd2__journal_restart() local
782 journal = transaction->t_journal; in jbd2__journal_restart()
797 read_lock(&journal->j_state_lock); in jbd2__journal_restart()
798 need_to_start = !tid_geq(journal->j_commit_request, tid); in jbd2__journal_restart()
799 read_unlock(&journal->j_state_lock); in jbd2__journal_restart()
801 jbd2_log_start_commit(journal, tid); in jbd2__journal_restart()
804 journal->j_revoke_records_per_block); in jbd2__journal_restart()
806 ret = start_this_handle(journal, handle, gfp_mask); in jbd2__journal_restart()
807 trace_jbd2_handle_restart(journal->j_fs_dev->bd_dev, in jbd2__journal_restart()
832 void jbd2_journal_lock_updates(journal_t *journal) in jbd2_journal_lock_updates() argument
836 jbd2_might_wait_for_commit(journal); in jbd2_journal_lock_updates()
838 write_lock(&journal->j_state_lock); in jbd2_journal_lock_updates()
839 ++journal->j_barrier_count; in jbd2_journal_lock_updates()
842 if (atomic_read(&journal->j_reserved_credits)) { in jbd2_journal_lock_updates()
843 write_unlock(&journal->j_state_lock); in jbd2_journal_lock_updates()
844 wait_event(journal->j_wait_reserved, in jbd2_journal_lock_updates()
845 atomic_read(&journal->j_reserved_credits) == 0); in jbd2_journal_lock_updates()
846 write_lock(&journal->j_state_lock); in jbd2_journal_lock_updates()
851 transaction_t *transaction = journal->j_running_transaction; in jbd2_journal_lock_updates()
857 prepare_to_wait(&journal->j_wait_updates, &wait, in jbd2_journal_lock_updates()
861 finish_wait(&journal->j_wait_updates, &wait); in jbd2_journal_lock_updates()
865 write_unlock(&journal->j_state_lock); in jbd2_journal_lock_updates()
867 finish_wait(&journal->j_wait_updates, &wait); in jbd2_journal_lock_updates()
868 write_lock(&journal->j_state_lock); in jbd2_journal_lock_updates()
870 write_unlock(&journal->j_state_lock); in jbd2_journal_lock_updates()
878 mutex_lock(&journal->j_barrier); in jbd2_journal_lock_updates()
889 void jbd2_journal_unlock_updates (journal_t *journal) in jbd2_journal_unlock_updates() argument
891 J_ASSERT(journal->j_barrier_count != 0); in jbd2_journal_unlock_updates()
893 mutex_unlock(&journal->j_barrier); in jbd2_journal_unlock_updates()
894 write_lock(&journal->j_state_lock); in jbd2_journal_unlock_updates()
895 --journal->j_barrier_count; in jbd2_journal_unlock_updates()
896 write_unlock(&journal->j_state_lock); in jbd2_journal_unlock_updates()
897 wake_up_all(&journal->j_wait_transaction_locked); in jbd2_journal_unlock_updates()
949 journal_t *journal; in do_get_write_access() local
954 journal = transaction->t_journal; in do_get_write_access()
996 journal->j_committing_transaction); in do_get_write_access()
1050 spin_lock(&journal->j_list_lock); in do_get_write_access()
1052 spin_unlock(&journal->j_list_lock); in do_get_write_access()
1067 J_ASSERT_JH(jh, jh->b_transaction == journal->j_committing_transaction); in do_get_write_access()
1244 journal_t *journal; in jbd2_journal_get_create_access() local
1252 journal = transaction->t_journal; in jbd2_journal_get_create_access()
1266 (jh->b_transaction == journal->j_committing_transaction && in jbd2_journal_get_create_access()
1286 spin_lock(&journal->j_list_lock); in jbd2_journal_get_create_access()
1288 spin_unlock(&journal->j_list_lock); in jbd2_journal_get_create_access()
1289 } else if (jh->b_transaction == journal->j_committing_transaction) { in jbd2_journal_get_create_access()
1294 spin_lock(&journal->j_list_lock); in jbd2_journal_get_create_access()
1296 spin_unlock(&journal->j_list_lock); in jbd2_journal_get_create_access()
1459 journal_t *journal; in jbd2_journal_dirty_metadata() local
1506 journal = transaction->t_journal; in jbd2_journal_dirty_metadata()
1545 journal->j_running_transaction)) { in jbd2_journal_dirty_metadata()
1549 journal->j_devname, in jbd2_journal_dirty_metadata()
1553 journal->j_running_transaction, in jbd2_journal_dirty_metadata()
1554 journal->j_running_transaction ? in jbd2_journal_dirty_metadata()
1555 journal->j_running_transaction->t_tid : 0); in jbd2_journal_dirty_metadata()
1572 journal->j_committing_transaction)) || in jbd2_journal_dirty_metadata()
1579 journal->j_devname, in jbd2_journal_dirty_metadata()
1601 spin_lock(&journal->j_list_lock); in jbd2_journal_dirty_metadata()
1603 spin_unlock(&journal->j_list_lock); in jbd2_journal_dirty_metadata()
1631 journal_t *journal; in jbd2_journal_forget() local
1639 journal = transaction->t_journal; in jbd2_journal_forget()
1698 spin_lock(&journal->j_list_lock); in jbd2_journal_forget()
1706 spin_unlock(&journal->j_list_lock); in jbd2_journal_forget()
1709 journal->j_committing_transaction)); in jbd2_journal_forget()
1723 spin_lock(&journal->j_list_lock); in jbd2_journal_forget()
1725 spin_unlock(&journal->j_list_lock); in jbd2_journal_forget()
1742 spin_lock(&journal->j_list_lock); in jbd2_journal_forget()
1745 spin_unlock(&journal->j_list_lock); in jbd2_journal_forget()
1755 spin_unlock(&journal->j_list_lock); in jbd2_journal_forget()
1767 spin_unlock(&journal->j_list_lock); in jbd2_journal_forget()
1799 journal_t *journal; in jbd2_journal_stop() local
1819 journal = transaction->t_journal; in jbd2_journal_stop()
1826 trace_jbd2_handle_stats(journal->j_fs_dev->bd_dev, in jbd2_journal_stop()
1863 if (handle->h_sync && journal->j_last_sync_writer != pid && in jbd2_journal_stop()
1864 journal->j_max_batch_time) { in jbd2_journal_stop()
1867 journal->j_last_sync_writer = pid; in jbd2_journal_stop()
1869 read_lock(&journal->j_state_lock); in jbd2_journal_stop()
1870 commit_time = journal->j_average_commit_time; in jbd2_journal_stop()
1871 read_unlock(&journal->j_state_lock); in jbd2_journal_stop()
1877 1000*journal->j_min_batch_time); in jbd2_journal_stop()
1879 1000*journal->j_max_batch_time); in jbd2_journal_stop()
1906 jbd2_log_start_commit(journal, tid); in jbd2_journal_stop()
1925 err = jbd2_log_wait_commit(journal, tid); in jbd2_journal_stop()
2054 void jbd2_journal_unfile_buffer(journal_t *journal, struct journal_head *jh) in jbd2_journal_unfile_buffer() argument
2061 spin_lock(&journal->j_list_lock); in jbd2_journal_unfile_buffer()
2063 spin_unlock(&journal->j_list_lock); in jbd2_journal_unfile_buffer()
2075 __journal_try_to_free_buffer(journal_t *journal, struct buffer_head *bh) in __journal_try_to_free_buffer() argument
2087 spin_lock(&journal->j_list_lock); in __journal_try_to_free_buffer()
2093 spin_unlock(&journal->j_list_lock); in __journal_try_to_free_buffer()
2132 int jbd2_journal_try_to_free_buffers(journal_t *journal, struct page *page) in jbd2_journal_try_to_free_buffers() argument
2156 __journal_try_to_free_buffer(journal, bh); in jbd2_journal_try_to_free_buffers()
2179 jbd2_journal_abort(journal, -EIO); in jbd2_journal_try_to_free_buffers()
2267 static int journal_unmap_buffer(journal_t *journal, struct buffer_head *bh, in journal_unmap_buffer() argument
2287 write_lock(&journal->j_state_lock); in journal_unmap_buffer()
2289 spin_lock(&journal->j_list_lock); in journal_unmap_buffer()
2335 if (journal->j_running_transaction) { in journal_unmap_buffer()
2341 journal->j_running_transaction); in journal_unmap_buffer()
2348 if (journal->j_committing_transaction) { in journal_unmap_buffer()
2351 journal->j_committing_transaction); in journal_unmap_buffer()
2361 } else if (transaction == journal->j_committing_transaction) { in journal_unmap_buffer()
2369 spin_unlock(&journal->j_list_lock); in journal_unmap_buffer()
2371 write_unlock(&journal->j_state_lock); in journal_unmap_buffer()
2383 if (journal->j_running_transaction && buffer_jbddirty(bh)) in journal_unmap_buffer()
2384 jh->b_next_transaction = journal->j_running_transaction; in journal_unmap_buffer()
2386 spin_unlock(&journal->j_list_lock); in journal_unmap_buffer()
2388 write_unlock(&journal->j_state_lock); in journal_unmap_buffer()
2398 J_ASSERT_JH(jh, transaction == journal->j_running_transaction); in journal_unmap_buffer()
2413 spin_unlock(&journal->j_list_lock); in journal_unmap_buffer()
2415 write_unlock(&journal->j_state_lock); in journal_unmap_buffer()
2441 int jbd2_journal_invalidatepage(journal_t *journal, in jbd2_journal_invalidatepage() argument
2475 ret = journal_unmap_buffer(journal, bh, partial_page); in jbd2_journal_invalidatepage()
2641 void jbd2_journal_refile_buffer(journal_t *journal, struct journal_head *jh) in jbd2_journal_refile_buffer() argument
2646 spin_lock(&journal->j_list_lock); in jbd2_journal_refile_buffer()
2649 spin_unlock(&journal->j_list_lock); in jbd2_journal_refile_buffer()
2661 journal_t *journal; in jbd2_journal_file_inode() local
2665 journal = transaction->t_journal; in jbd2_journal_file_inode()
2670 spin_lock(&journal->j_list_lock); in jbd2_journal_file_inode()
2698 journal->j_committing_transaction); in jbd2_journal_file_inode()
2707 spin_unlock(&journal->j_list_lock); in jbd2_journal_file_inode()
2747 int jbd2_journal_begin_ordered_truncate(journal_t *journal, in jbd2_journal_begin_ordered_truncate() argument
2760 read_lock(&journal->j_state_lock); in jbd2_journal_begin_ordered_truncate()
2761 commit_trans = journal->j_committing_transaction; in jbd2_journal_begin_ordered_truncate()
2762 read_unlock(&journal->j_state_lock); in jbd2_journal_begin_ordered_truncate()
2763 spin_lock(&journal->j_list_lock); in jbd2_journal_begin_ordered_truncate()
2765 spin_unlock(&journal->j_list_lock); in jbd2_journal_begin_ordered_truncate()
2770 jbd2_journal_abort(journal, ret); in jbd2_journal_begin_ordered_truncate()