Lines Matching refs:jh

35 static void __jbd2_journal_temp_unlink_buffer(struct journal_head *jh);
36 static void __jbd2_journal_unfile_buffer(struct journal_head *jh);
777 static void jbd2_freeze_jh_data(struct journal_head *jh) in jbd2_freeze_jh_data() argument
782 struct buffer_head *bh = jh2bh(jh); in jbd2_freeze_jh_data()
784 J_EXPECT_JH(jh, buffer_uptodate(bh), "Possible IO failure.\n"); in jbd2_freeze_jh_data()
789 jbd2_buffer_frozen_trigger(jh, source + offset, jh->b_triggers); in jbd2_freeze_jh_data()
790 memcpy(jh->b_frozen_data, source + offset, bh->b_size); in jbd2_freeze_jh_data()
797 jh->b_frozen_triggers = jh->b_triggers; in jbd2_freeze_jh_data()
811 do_get_write_access(handle_t *handle, struct journal_head *jh, in do_get_write_access() argument
825 jbd_debug(5, "journal_head %p, force_copy %d\n", jh, force_copy); in do_get_write_access()
827 JBUFFER_TRACE(jh, "entry"); in do_get_write_access()
829 bh = jh2bh(jh); in do_get_write_access()
861 if (jh->b_transaction) { in do_get_write_access()
862 J_ASSERT_JH(jh, in do_get_write_access()
863 jh->b_transaction == transaction || in do_get_write_access()
864 jh->b_transaction == in do_get_write_access()
866 if (jh->b_next_transaction) in do_get_write_access()
867 J_ASSERT_JH(jh, jh->b_next_transaction == in do_get_write_access()
876 JBUFFER_TRACE(jh, "Journalling dirty buffer"); in do_get_write_access()
894 if (jh->b_transaction == transaction || in do_get_write_access()
895 jh->b_next_transaction == transaction) in do_get_write_access()
902 jh->b_modified = 0; in do_get_write_access()
909 if (!jh->b_transaction) { in do_get_write_access()
910 JBUFFER_TRACE(jh, "no transaction"); in do_get_write_access()
911 J_ASSERT_JH(jh, !jh->b_next_transaction); in do_get_write_access()
912 JBUFFER_TRACE(jh, "file as BJ_Reserved"); in do_get_write_access()
920 __jbd2_journal_file_buffer(jh, transaction, BJ_Reserved); in do_get_write_access()
928 if (jh->b_frozen_data) { in do_get_write_access()
929 JBUFFER_TRACE(jh, "has frozen data"); in do_get_write_access()
930 J_ASSERT_JH(jh, jh->b_next_transaction == NULL); in do_get_write_access()
934 JBUFFER_TRACE(jh, "owned by older transaction"); in do_get_write_access()
935 J_ASSERT_JH(jh, jh->b_next_transaction == NULL); in do_get_write_access()
936 J_ASSERT_JH(jh, jh->b_transaction == journal->j_committing_transaction); in do_get_write_access()
948 JBUFFER_TRACE(jh, "on shadow: sleep"); in do_get_write_access()
966 if (jh->b_jlist == BJ_Metadata || force_copy) { in do_get_write_access()
967 JBUFFER_TRACE(jh, "generate frozen data"); in do_get_write_access()
969 JBUFFER_TRACE(jh, "allocate memory for buffer"); in do_get_write_access()
971 frozen_buffer = jbd2_alloc(jh2bh(jh)->b_size, GFP_NOFS); in do_get_write_access()
975 JBUFFER_TRACE(jh, "oom!"); in do_get_write_access()
981 jh->b_frozen_data = frozen_buffer; in do_get_write_access()
983 jbd2_freeze_jh_data(jh); in do_get_write_access()
992 jh->b_next_transaction = transaction; in do_get_write_access()
1001 jbd2_journal_cancel_revoke(handle, jh); in do_get_write_access()
1007 JBUFFER_TRACE(jh, "exit"); in do_get_write_access()
1015 struct journal_head *jh; in jbd2_write_access_granted() local
1037 jh = READ_ONCE(bh->b_private); in jbd2_write_access_granted()
1038 if (!jh) in jbd2_write_access_granted()
1041 if (undo && !jh->b_committed_data) in jbd2_write_access_granted()
1043 if (jh->b_transaction != handle->h_transaction && in jbd2_write_access_granted()
1044 jh->b_next_transaction != handle->h_transaction) in jbd2_write_access_granted()
1056 if (unlikely(jh->b_bh != bh)) in jbd2_write_access_granted()
1077 struct journal_head *jh; in jbd2_journal_get_write_access() local
1083 jh = jbd2_journal_add_journal_head(bh); in jbd2_journal_get_write_access()
1087 rc = do_get_write_access(handle, jh, 0); in jbd2_journal_get_write_access()
1088 jbd2_journal_put_journal_head(jh); in jbd2_journal_get_write_access()
1116 struct journal_head *jh = jbd2_journal_add_journal_head(bh); in jbd2_journal_get_create_access() local
1119 jbd_debug(5, "journal_head %p\n", jh); in jbd2_journal_get_create_access()
1126 JBUFFER_TRACE(jh, "entry"); in jbd2_journal_get_create_access()
1135 J_ASSERT_JH(jh, (jh->b_transaction == transaction || in jbd2_journal_get_create_access()
1136 jh->b_transaction == NULL || in jbd2_journal_get_create_access()
1137 (jh->b_transaction == journal->j_committing_transaction && in jbd2_journal_get_create_access()
1138 jh->b_jlist == BJ_Forget))); in jbd2_journal_get_create_access()
1140 J_ASSERT_JH(jh, jh->b_next_transaction == NULL); in jbd2_journal_get_create_access()
1141 J_ASSERT_JH(jh, buffer_locked(jh2bh(jh))); in jbd2_journal_get_create_access()
1143 if (jh->b_transaction == NULL) { in jbd2_journal_get_create_access()
1152 clear_buffer_dirty(jh2bh(jh)); in jbd2_journal_get_create_access()
1154 jh->b_modified = 0; in jbd2_journal_get_create_access()
1156 JBUFFER_TRACE(jh, "file as BJ_Reserved"); in jbd2_journal_get_create_access()
1158 __jbd2_journal_file_buffer(jh, transaction, BJ_Reserved); in jbd2_journal_get_create_access()
1159 } else if (jh->b_transaction == journal->j_committing_transaction) { in jbd2_journal_get_create_access()
1161 jh->b_modified = 0; in jbd2_journal_get_create_access()
1163 JBUFFER_TRACE(jh, "set next transaction"); in jbd2_journal_get_create_access()
1165 jh->b_next_transaction = transaction; in jbd2_journal_get_create_access()
1177 JBUFFER_TRACE(jh, "cancelling revoke"); in jbd2_journal_get_create_access()
1178 jbd2_journal_cancel_revoke(handle, jh); in jbd2_journal_get_create_access()
1180 jbd2_journal_put_journal_head(jh); in jbd2_journal_get_create_access()
1213 struct journal_head *jh; in jbd2_journal_get_undo_access() local
1216 JBUFFER_TRACE(jh, "entry"); in jbd2_journal_get_undo_access()
1220 jh = jbd2_journal_add_journal_head(bh); in jbd2_journal_get_undo_access()
1226 err = do_get_write_access(handle, jh, 1); in jbd2_journal_get_undo_access()
1231 if (!jh->b_committed_data) { in jbd2_journal_get_undo_access()
1232 committed_data = jbd2_alloc(jh2bh(jh)->b_size, GFP_NOFS); in jbd2_journal_get_undo_access()
1242 if (!jh->b_committed_data) { in jbd2_journal_get_undo_access()
1245 JBUFFER_TRACE(jh, "generate b_committed data"); in jbd2_journal_get_undo_access()
1251 jh->b_committed_data = committed_data; in jbd2_journal_get_undo_access()
1253 memcpy(jh->b_committed_data, bh->b_data, bh->b_size); in jbd2_journal_get_undo_access()
1257 jbd2_journal_put_journal_head(jh); in jbd2_journal_get_undo_access()
1277 struct journal_head *jh = jbd2_journal_grab_journal_head(bh); in jbd2_journal_set_triggers() local
1279 if (WARN_ON(!jh)) in jbd2_journal_set_triggers()
1281 jh->b_triggers = type; in jbd2_journal_set_triggers()
1282 jbd2_journal_put_journal_head(jh); in jbd2_journal_set_triggers()
1285 void jbd2_buffer_frozen_trigger(struct journal_head *jh, void *mapped_data, in jbd2_buffer_frozen_trigger() argument
1288 struct buffer_head *bh = jh2bh(jh); in jbd2_buffer_frozen_trigger()
1296 void jbd2_buffer_abort_trigger(struct journal_head *jh, in jbd2_buffer_abort_trigger() argument
1302 triggers->t_abort(triggers, jh2bh(jh)); in jbd2_buffer_abort_trigger()
1332 struct journal_head *jh; in jbd2_journal_dirty_metadata() local
1345 jh = bh2jh(bh); in jbd2_journal_dirty_metadata()
1352 if (jh->b_transaction != transaction && in jbd2_journal_dirty_metadata()
1353 jh->b_next_transaction != transaction) { in jbd2_journal_dirty_metadata()
1355 J_ASSERT_JH(jh, jh->b_transaction == transaction || in jbd2_journal_dirty_metadata()
1356 jh->b_next_transaction == transaction); in jbd2_journal_dirty_metadata()
1359 if (jh->b_modified == 1) { in jbd2_journal_dirty_metadata()
1361 if (jh->b_transaction == transaction && in jbd2_journal_dirty_metadata()
1362 jh->b_jlist != BJ_Metadata) { in jbd2_journal_dirty_metadata()
1364 J_ASSERT_JH(jh, jh->b_transaction != transaction || in jbd2_journal_dirty_metadata()
1365 jh->b_jlist == BJ_Metadata); in jbd2_journal_dirty_metadata()
1372 jbd_debug(5, "journal_head %p\n", jh); in jbd2_journal_dirty_metadata()
1373 JBUFFER_TRACE(jh, "entry"); in jbd2_journal_dirty_metadata()
1377 if (jh->b_modified == 0) { in jbd2_journal_dirty_metadata()
1383 jh->b_modified = 1; in jbd2_journal_dirty_metadata()
1398 if (jh->b_transaction == transaction && jh->b_jlist == BJ_Metadata) { in jbd2_journal_dirty_metadata()
1399 JBUFFER_TRACE(jh, "fastpath"); in jbd2_journal_dirty_metadata()
1400 if (unlikely(jh->b_transaction != in jbd2_journal_dirty_metadata()
1407 jh->b_transaction, in jbd2_journal_dirty_metadata()
1408 jh->b_transaction ? jh->b_transaction->t_tid : 0, in jbd2_journal_dirty_metadata()
1425 if (jh->b_transaction != transaction) { in jbd2_journal_dirty_metadata()
1426 JBUFFER_TRACE(jh, "already on other transaction"); in jbd2_journal_dirty_metadata()
1427 if (unlikely(((jh->b_transaction != in jbd2_journal_dirty_metadata()
1429 (jh->b_next_transaction != transaction))) { in jbd2_journal_dirty_metadata()
1438 jh->b_transaction, in jbd2_journal_dirty_metadata()
1439 jh->b_transaction ? in jbd2_journal_dirty_metadata()
1440 jh->b_transaction->t_tid : 0, in jbd2_journal_dirty_metadata()
1441 jh->b_next_transaction, in jbd2_journal_dirty_metadata()
1442 jh->b_next_transaction ? in jbd2_journal_dirty_metadata()
1443 jh->b_next_transaction->t_tid : 0, in jbd2_journal_dirty_metadata()
1444 jh->b_jlist); in jbd2_journal_dirty_metadata()
1454 J_ASSERT_JH(jh, jh->b_frozen_data == NULL); in jbd2_journal_dirty_metadata()
1456 JBUFFER_TRACE(jh, "file as BJ_Metadata"); in jbd2_journal_dirty_metadata()
1458 __jbd2_journal_file_buffer(jh, transaction, BJ_Metadata); in jbd2_journal_dirty_metadata()
1463 JBUFFER_TRACE(jh, "exit"); in jbd2_journal_dirty_metadata()
1488 struct journal_head *jh; in jbd2_journal_forget() local
1503 jh = bh2jh(bh); in jbd2_journal_forget()
1507 if (!J_EXPECT_JH(jh, !jh->b_committed_data, in jbd2_journal_forget()
1514 was_modified = jh->b_modified; in jbd2_journal_forget()
1520 jh->b_modified = 0; in jbd2_journal_forget()
1522 if (jh->b_transaction == transaction) { in jbd2_journal_forget()
1523 J_ASSERT_JH(jh, !jh->b_frozen_data); in jbd2_journal_forget()
1531 JBUFFER_TRACE(jh, "belongs to current transaction: unfile"); in jbd2_journal_forget()
1553 if (jh->b_cp_transaction) { in jbd2_journal_forget()
1554 __jbd2_journal_temp_unlink_buffer(jh); in jbd2_journal_forget()
1555 __jbd2_journal_file_buffer(jh, transaction, BJ_Forget); in jbd2_journal_forget()
1557 __jbd2_journal_unfile_buffer(jh); in jbd2_journal_forget()
1566 } else if (jh->b_transaction) { in jbd2_journal_forget()
1567 J_ASSERT_JH(jh, (jh->b_transaction == in jbd2_journal_forget()
1571 JBUFFER_TRACE(jh, "belongs to older transaction"); in jbd2_journal_forget()
1575 if (jh->b_next_transaction) { in jbd2_journal_forget()
1576 J_ASSERT(jh->b_next_transaction == transaction); in jbd2_journal_forget()
1578 jh->b_next_transaction = NULL; in jbd2_journal_forget()
1796 __blist_add_buffer(struct journal_head **list, struct journal_head *jh) in __blist_add_buffer() argument
1799 jh->b_tnext = jh->b_tprev = jh; in __blist_add_buffer()
1800 *list = jh; in __blist_add_buffer()
1804 jh->b_tprev = last; in __blist_add_buffer()
1805 jh->b_tnext = first; in __blist_add_buffer()
1806 last->b_tnext = first->b_tprev = jh; in __blist_add_buffer()
1820 __blist_del_buffer(struct journal_head **list, struct journal_head *jh) in __blist_del_buffer() argument
1822 if (*list == jh) { in __blist_del_buffer()
1823 *list = jh->b_tnext; in __blist_del_buffer()
1824 if (*list == jh) in __blist_del_buffer()
1827 jh->b_tprev->b_tnext = jh->b_tnext; in __blist_del_buffer()
1828 jh->b_tnext->b_tprev = jh->b_tprev; in __blist_del_buffer()
1842 static void __jbd2_journal_temp_unlink_buffer(struct journal_head *jh) in __jbd2_journal_temp_unlink_buffer() argument
1846 struct buffer_head *bh = jh2bh(jh); in __jbd2_journal_temp_unlink_buffer()
1848 J_ASSERT_JH(jh, jbd_is_locked_bh_state(bh)); in __jbd2_journal_temp_unlink_buffer()
1849 transaction = jh->b_transaction; in __jbd2_journal_temp_unlink_buffer()
1853 J_ASSERT_JH(jh, jh->b_jlist < BJ_Types); in __jbd2_journal_temp_unlink_buffer()
1854 if (jh->b_jlist != BJ_None) in __jbd2_journal_temp_unlink_buffer()
1855 J_ASSERT_JH(jh, transaction != NULL); in __jbd2_journal_temp_unlink_buffer()
1857 switch (jh->b_jlist) { in __jbd2_journal_temp_unlink_buffer()
1862 J_ASSERT_JH(jh, transaction->t_nr_buffers >= 0); in __jbd2_journal_temp_unlink_buffer()
1876 __blist_del_buffer(list, jh); in __jbd2_journal_temp_unlink_buffer()
1877 jh->b_jlist = BJ_None; in __jbd2_journal_temp_unlink_buffer()
1889 static void __jbd2_journal_unfile_buffer(struct journal_head *jh) in __jbd2_journal_unfile_buffer() argument
1891 __jbd2_journal_temp_unlink_buffer(jh); in __jbd2_journal_unfile_buffer()
1892 jh->b_transaction = NULL; in __jbd2_journal_unfile_buffer()
1893 jbd2_journal_put_journal_head(jh); in __jbd2_journal_unfile_buffer()
1896 void jbd2_journal_unfile_buffer(journal_t *journal, struct journal_head *jh) in jbd2_journal_unfile_buffer() argument
1898 struct buffer_head *bh = jh2bh(jh); in jbd2_journal_unfile_buffer()
1904 __jbd2_journal_unfile_buffer(jh); in jbd2_journal_unfile_buffer()
1918 struct journal_head *jh; in __journal_try_to_free_buffer() local
1920 jh = bh2jh(bh); in __journal_try_to_free_buffer()
1925 if (jh->b_next_transaction != NULL || jh->b_transaction != NULL) in __journal_try_to_free_buffer()
1929 if (jh->b_cp_transaction != NULL) { in __journal_try_to_free_buffer()
1931 JBUFFER_TRACE(jh, "remove from checkpoint list"); in __journal_try_to_free_buffer()
1932 __jbd2_journal_remove_checkpoint(jh); in __journal_try_to_free_buffer()
1989 struct journal_head *jh; in jbd2_journal_try_to_free_buffers() local
1996 jh = jbd2_journal_grab_journal_head(bh); in jbd2_journal_try_to_free_buffers()
1997 if (!jh) in jbd2_journal_try_to_free_buffers()
2002 jbd2_journal_put_journal_head(jh); in jbd2_journal_try_to_free_buffers()
2026 static int __dispose_buffer(struct journal_head *jh, transaction_t *transaction) in __dispose_buffer() argument
2029 struct buffer_head *bh = jh2bh(jh); in __dispose_buffer()
2031 if (jh->b_cp_transaction) { in __dispose_buffer()
2032 JBUFFER_TRACE(jh, "on running+cp transaction"); in __dispose_buffer()
2033 __jbd2_journal_temp_unlink_buffer(jh); in __dispose_buffer()
2040 __jbd2_journal_file_buffer(jh, transaction, BJ_Forget); in __dispose_buffer()
2043 JBUFFER_TRACE(jh, "on running transaction"); in __dispose_buffer()
2044 __jbd2_journal_unfile_buffer(jh); in __dispose_buffer()
2100 struct journal_head *jh; in journal_unmap_buffer() local
2119 jh = jbd2_journal_grab_journal_head(bh); in journal_unmap_buffer()
2120 if (!jh) in journal_unmap_buffer()
2146 transaction = jh->b_transaction; in journal_unmap_buffer()
2152 if (!jh->b_cp_transaction) { in journal_unmap_buffer()
2153 JBUFFER_TRACE(jh, "not on any transaction: zap"); in journal_unmap_buffer()
2159 __jbd2_journal_remove_checkpoint(jh); in journal_unmap_buffer()
2171 JBUFFER_TRACE(jh, "checkpointed: add to BJ_Forget"); in journal_unmap_buffer()
2172 may_free = __dispose_buffer(jh, in journal_unmap_buffer()
2181 JBUFFER_TRACE(jh, "give to committing trans"); in journal_unmap_buffer()
2182 may_free = __dispose_buffer(jh, in journal_unmap_buffer()
2189 __jbd2_journal_remove_checkpoint(jh); in journal_unmap_buffer()
2194 JBUFFER_TRACE(jh, "on committing transaction"); in journal_unmap_buffer()
2201 jbd2_journal_put_journal_head(jh); in journal_unmap_buffer()
2215 jh->b_next_transaction = journal->j_running_transaction; in journal_unmap_buffer()
2216 jbd2_journal_put_journal_head(jh); in journal_unmap_buffer()
2228 J_ASSERT_JH(jh, transaction == journal->j_running_transaction); in journal_unmap_buffer()
2229 JBUFFER_TRACE(jh, "on running transaction"); in journal_unmap_buffer()
2230 may_free = __dispose_buffer(jh, transaction); in journal_unmap_buffer()
2242 jh->b_modified = 0; in journal_unmap_buffer()
2243 jbd2_journal_put_journal_head(jh); in journal_unmap_buffer()
2327 void __jbd2_journal_file_buffer(struct journal_head *jh, in __jbd2_journal_file_buffer() argument
2332 struct buffer_head *bh = jh2bh(jh); in __jbd2_journal_file_buffer()
2334 J_ASSERT_JH(jh, jbd_is_locked_bh_state(bh)); in __jbd2_journal_file_buffer()
2337 J_ASSERT_JH(jh, jh->b_jlist < BJ_Types); in __jbd2_journal_file_buffer()
2338 J_ASSERT_JH(jh, jh->b_transaction == transaction || in __jbd2_journal_file_buffer()
2339 jh->b_transaction == NULL); in __jbd2_journal_file_buffer()
2341 if (jh->b_transaction && jh->b_jlist == jlist) in __jbd2_journal_file_buffer()
2360 if (jh->b_transaction) in __jbd2_journal_file_buffer()
2361 __jbd2_journal_temp_unlink_buffer(jh); in __jbd2_journal_file_buffer()
2364 jh->b_transaction = transaction; in __jbd2_journal_file_buffer()
2368 J_ASSERT_JH(jh, !jh->b_committed_data); in __jbd2_journal_file_buffer()
2369 J_ASSERT_JH(jh, !jh->b_frozen_data); in __jbd2_journal_file_buffer()
2386 __blist_add_buffer(list, jh); in __jbd2_journal_file_buffer()
2387 jh->b_jlist = jlist; in __jbd2_journal_file_buffer()
2393 void jbd2_journal_file_buffer(struct journal_head *jh, in jbd2_journal_file_buffer() argument
2396 jbd_lock_bh_state(jh2bh(jh)); in jbd2_journal_file_buffer()
2398 __jbd2_journal_file_buffer(jh, transaction, jlist); in jbd2_journal_file_buffer()
2400 jbd_unlock_bh_state(jh2bh(jh)); in jbd2_journal_file_buffer()
2414 void __jbd2_journal_refile_buffer(struct journal_head *jh) in __jbd2_journal_refile_buffer() argument
2417 struct buffer_head *bh = jh2bh(jh); in __jbd2_journal_refile_buffer()
2419 J_ASSERT_JH(jh, jbd_is_locked_bh_state(bh)); in __jbd2_journal_refile_buffer()
2420 if (jh->b_transaction) in __jbd2_journal_refile_buffer()
2421 assert_spin_locked(&jh->b_transaction->t_journal->j_list_lock); in __jbd2_journal_refile_buffer()
2424 if (jh->b_next_transaction == NULL) { in __jbd2_journal_refile_buffer()
2425 __jbd2_journal_unfile_buffer(jh); in __jbd2_journal_refile_buffer()
2435 __jbd2_journal_temp_unlink_buffer(jh); in __jbd2_journal_refile_buffer()
2441 jh->b_transaction = jh->b_next_transaction; in __jbd2_journal_refile_buffer()
2442 jh->b_next_transaction = NULL; in __jbd2_journal_refile_buffer()
2445 else if (jh->b_modified) in __jbd2_journal_refile_buffer()
2449 __jbd2_journal_file_buffer(jh, jh->b_transaction, jlist); in __jbd2_journal_refile_buffer()
2450 J_ASSERT_JH(jh, jh->b_transaction->t_state == T_RUNNING); in __jbd2_journal_refile_buffer()
2462 void jbd2_journal_refile_buffer(journal_t *journal, struct journal_head *jh) in jbd2_journal_refile_buffer() argument
2464 struct buffer_head *bh = jh2bh(jh); in jbd2_journal_refile_buffer()
2470 __jbd2_journal_refile_buffer(jh); in jbd2_journal_refile_buffer()