Lines Matching refs:jh
30 static void __journal_temp_unlink_buffer(struct journal_head *jh);
519 do_get_write_access(handle_t *handle, struct journal_head *jh, in do_get_write_access() argument
535 jbd_debug(5, "journal_head %p, force_copy %d\n", jh, force_copy); in do_get_write_access()
537 JBUFFER_TRACE(jh, "entry"); in do_get_write_access()
539 bh = jh2bh(jh); in do_get_write_access()
564 if (jh->b_transaction) { in do_get_write_access()
565 J_ASSERT_JH(jh, in do_get_write_access()
566 jh->b_transaction == transaction || in do_get_write_access()
567 jh->b_transaction == in do_get_write_access()
569 if (jh->b_next_transaction) in do_get_write_access()
570 J_ASSERT_JH(jh, jh->b_next_transaction == in do_get_write_access()
579 JBUFFER_TRACE(jh, "Journalling dirty buffer"); in do_get_write_access()
597 if (jh->b_transaction == transaction || in do_get_write_access()
598 jh->b_next_transaction == transaction) in do_get_write_access()
605 jh->b_modified = 0; in do_get_write_access()
611 if (jh->b_frozen_data) { in do_get_write_access()
612 JBUFFER_TRACE(jh, "has frozen data"); in do_get_write_access()
613 J_ASSERT_JH(jh, jh->b_next_transaction == NULL); in do_get_write_access()
614 jh->b_next_transaction = transaction; in do_get_write_access()
620 if (jh->b_transaction && jh->b_transaction != transaction) { in do_get_write_access()
621 JBUFFER_TRACE(jh, "owned by older transaction"); in do_get_write_access()
622 J_ASSERT_JH(jh, jh->b_next_transaction == NULL); in do_get_write_access()
623 J_ASSERT_JH(jh, jh->b_transaction == in do_get_write_access()
635 if (jh->b_jlist == BJ_Shadow) { in do_get_write_access()
641 JBUFFER_TRACE(jh, "on shadow: sleep"); in do_get_write_access()
647 if (jh->b_jlist != BJ_Shadow) in do_get_write_access()
669 if (jh->b_jlist != BJ_Forget || force_copy) { in do_get_write_access()
670 JBUFFER_TRACE(jh, "generate frozen data"); in do_get_write_access()
672 JBUFFER_TRACE(jh, "allocate memory for buffer"); in do_get_write_access()
675 jbd_alloc(jh2bh(jh)->b_size, in do_get_write_access()
681 JBUFFER_TRACE(jh, "oom!"); in do_get_write_access()
688 jh->b_frozen_data = frozen_buffer; in do_get_write_access()
692 jh->b_next_transaction = transaction; in do_get_write_access()
701 if (!jh->b_transaction) { in do_get_write_access()
702 JBUFFER_TRACE(jh, "no transaction"); in do_get_write_access()
703 J_ASSERT_JH(jh, !jh->b_next_transaction); in do_get_write_access()
704 JBUFFER_TRACE(jh, "file as BJ_Reserved"); in do_get_write_access()
706 __journal_file_buffer(jh, transaction, BJ_Reserved); in do_get_write_access()
716 J_EXPECT_JH(jh, buffer_uptodate(jh2bh(jh)), in do_get_write_access()
718 page = jh2bh(jh)->b_page; in do_get_write_access()
719 offset = offset_in_page(jh2bh(jh)->b_data); in do_get_write_access()
721 memcpy(jh->b_frozen_data, source+offset, jh2bh(jh)->b_size); in do_get_write_access()
730 journal_cancel_revoke(handle, jh); in do_get_write_access()
736 JBUFFER_TRACE(jh, "exit"); in do_get_write_access()
753 struct journal_head *jh = journal_add_journal_head(bh); in journal_get_write_access() local
759 rc = do_get_write_access(handle, jh, 0); in journal_get_write_access()
760 journal_put_journal_head(jh); in journal_get_write_access()
788 struct journal_head *jh = journal_add_journal_head(bh); in journal_get_create_access() local
791 jbd_debug(5, "journal_head %p\n", jh); in journal_get_create_access()
797 JBUFFER_TRACE(jh, "entry"); in journal_get_create_access()
807 J_ASSERT_JH(jh, (jh->b_transaction == transaction || in journal_get_create_access()
808 jh->b_transaction == NULL || in journal_get_create_access()
809 (jh->b_transaction == journal->j_committing_transaction && in journal_get_create_access()
810 jh->b_jlist == BJ_Forget))); in journal_get_create_access()
812 J_ASSERT_JH(jh, jh->b_next_transaction == NULL); in journal_get_create_access()
813 J_ASSERT_JH(jh, buffer_locked(jh2bh(jh))); in journal_get_create_access()
815 if (jh->b_transaction == NULL) { in journal_get_create_access()
824 clear_buffer_dirty(jh2bh(jh)); in journal_get_create_access()
827 jh->b_modified = 0; in journal_get_create_access()
829 JBUFFER_TRACE(jh, "file as BJ_Reserved"); in journal_get_create_access()
830 __journal_file_buffer(jh, transaction, BJ_Reserved); in journal_get_create_access()
831 } else if (jh->b_transaction == journal->j_committing_transaction) { in journal_get_create_access()
833 jh->b_modified = 0; in journal_get_create_access()
835 JBUFFER_TRACE(jh, "set next transaction"); in journal_get_create_access()
836 jh->b_next_transaction = transaction; in journal_get_create_access()
848 JBUFFER_TRACE(jh, "cancelling revoke"); in journal_get_create_access()
849 journal_cancel_revoke(handle, jh); in journal_get_create_access()
851 journal_put_journal_head(jh); in journal_get_create_access()
883 struct journal_head *jh = journal_add_journal_head(bh); in journal_get_undo_access() local
886 JBUFFER_TRACE(jh, "entry"); in journal_get_undo_access()
893 err = do_get_write_access(handle, jh, 1); in journal_get_undo_access()
898 if (!jh->b_committed_data) { in journal_get_undo_access()
899 committed_data = jbd_alloc(jh2bh(jh)->b_size, GFP_NOFS); in journal_get_undo_access()
909 if (!jh->b_committed_data) { in journal_get_undo_access()
912 JBUFFER_TRACE(jh, "generate b_committed data"); in journal_get_undo_access()
918 jh->b_committed_data = committed_data; in journal_get_undo_access()
920 memcpy(jh->b_committed_data, bh->b_data, bh->b_size); in journal_get_undo_access()
924 journal_put_journal_head(jh); in journal_get_undo_access()
951 struct journal_head *jh; in journal_dirty_data() local
957 jh = journal_add_journal_head(bh); in journal_dirty_data()
958 JBUFFER_TRACE(jh, "entry"); in journal_dirty_data()
964 jbd_debug(4, "jh: %p, tid:%d\n", jh, handle->h_transaction->t_tid); in journal_dirty_data()
992 JBUFFER_TRACE(jh, "unmapped buffer, bailing out"); in journal_dirty_data()
996 if (jh->b_transaction) { in journal_dirty_data()
997 JBUFFER_TRACE(jh, "has transaction"); in journal_dirty_data()
998 if (jh->b_transaction != handle->h_transaction) { in journal_dirty_data()
999 JBUFFER_TRACE(jh, "belongs to older transaction"); in journal_dirty_data()
1000 J_ASSERT_JH(jh, jh->b_transaction == in journal_dirty_data()
1036 if (jh->b_jlist != BJ_None && in journal_dirty_data()
1037 jh->b_jlist != BJ_SyncData && in journal_dirty_data()
1038 jh->b_jlist != BJ_Locked) { in journal_dirty_data()
1039 JBUFFER_TRACE(jh, "Not stealing"); in journal_dirty_data()
1059 JBUFFER_TRACE(jh, "buffer got unmapped"); in journal_dirty_data()
1076 if (jh->b_transaction != NULL && in journal_dirty_data()
1077 jh->b_transaction != handle->h_transaction) { in journal_dirty_data()
1078 JBUFFER_TRACE(jh, "unfile from commit"); in journal_dirty_data()
1079 __journal_temp_unlink_buffer(jh); in journal_dirty_data()
1084 jh->b_transaction = handle->h_transaction; in journal_dirty_data()
1095 if (jh->b_jlist != BJ_SyncData && jh->b_jlist != BJ_Locked) { in journal_dirty_data()
1096 JBUFFER_TRACE(jh, "not on correct data list: unfile"); in journal_dirty_data()
1097 J_ASSERT_JH(jh, jh->b_jlist != BJ_Shadow); in journal_dirty_data()
1098 JBUFFER_TRACE(jh, "file as data"); in journal_dirty_data()
1099 __journal_file_buffer(jh, handle->h_transaction, in journal_dirty_data()
1103 JBUFFER_TRACE(jh, "not on a transaction"); in journal_dirty_data()
1104 __journal_file_buffer(jh, handle->h_transaction, BJ_SyncData); in journal_dirty_data()
1113 JBUFFER_TRACE(jh, "exit"); in journal_dirty_data()
1114 journal_put_journal_head(jh); in journal_dirty_data()
1141 struct journal_head *jh = bh2jh(bh); in journal_dirty_metadata() local
1143 jbd_debug(5, "journal_head %p\n", jh); in journal_dirty_metadata()
1144 JBUFFER_TRACE(jh, "entry"); in journal_dirty_metadata()
1150 if (jh->b_modified == 0) { in journal_dirty_metadata()
1156 jh->b_modified = 1; in journal_dirty_metadata()
1157 J_ASSERT_JH(jh, handle->h_buffer_credits > 0); in journal_dirty_metadata()
1168 if (jh->b_transaction == transaction && jh->b_jlist == BJ_Metadata) { in journal_dirty_metadata()
1169 JBUFFER_TRACE(jh, "fastpath"); in journal_dirty_metadata()
1170 J_ASSERT_JH(jh, jh->b_transaction == in journal_dirty_metadata()
1183 if (jh->b_transaction != transaction) { in journal_dirty_metadata()
1184 JBUFFER_TRACE(jh, "already on other transaction"); in journal_dirty_metadata()
1185 J_ASSERT_JH(jh, jh->b_transaction == in journal_dirty_metadata()
1187 J_ASSERT_JH(jh, jh->b_next_transaction == transaction); in journal_dirty_metadata()
1194 J_ASSERT_JH(jh, jh->b_frozen_data == NULL); in journal_dirty_metadata()
1196 JBUFFER_TRACE(jh, "file as BJ_Metadata"); in journal_dirty_metadata()
1198 __journal_file_buffer(jh, handle->h_transaction, BJ_Metadata); in journal_dirty_metadata()
1203 JBUFFER_TRACE(jh, "exit"); in journal_dirty_metadata()
1239 struct journal_head *jh; in journal_forget() local
1251 jh = bh2jh(bh); in journal_forget()
1255 if (!J_EXPECT_JH(jh, !jh->b_committed_data, in journal_forget()
1262 was_modified = jh->b_modified; in journal_forget()
1268 jh->b_modified = 0; in journal_forget()
1270 if (jh->b_transaction == handle->h_transaction) { in journal_forget()
1271 J_ASSERT_JH(jh, !jh->b_frozen_data); in journal_forget()
1279 JBUFFER_TRACE(jh, "belongs to current transaction: unfile"); in journal_forget()
1300 if (jh->b_cp_transaction) { in journal_forget()
1301 __journal_temp_unlink_buffer(jh); in journal_forget()
1302 __journal_file_buffer(jh, transaction, BJ_Forget); in journal_forget()
1304 __journal_unfile_buffer(jh); in journal_forget()
1312 } else if (jh->b_transaction) { in journal_forget()
1313 J_ASSERT_JH(jh, (jh->b_transaction == in journal_forget()
1317 JBUFFER_TRACE(jh, "belongs to older transaction"); in journal_forget()
1321 if (jh->b_next_transaction) { in journal_forget()
1322 J_ASSERT(jh->b_next_transaction == transaction); in journal_forget()
1323 jh->b_next_transaction = NULL; in journal_forget()
1525 __blist_add_buffer(struct journal_head **list, struct journal_head *jh) in __blist_add_buffer() argument
1528 jh->b_tnext = jh->b_tprev = jh; in __blist_add_buffer()
1529 *list = jh; in __blist_add_buffer()
1533 jh->b_tprev = last; in __blist_add_buffer()
1534 jh->b_tnext = first; in __blist_add_buffer()
1535 last->b_tnext = first->b_tprev = jh; in __blist_add_buffer()
1549 __blist_del_buffer(struct journal_head **list, struct journal_head *jh) in __blist_del_buffer() argument
1551 if (*list == jh) { in __blist_del_buffer()
1552 *list = jh->b_tnext; in __blist_del_buffer()
1553 if (*list == jh) in __blist_del_buffer()
1556 jh->b_tprev->b_tnext = jh->b_tnext; in __blist_del_buffer()
1557 jh->b_tnext->b_tprev = jh->b_tprev; in __blist_del_buffer()
1571 static void __journal_temp_unlink_buffer(struct journal_head *jh) in __journal_temp_unlink_buffer() argument
1575 struct buffer_head *bh = jh2bh(jh); in __journal_temp_unlink_buffer()
1577 J_ASSERT_JH(jh, jbd_is_locked_bh_state(bh)); in __journal_temp_unlink_buffer()
1578 transaction = jh->b_transaction; in __journal_temp_unlink_buffer()
1582 J_ASSERT_JH(jh, jh->b_jlist < BJ_Types); in __journal_temp_unlink_buffer()
1583 if (jh->b_jlist != BJ_None) in __journal_temp_unlink_buffer()
1584 J_ASSERT_JH(jh, transaction != NULL); in __journal_temp_unlink_buffer()
1586 switch (jh->b_jlist) { in __journal_temp_unlink_buffer()
1594 J_ASSERT_JH(jh, transaction->t_nr_buffers >= 0); in __journal_temp_unlink_buffer()
1617 __blist_del_buffer(list, jh); in __journal_temp_unlink_buffer()
1618 jh->b_jlist = BJ_None; in __journal_temp_unlink_buffer()
1630 void __journal_unfile_buffer(struct journal_head *jh) in __journal_unfile_buffer() argument
1632 __journal_temp_unlink_buffer(jh); in __journal_unfile_buffer()
1633 jh->b_transaction = NULL; in __journal_unfile_buffer()
1634 journal_put_journal_head(jh); in __journal_unfile_buffer()
1637 void journal_unfile_buffer(journal_t *journal, struct journal_head *jh) in journal_unfile_buffer() argument
1639 struct buffer_head *bh = jh2bh(jh); in journal_unfile_buffer()
1645 __journal_unfile_buffer(jh); in journal_unfile_buffer()
1659 struct journal_head *jh; in __journal_try_to_free_buffer() local
1661 jh = bh2jh(bh); in __journal_try_to_free_buffer()
1666 if (jh->b_next_transaction != NULL) in __journal_try_to_free_buffer()
1670 if (jh->b_transaction != NULL && jh->b_cp_transaction == NULL) { in __journal_try_to_free_buffer()
1671 if (jh->b_jlist == BJ_SyncData || jh->b_jlist == BJ_Locked) { in __journal_try_to_free_buffer()
1673 JBUFFER_TRACE(jh, "release data"); in __journal_try_to_free_buffer()
1674 __journal_unfile_buffer(jh); in __journal_try_to_free_buffer()
1676 } else if (jh->b_cp_transaction != NULL && jh->b_transaction == NULL) { in __journal_try_to_free_buffer()
1678 if (jh->b_jlist == BJ_None) { in __journal_try_to_free_buffer()
1679 JBUFFER_TRACE(jh, "remove from checkpoint list"); in __journal_try_to_free_buffer()
1680 __journal_remove_checkpoint(jh); in __journal_try_to_free_buffer()
1738 struct journal_head *jh; in journal_try_to_free_buffers() local
1745 jh = journal_grab_journal_head(bh); in journal_try_to_free_buffers()
1746 if (!jh) in journal_try_to_free_buffers()
1751 journal_put_journal_head(jh); in journal_try_to_free_buffers()
1775 static int __dispose_buffer(struct journal_head *jh, transaction_t *transaction) in __dispose_buffer() argument
1778 struct buffer_head *bh = jh2bh(jh); in __dispose_buffer()
1780 if (jh->b_cp_transaction) { in __dispose_buffer()
1781 JBUFFER_TRACE(jh, "on running+cp transaction"); in __dispose_buffer()
1782 __journal_temp_unlink_buffer(jh); in __dispose_buffer()
1789 __journal_file_buffer(jh, transaction, BJ_Forget); in __dispose_buffer()
1792 JBUFFER_TRACE(jh, "on running transaction"); in __dispose_buffer()
1793 __journal_unfile_buffer(jh); in __dispose_buffer()
1849 struct journal_head *jh; in journal_unmap_buffer() local
1868 jh = journal_grab_journal_head(bh); in journal_unmap_buffer()
1869 if (!jh) in journal_unmap_buffer()
1895 transaction = jh->b_transaction; in journal_unmap_buffer()
1901 if (!jh->b_cp_transaction) { in journal_unmap_buffer()
1902 JBUFFER_TRACE(jh, "not on any transaction: zap"); in journal_unmap_buffer()
1919 JBUFFER_TRACE(jh, "checkpointed: add to BJ_Forget"); in journal_unmap_buffer()
1920 may_free = __dispose_buffer(jh, in journal_unmap_buffer()
1929 JBUFFER_TRACE(jh, "give to committing trans"); in journal_unmap_buffer()
1930 may_free = __dispose_buffer(jh, in journal_unmap_buffer()
1941 JBUFFER_TRACE(jh, "on committing transaction"); in journal_unmap_buffer()
1942 if (jh->b_jlist == BJ_Locked) { in journal_unmap_buffer()
1948 may_free = __dispose_buffer(jh, transaction); in journal_unmap_buffer()
1959 journal_put_journal_head(jh); in journal_unmap_buffer()
1976 jh->b_next_transaction = journal->j_running_transaction; in journal_unmap_buffer()
1977 journal_put_journal_head(jh); in journal_unmap_buffer()
1989 J_ASSERT_JH(jh, transaction == journal->j_running_transaction); in journal_unmap_buffer()
1990 JBUFFER_TRACE(jh, "on running transaction"); in journal_unmap_buffer()
1991 may_free = __dispose_buffer(jh, transaction); in journal_unmap_buffer()
2002 jh->b_modified = 0; in journal_unmap_buffer()
2003 journal_put_journal_head(jh); in journal_unmap_buffer()
2078 void __journal_file_buffer(struct journal_head *jh, in __journal_file_buffer() argument
2083 struct buffer_head *bh = jh2bh(jh); in __journal_file_buffer()
2085 J_ASSERT_JH(jh, jbd_is_locked_bh_state(bh)); in __journal_file_buffer()
2088 J_ASSERT_JH(jh, jh->b_jlist < BJ_Types); in __journal_file_buffer()
2089 J_ASSERT_JH(jh, jh->b_transaction == transaction || in __journal_file_buffer()
2090 jh->b_transaction == NULL); in __journal_file_buffer()
2092 if (jh->b_transaction && jh->b_jlist == jlist) in __journal_file_buffer()
2111 if (jh->b_transaction) in __journal_file_buffer()
2112 __journal_temp_unlink_buffer(jh); in __journal_file_buffer()
2115 jh->b_transaction = transaction; in __journal_file_buffer()
2119 J_ASSERT_JH(jh, !jh->b_committed_data); in __journal_file_buffer()
2120 J_ASSERT_JH(jh, !jh->b_frozen_data); in __journal_file_buffer()
2149 __blist_add_buffer(list, jh); in __journal_file_buffer()
2150 jh->b_jlist = jlist; in __journal_file_buffer()
2156 void journal_file_buffer(struct journal_head *jh, in journal_file_buffer() argument
2159 jbd_lock_bh_state(jh2bh(jh)); in journal_file_buffer()
2161 __journal_file_buffer(jh, transaction, jlist); in journal_file_buffer()
2163 jbd_unlock_bh_state(jh2bh(jh)); in journal_file_buffer()
2177 void __journal_refile_buffer(struct journal_head *jh) in __journal_refile_buffer() argument
2180 struct buffer_head *bh = jh2bh(jh); in __journal_refile_buffer()
2182 J_ASSERT_JH(jh, jbd_is_locked_bh_state(bh)); in __journal_refile_buffer()
2183 if (jh->b_transaction) in __journal_refile_buffer()
2184 assert_spin_locked(&jh->b_transaction->t_journal->j_list_lock); in __journal_refile_buffer()
2187 if (jh->b_next_transaction == NULL) { in __journal_refile_buffer()
2188 __journal_unfile_buffer(jh); in __journal_refile_buffer()
2198 __journal_temp_unlink_buffer(jh); in __journal_refile_buffer()
2204 jh->b_transaction = jh->b_next_transaction; in __journal_refile_buffer()
2205 jh->b_next_transaction = NULL; in __journal_refile_buffer()
2208 else if (jh->b_modified) in __journal_refile_buffer()
2212 __journal_file_buffer(jh, jh->b_transaction, jlist); in __journal_refile_buffer()
2213 J_ASSERT_JH(jh, jh->b_transaction->t_state == T_RUNNING); in __journal_refile_buffer()
2225 void journal_refile_buffer(journal_t *journal, struct journal_head *jh) in journal_refile_buffer() argument
2227 struct buffer_head *bh = jh2bh(jh); in journal_refile_buffer()
2233 __journal_refile_buffer(jh); in journal_refile_buffer()