Lines Matching refs:jh
33 static void __jbd2_journal_temp_unlink_buffer(struct journal_head *jh);
34 static void __jbd2_journal_unfile_buffer(struct journal_head *jh);
824 static void jbd2_freeze_jh_data(struct journal_head *jh) in jbd2_freeze_jh_data() argument
829 struct buffer_head *bh = jh2bh(jh); in jbd2_freeze_jh_data()
831 J_EXPECT_JH(jh, buffer_uptodate(bh), "Possible IO failure.\n"); in jbd2_freeze_jh_data()
836 jbd2_buffer_frozen_trigger(jh, source + offset, jh->b_triggers); in jbd2_freeze_jh_data()
837 memcpy(jh->b_frozen_data, source + offset, bh->b_size); in jbd2_freeze_jh_data()
844 jh->b_frozen_triggers = jh->b_triggers; in jbd2_freeze_jh_data()
858 do_get_write_access(handle_t *handle, struct journal_head *jh, in do_get_write_access() argument
872 jbd_debug(5, "journal_head %p, force_copy %d\n", jh, force_copy); in do_get_write_access()
874 JBUFFER_TRACE(jh, "entry"); in do_get_write_access()
876 bh = jh2bh(jh); in do_get_write_access()
908 if (jh->b_transaction) { in do_get_write_access()
909 J_ASSERT_JH(jh, in do_get_write_access()
910 jh->b_transaction == transaction || in do_get_write_access()
911 jh->b_transaction == in do_get_write_access()
913 if (jh->b_next_transaction) in do_get_write_access()
914 J_ASSERT_JH(jh, jh->b_next_transaction == in do_get_write_access()
923 JBUFFER_TRACE(jh, "Journalling dirty buffer"); in do_get_write_access()
941 if (jh->b_transaction == transaction || in do_get_write_access()
942 jh->b_next_transaction == transaction) in do_get_write_access()
949 jh->b_modified = 0; in do_get_write_access()
956 if (!jh->b_transaction) { in do_get_write_access()
957 JBUFFER_TRACE(jh, "no transaction"); in do_get_write_access()
958 J_ASSERT_JH(jh, !jh->b_next_transaction); in do_get_write_access()
959 JBUFFER_TRACE(jh, "file as BJ_Reserved"); in do_get_write_access()
967 __jbd2_journal_file_buffer(jh, transaction, BJ_Reserved); in do_get_write_access()
975 if (jh->b_frozen_data) { in do_get_write_access()
976 JBUFFER_TRACE(jh, "has frozen data"); in do_get_write_access()
977 J_ASSERT_JH(jh, jh->b_next_transaction == NULL); in do_get_write_access()
981 JBUFFER_TRACE(jh, "owned by older transaction"); in do_get_write_access()
982 J_ASSERT_JH(jh, jh->b_next_transaction == NULL); in do_get_write_access()
983 J_ASSERT_JH(jh, jh->b_transaction == journal->j_committing_transaction); in do_get_write_access()
995 JBUFFER_TRACE(jh, "on shadow: sleep"); in do_get_write_access()
1013 if (jh->b_jlist == BJ_Metadata || force_copy) { in do_get_write_access()
1014 JBUFFER_TRACE(jh, "generate frozen data"); in do_get_write_access()
1016 JBUFFER_TRACE(jh, "allocate memory for buffer"); in do_get_write_access()
1018 frozen_buffer = jbd2_alloc(jh2bh(jh)->b_size, in do_get_write_access()
1022 jh->b_frozen_data = frozen_buffer; in do_get_write_access()
1024 jbd2_freeze_jh_data(jh); in do_get_write_access()
1033 jh->b_next_transaction = transaction; in do_get_write_access()
1042 jbd2_journal_cancel_revoke(handle, jh); in do_get_write_access()
1048 JBUFFER_TRACE(jh, "exit"); in do_get_write_access()
1056 struct journal_head *jh; in jbd2_write_access_granted() local
1078 jh = READ_ONCE(bh->b_private); in jbd2_write_access_granted()
1079 if (!jh) in jbd2_write_access_granted()
1082 if (undo && !jh->b_committed_data) in jbd2_write_access_granted()
1084 if (jh->b_transaction != handle->h_transaction && in jbd2_write_access_granted()
1085 jh->b_next_transaction != handle->h_transaction) in jbd2_write_access_granted()
1097 if (unlikely(jh->b_bh != bh)) in jbd2_write_access_granted()
1118 struct journal_head *jh; in jbd2_journal_get_write_access() local
1124 jh = jbd2_journal_add_journal_head(bh); in jbd2_journal_get_write_access()
1128 rc = do_get_write_access(handle, jh, 0); in jbd2_journal_get_write_access()
1129 jbd2_journal_put_journal_head(jh); in jbd2_journal_get_write_access()
1157 struct journal_head *jh = jbd2_journal_add_journal_head(bh); in jbd2_journal_get_create_access() local
1160 jbd_debug(5, "journal_head %p\n", jh); in jbd2_journal_get_create_access()
1167 JBUFFER_TRACE(jh, "entry"); in jbd2_journal_get_create_access()
1176 J_ASSERT_JH(jh, (jh->b_transaction == transaction || in jbd2_journal_get_create_access()
1177 jh->b_transaction == NULL || in jbd2_journal_get_create_access()
1178 (jh->b_transaction == journal->j_committing_transaction && in jbd2_journal_get_create_access()
1179 jh->b_jlist == BJ_Forget))); in jbd2_journal_get_create_access()
1181 J_ASSERT_JH(jh, jh->b_next_transaction == NULL); in jbd2_journal_get_create_access()
1182 J_ASSERT_JH(jh, buffer_locked(jh2bh(jh))); in jbd2_journal_get_create_access()
1184 if (jh->b_transaction == NULL) { in jbd2_journal_get_create_access()
1193 clear_buffer_dirty(jh2bh(jh)); in jbd2_journal_get_create_access()
1195 jh->b_modified = 0; in jbd2_journal_get_create_access()
1197 JBUFFER_TRACE(jh, "file as BJ_Reserved"); in jbd2_journal_get_create_access()
1199 __jbd2_journal_file_buffer(jh, transaction, BJ_Reserved); in jbd2_journal_get_create_access()
1201 } else if (jh->b_transaction == journal->j_committing_transaction) { in jbd2_journal_get_create_access()
1203 jh->b_modified = 0; in jbd2_journal_get_create_access()
1205 JBUFFER_TRACE(jh, "set next transaction"); in jbd2_journal_get_create_access()
1207 jh->b_next_transaction = transaction; in jbd2_journal_get_create_access()
1219 JBUFFER_TRACE(jh, "cancelling revoke"); in jbd2_journal_get_create_access()
1220 jbd2_journal_cancel_revoke(handle, jh); in jbd2_journal_get_create_access()
1222 jbd2_journal_put_journal_head(jh); in jbd2_journal_get_create_access()
1255 struct journal_head *jh; in jbd2_journal_get_undo_access() local
1261 jh = jbd2_journal_add_journal_head(bh); in jbd2_journal_get_undo_access()
1262 JBUFFER_TRACE(jh, "entry"); in jbd2_journal_get_undo_access()
1269 err = do_get_write_access(handle, jh, 1); in jbd2_journal_get_undo_access()
1274 if (!jh->b_committed_data) in jbd2_journal_get_undo_access()
1275 committed_data = jbd2_alloc(jh2bh(jh)->b_size, in jbd2_journal_get_undo_access()
1279 if (!jh->b_committed_data) { in jbd2_journal_get_undo_access()
1282 JBUFFER_TRACE(jh, "generate b_committed data"); in jbd2_journal_get_undo_access()
1288 jh->b_committed_data = committed_data; in jbd2_journal_get_undo_access()
1290 memcpy(jh->b_committed_data, bh->b_data, bh->b_size); in jbd2_journal_get_undo_access()
1294 jbd2_journal_put_journal_head(jh); in jbd2_journal_get_undo_access()
1314 struct journal_head *jh = jbd2_journal_grab_journal_head(bh); in jbd2_journal_set_triggers() local
1316 if (WARN_ON(!jh)) in jbd2_journal_set_triggers()
1318 jh->b_triggers = type; in jbd2_journal_set_triggers()
1319 jbd2_journal_put_journal_head(jh); in jbd2_journal_set_triggers()
1322 void jbd2_buffer_frozen_trigger(struct journal_head *jh, void *mapped_data, in jbd2_buffer_frozen_trigger() argument
1325 struct buffer_head *bh = jh2bh(jh); in jbd2_buffer_frozen_trigger()
1333 void jbd2_buffer_abort_trigger(struct journal_head *jh, in jbd2_buffer_abort_trigger() argument
1339 triggers->t_abort(triggers, jh2bh(jh)); in jbd2_buffer_abort_trigger()
1369 struct journal_head *jh; in jbd2_journal_dirty_metadata() local
1381 jh = bh2jh(bh); in jbd2_journal_dirty_metadata()
1382 jbd_debug(5, "journal_head %p\n", jh); in jbd2_journal_dirty_metadata()
1383 JBUFFER_TRACE(jh, "entry"); in jbd2_journal_dirty_metadata()
1391 if (jh->b_transaction != transaction && in jbd2_journal_dirty_metadata()
1392 jh->b_next_transaction != transaction) { in jbd2_journal_dirty_metadata()
1394 J_ASSERT_JH(jh, jh->b_transaction == transaction || in jbd2_journal_dirty_metadata()
1395 jh->b_next_transaction == transaction); in jbd2_journal_dirty_metadata()
1398 if (jh->b_modified == 1) { in jbd2_journal_dirty_metadata()
1400 if (jh->b_transaction == transaction && in jbd2_journal_dirty_metadata()
1401 jh->b_jlist != BJ_Metadata) { in jbd2_journal_dirty_metadata()
1403 if (jh->b_transaction == transaction && in jbd2_journal_dirty_metadata()
1404 jh->b_jlist != BJ_Metadata) in jbd2_journal_dirty_metadata()
1409 jh->b_jlist); in jbd2_journal_dirty_metadata()
1410 J_ASSERT_JH(jh, jh->b_transaction != transaction || in jbd2_journal_dirty_metadata()
1411 jh->b_jlist == BJ_Metadata); in jbd2_journal_dirty_metadata()
1420 if (jh->b_modified == 0) { in jbd2_journal_dirty_metadata()
1430 jh->b_modified = 1; in jbd2_journal_dirty_metadata()
1441 if (jh->b_transaction == transaction && jh->b_jlist == BJ_Metadata) { in jbd2_journal_dirty_metadata()
1442 JBUFFER_TRACE(jh, "fastpath"); in jbd2_journal_dirty_metadata()
1443 if (unlikely(jh->b_transaction != in jbd2_journal_dirty_metadata()
1450 jh->b_transaction, in jbd2_journal_dirty_metadata()
1451 jh->b_transaction ? jh->b_transaction->t_tid : 0, in jbd2_journal_dirty_metadata()
1468 if (jh->b_transaction != transaction) { in jbd2_journal_dirty_metadata()
1469 JBUFFER_TRACE(jh, "already on other transaction"); in jbd2_journal_dirty_metadata()
1470 if (unlikely(((jh->b_transaction != in jbd2_journal_dirty_metadata()
1472 (jh->b_next_transaction != transaction))) { in jbd2_journal_dirty_metadata()
1481 jh->b_transaction, in jbd2_journal_dirty_metadata()
1482 jh->b_transaction ? in jbd2_journal_dirty_metadata()
1483 jh->b_transaction->t_tid : 0, in jbd2_journal_dirty_metadata()
1484 jh->b_next_transaction, in jbd2_journal_dirty_metadata()
1485 jh->b_next_transaction ? in jbd2_journal_dirty_metadata()
1486 jh->b_next_transaction->t_tid : 0, in jbd2_journal_dirty_metadata()
1487 jh->b_jlist); in jbd2_journal_dirty_metadata()
1497 J_ASSERT_JH(jh, jh->b_frozen_data == NULL); in jbd2_journal_dirty_metadata()
1499 JBUFFER_TRACE(jh, "file as BJ_Metadata"); in jbd2_journal_dirty_metadata()
1501 __jbd2_journal_file_buffer(jh, transaction, BJ_Metadata); in jbd2_journal_dirty_metadata()
1506 JBUFFER_TRACE(jh, "exit"); in jbd2_journal_dirty_metadata()
1531 struct journal_head *jh; in jbd2_journal_forget() local
1546 jh = bh2jh(bh); in jbd2_journal_forget()
1550 if (!J_EXPECT_JH(jh, !jh->b_committed_data, in jbd2_journal_forget()
1557 was_modified = jh->b_modified; in jbd2_journal_forget()
1563 jh->b_modified = 0; in jbd2_journal_forget()
1565 if (jh->b_transaction == transaction) { in jbd2_journal_forget()
1566 J_ASSERT_JH(jh, !jh->b_frozen_data); in jbd2_journal_forget()
1574 JBUFFER_TRACE(jh, "belongs to current transaction: unfile"); in jbd2_journal_forget()
1596 if (jh->b_cp_transaction) { in jbd2_journal_forget()
1597 __jbd2_journal_temp_unlink_buffer(jh); in jbd2_journal_forget()
1598 __jbd2_journal_file_buffer(jh, transaction, BJ_Forget); in jbd2_journal_forget()
1600 __jbd2_journal_unfile_buffer(jh); in jbd2_journal_forget()
1607 } else if (jh->b_transaction) { in jbd2_journal_forget()
1608 J_ASSERT_JH(jh, (jh->b_transaction == in jbd2_journal_forget()
1612 JBUFFER_TRACE(jh, "belongs to older transaction"); in jbd2_journal_forget()
1622 if (!jh->b_next_transaction) { in jbd2_journal_forget()
1624 jh->b_next_transaction = transaction; in jbd2_journal_forget()
1627 J_ASSERT(jh->b_next_transaction == transaction); in jbd2_journal_forget()
1643 if (!jh->b_cp_transaction) { in jbd2_journal_forget()
1644 JBUFFER_TRACE(jh, "belongs to none transaction"); in jbd2_journal_forget()
1654 __jbd2_journal_remove_checkpoint(jh); in jbd2_journal_forget()
1666 __jbd2_journal_file_buffer(jh, transaction, BJ_Forget); in jbd2_journal_forget()
1885 __blist_add_buffer(struct journal_head **list, struct journal_head *jh) in __blist_add_buffer() argument
1888 jh->b_tnext = jh->b_tprev = jh; in __blist_add_buffer()
1889 *list = jh; in __blist_add_buffer()
1893 jh->b_tprev = last; in __blist_add_buffer()
1894 jh->b_tnext = first; in __blist_add_buffer()
1895 last->b_tnext = first->b_tprev = jh; in __blist_add_buffer()
1909 __blist_del_buffer(struct journal_head **list, struct journal_head *jh) in __blist_del_buffer() argument
1911 if (*list == jh) { in __blist_del_buffer()
1912 *list = jh->b_tnext; in __blist_del_buffer()
1913 if (*list == jh) in __blist_del_buffer()
1916 jh->b_tprev->b_tnext = jh->b_tnext; in __blist_del_buffer()
1917 jh->b_tnext->b_tprev = jh->b_tprev; in __blist_del_buffer()
1931 static void __jbd2_journal_temp_unlink_buffer(struct journal_head *jh) in __jbd2_journal_temp_unlink_buffer() argument
1935 struct buffer_head *bh = jh2bh(jh); in __jbd2_journal_temp_unlink_buffer()
1937 J_ASSERT_JH(jh, jbd_is_locked_bh_state(bh)); in __jbd2_journal_temp_unlink_buffer()
1938 transaction = jh->b_transaction; in __jbd2_journal_temp_unlink_buffer()
1942 J_ASSERT_JH(jh, jh->b_jlist < BJ_Types); in __jbd2_journal_temp_unlink_buffer()
1943 if (jh->b_jlist != BJ_None) in __jbd2_journal_temp_unlink_buffer()
1944 J_ASSERT_JH(jh, transaction != NULL); in __jbd2_journal_temp_unlink_buffer()
1946 switch (jh->b_jlist) { in __jbd2_journal_temp_unlink_buffer()
1951 J_ASSERT_JH(jh, transaction->t_nr_buffers >= 0); in __jbd2_journal_temp_unlink_buffer()
1965 __blist_del_buffer(list, jh); in __jbd2_journal_temp_unlink_buffer()
1966 jh->b_jlist = BJ_None; in __jbd2_journal_temp_unlink_buffer()
1980 static void __jbd2_journal_unfile_buffer(struct journal_head *jh) in __jbd2_journal_unfile_buffer() argument
1982 __jbd2_journal_temp_unlink_buffer(jh); in __jbd2_journal_unfile_buffer()
1983 jh->b_transaction = NULL; in __jbd2_journal_unfile_buffer()
1984 jbd2_journal_put_journal_head(jh); in __jbd2_journal_unfile_buffer()
1987 void jbd2_journal_unfile_buffer(journal_t *journal, struct journal_head *jh) in jbd2_journal_unfile_buffer() argument
1989 struct buffer_head *bh = jh2bh(jh); in jbd2_journal_unfile_buffer()
1995 __jbd2_journal_unfile_buffer(jh); in jbd2_journal_unfile_buffer()
2009 struct journal_head *jh; in __journal_try_to_free_buffer() local
2011 jh = bh2jh(bh); in __journal_try_to_free_buffer()
2016 if (jh->b_next_transaction != NULL || jh->b_transaction != NULL) in __journal_try_to_free_buffer()
2020 if (jh->b_cp_transaction != NULL) { in __journal_try_to_free_buffer()
2022 JBUFFER_TRACE(jh, "remove from checkpoint list"); in __journal_try_to_free_buffer()
2023 __jbd2_journal_remove_checkpoint(jh); in __journal_try_to_free_buffer()
2080 struct journal_head *jh; in jbd2_journal_try_to_free_buffers() local
2087 jh = jbd2_journal_grab_journal_head(bh); in jbd2_journal_try_to_free_buffers()
2088 if (!jh) in jbd2_journal_try_to_free_buffers()
2093 jbd2_journal_put_journal_head(jh); in jbd2_journal_try_to_free_buffers()
2117 static int __dispose_buffer(struct journal_head *jh, transaction_t *transaction) in __dispose_buffer() argument
2120 struct buffer_head *bh = jh2bh(jh); in __dispose_buffer()
2122 if (jh->b_cp_transaction) { in __dispose_buffer()
2123 JBUFFER_TRACE(jh, "on running+cp transaction"); in __dispose_buffer()
2124 __jbd2_journal_temp_unlink_buffer(jh); in __dispose_buffer()
2131 __jbd2_journal_file_buffer(jh, transaction, BJ_Forget); in __dispose_buffer()
2134 JBUFFER_TRACE(jh, "on running transaction"); in __dispose_buffer()
2135 __jbd2_journal_unfile_buffer(jh); in __dispose_buffer()
2191 struct journal_head *jh; in journal_unmap_buffer() local
2210 jh = jbd2_journal_grab_journal_head(bh); in journal_unmap_buffer()
2211 if (!jh) in journal_unmap_buffer()
2237 transaction = jh->b_transaction; in journal_unmap_buffer()
2243 if (!jh->b_cp_transaction) { in journal_unmap_buffer()
2244 JBUFFER_TRACE(jh, "not on any transaction: zap"); in journal_unmap_buffer()
2250 __jbd2_journal_remove_checkpoint(jh); in journal_unmap_buffer()
2262 JBUFFER_TRACE(jh, "checkpointed: add to BJ_Forget"); in journal_unmap_buffer()
2263 may_free = __dispose_buffer(jh, in journal_unmap_buffer()
2272 JBUFFER_TRACE(jh, "give to committing trans"); in journal_unmap_buffer()
2273 may_free = __dispose_buffer(jh, in journal_unmap_buffer()
2280 __jbd2_journal_remove_checkpoint(jh); in journal_unmap_buffer()
2285 JBUFFER_TRACE(jh, "on committing transaction"); in journal_unmap_buffer()
2292 jbd2_journal_put_journal_head(jh); in journal_unmap_buffer()
2306 jh->b_next_transaction = journal->j_running_transaction; in journal_unmap_buffer()
2307 jbd2_journal_put_journal_head(jh); in journal_unmap_buffer()
2319 J_ASSERT_JH(jh, transaction == journal->j_running_transaction); in journal_unmap_buffer()
2320 JBUFFER_TRACE(jh, "on running transaction"); in journal_unmap_buffer()
2321 may_free = __dispose_buffer(jh, transaction); in journal_unmap_buffer()
2333 jh->b_modified = 0; in journal_unmap_buffer()
2334 jbd2_journal_put_journal_head(jh); in journal_unmap_buffer()
2418 void __jbd2_journal_file_buffer(struct journal_head *jh, in __jbd2_journal_file_buffer() argument
2423 struct buffer_head *bh = jh2bh(jh); in __jbd2_journal_file_buffer()
2425 J_ASSERT_JH(jh, jbd_is_locked_bh_state(bh)); in __jbd2_journal_file_buffer()
2428 J_ASSERT_JH(jh, jh->b_jlist < BJ_Types); in __jbd2_journal_file_buffer()
2429 J_ASSERT_JH(jh, jh->b_transaction == transaction || in __jbd2_journal_file_buffer()
2430 jh->b_transaction == NULL); in __jbd2_journal_file_buffer()
2432 if (jh->b_transaction && jh->b_jlist == jlist) in __jbd2_journal_file_buffer()
2451 if (jh->b_transaction) in __jbd2_journal_file_buffer()
2452 __jbd2_journal_temp_unlink_buffer(jh); in __jbd2_journal_file_buffer()
2455 jh->b_transaction = transaction; in __jbd2_journal_file_buffer()
2459 J_ASSERT_JH(jh, !jh->b_committed_data); in __jbd2_journal_file_buffer()
2460 J_ASSERT_JH(jh, !jh->b_frozen_data); in __jbd2_journal_file_buffer()
2477 __blist_add_buffer(list, jh); in __jbd2_journal_file_buffer()
2478 jh->b_jlist = jlist; in __jbd2_journal_file_buffer()
2484 void jbd2_journal_file_buffer(struct journal_head *jh, in jbd2_journal_file_buffer() argument
2487 jbd_lock_bh_state(jh2bh(jh)); in jbd2_journal_file_buffer()
2489 __jbd2_journal_file_buffer(jh, transaction, jlist); in jbd2_journal_file_buffer()
2491 jbd_unlock_bh_state(jh2bh(jh)); in jbd2_journal_file_buffer()
2505 void __jbd2_journal_refile_buffer(struct journal_head *jh) in __jbd2_journal_refile_buffer() argument
2508 struct buffer_head *bh = jh2bh(jh); in __jbd2_journal_refile_buffer()
2510 J_ASSERT_JH(jh, jbd_is_locked_bh_state(bh)); in __jbd2_journal_refile_buffer()
2511 if (jh->b_transaction) in __jbd2_journal_refile_buffer()
2512 assert_spin_locked(&jh->b_transaction->t_journal->j_list_lock); in __jbd2_journal_refile_buffer()
2515 if (jh->b_next_transaction == NULL) { in __jbd2_journal_refile_buffer()
2516 __jbd2_journal_unfile_buffer(jh); in __jbd2_journal_refile_buffer()
2526 __jbd2_journal_temp_unlink_buffer(jh); in __jbd2_journal_refile_buffer()
2532 jh->b_transaction = jh->b_next_transaction; in __jbd2_journal_refile_buffer()
2533 jh->b_next_transaction = NULL; in __jbd2_journal_refile_buffer()
2536 else if (jh->b_modified) in __jbd2_journal_refile_buffer()
2540 __jbd2_journal_file_buffer(jh, jh->b_transaction, jlist); in __jbd2_journal_refile_buffer()
2541 J_ASSERT_JH(jh, jh->b_transaction->t_state == T_RUNNING); in __jbd2_journal_refile_buffer()
2553 void jbd2_journal_refile_buffer(journal_t *journal, struct journal_head *jh) in jbd2_journal_refile_buffer() argument
2555 struct buffer_head *bh = jh2bh(jh); in jbd2_journal_refile_buffer()
2561 __jbd2_journal_refile_buffer(jh); in jbd2_journal_refile_buffer()