diff options
Diffstat (limited to 'fs/jbd/journal.c')
-rw-r--r-- | fs/jbd/journal.c | 60 |
1 files changed, 39 insertions, 21 deletions
diff --git a/fs/jbd/journal.c b/fs/jbd/journal.c index b29c7678525d..425c2f2cf170 100644 --- a/fs/jbd/journal.c +++ b/fs/jbd/journal.c | |||
@@ -938,8 +938,16 @@ static int journal_reset(journal_t *journal) | |||
938 | } else { | 938 | } else { |
939 | /* Lock here to make assertions happy... */ | 939 | /* Lock here to make assertions happy... */ |
940 | mutex_lock(&journal->j_checkpoint_mutex); | 940 | mutex_lock(&journal->j_checkpoint_mutex); |
941 | /* Add the dynamic fields and write it to disk. */ | 941 | /* |
942 | journal_update_sb_log_tail(journal); | 942 | * Update log tail information. We use WRITE_FUA since new |
943 | * transaction will start reusing journal space and so we | ||
944 | * must make sure information about current log tail is on | ||
945 | * disk before that. | ||
946 | */ | ||
947 | journal_update_sb_log_tail(journal, | ||
948 | journal->j_tail_sequence, | ||
949 | journal->j_tail, | ||
950 | WRITE_FUA); | ||
943 | mutex_unlock(&journal->j_checkpoint_mutex); | 951 | mutex_unlock(&journal->j_checkpoint_mutex); |
944 | } | 952 | } |
945 | return journal_start_thread(journal); | 953 | return journal_start_thread(journal); |
@@ -1018,11 +1026,15 @@ int journal_create(journal_t *journal) | |||
1018 | return journal_reset(journal); | 1026 | return journal_reset(journal); |
1019 | } | 1027 | } |
1020 | 1028 | ||
1021 | static void journal_write_superblock(journal_t *journal) | 1029 | static void journal_write_superblock(journal_t *journal, int write_op) |
1022 | { | 1030 | { |
1023 | struct buffer_head *bh = journal->j_sb_buffer; | 1031 | struct buffer_head *bh = journal->j_sb_buffer; |
1032 | int ret; | ||
1024 | 1033 | ||
1025 | trace_journal_write_superblock(journal); | 1034 | trace_journal_write_superblock(journal, write_op); |
1035 | if (!(journal->j_flags & JFS_BARRIER)) | ||
1036 | write_op &= ~(REQ_FUA | REQ_FLUSH); | ||
1037 | lock_buffer(bh); | ||
1026 | if (buffer_write_io_error(bh)) { | 1038 | if (buffer_write_io_error(bh)) { |
1027 | char b[BDEVNAME_SIZE]; | 1039 | char b[BDEVNAME_SIZE]; |
1028 | /* | 1040 | /* |
@@ -1040,40 +1052,46 @@ static void journal_write_superblock(journal_t *journal) | |||
1040 | set_buffer_uptodate(bh); | 1052 | set_buffer_uptodate(bh); |
1041 | } | 1053 | } |
1042 | 1054 | ||
1043 | BUFFER_TRACE(bh, "marking dirty"); | 1055 | get_bh(bh); |
1044 | mark_buffer_dirty(bh); | 1056 | bh->b_end_io = end_buffer_write_sync; |
1045 | sync_dirty_buffer(bh); | 1057 | ret = submit_bh(write_op, bh); |
1058 | wait_on_buffer(bh); | ||
1046 | if (buffer_write_io_error(bh)) { | 1059 | if (buffer_write_io_error(bh)) { |
1047 | char b[BDEVNAME_SIZE]; | ||
1048 | printk(KERN_ERR "JBD: I/O error detected " | ||
1049 | "when updating journal superblock for %s.\n", | ||
1050 | journal_dev_name(journal, b)); | ||
1051 | clear_buffer_write_io_error(bh); | 1060 | clear_buffer_write_io_error(bh); |
1052 | set_buffer_uptodate(bh); | 1061 | set_buffer_uptodate(bh); |
1062 | ret = -EIO; | ||
1063 | } | ||
1064 | if (ret) { | ||
1065 | char b[BDEVNAME_SIZE]; | ||
1066 | printk(KERN_ERR "JBD: Error %d detected " | ||
1067 | "when updating journal superblock for %s.\n", | ||
1068 | ret, journal_dev_name(journal, b)); | ||
1053 | } | 1069 | } |
1054 | } | 1070 | } |
1055 | 1071 | ||
1056 | /** | 1072 | /** |
1057 | * journal_update_sb_log_tail() - Update log tail in journal sb on disk. | 1073 | * journal_update_sb_log_tail() - Update log tail in journal sb on disk. |
1058 | * @journal: The journal to update. | 1074 | * @journal: The journal to update. |
1075 | * @tail_tid: TID of the new transaction at the tail of the log | ||
1076 | * @tail_block: The first block of the transaction at the tail of the log | ||
1077 | * @write_op: With which operation should we write the journal sb | ||
1059 | * | 1078 | * |
1060 | * Update a journal's superblock information about log tail and write it to | 1079 | * Update a journal's superblock information about log tail and write it to |
1061 | * disk, waiting for the IO to complete. | 1080 | * disk, waiting for the IO to complete. |
1062 | */ | 1081 | */ |
1063 | void journal_update_sb_log_tail(journal_t *journal) | 1082 | void journal_update_sb_log_tail(journal_t *journal, tid_t tail_tid, |
1083 | unsigned int tail_block, int write_op) | ||
1064 | { | 1084 | { |
1065 | journal_superblock_t *sb = journal->j_superblock; | 1085 | journal_superblock_t *sb = journal->j_superblock; |
1066 | 1086 | ||
1067 | BUG_ON(!mutex_is_locked(&journal->j_checkpoint_mutex)); | 1087 | BUG_ON(!mutex_is_locked(&journal->j_checkpoint_mutex)); |
1068 | spin_lock(&journal->j_state_lock); | 1088 | jbd_debug(1,"JBD: updating superblock (start %u, seq %u)\n", |
1069 | jbd_debug(1,"JBD: updating superblock (start %u, seq %d, errno %d)\n", | 1089 | tail_block, tail_tid); |
1070 | journal->j_tail, journal->j_tail_sequence, journal->j_errno); | ||
1071 | 1090 | ||
1072 | sb->s_sequence = cpu_to_be32(journal->j_tail_sequence); | 1091 | sb->s_sequence = cpu_to_be32(tail_tid); |
1073 | sb->s_start = cpu_to_be32(journal->j_tail); | 1092 | sb->s_start = cpu_to_be32(tail_block); |
1074 | spin_unlock(&journal->j_state_lock); | ||
1075 | 1093 | ||
1076 | journal_write_superblock(journal); | 1094 | journal_write_superblock(journal, write_op); |
1077 | 1095 | ||
1078 | /* Log is no longer empty */ | 1096 | /* Log is no longer empty */ |
1079 | spin_lock(&journal->j_state_lock); | 1097 | spin_lock(&journal->j_state_lock); |
@@ -1102,7 +1120,7 @@ static void mark_journal_empty(journal_t *journal) | |||
1102 | sb->s_start = cpu_to_be32(0); | 1120 | sb->s_start = cpu_to_be32(0); |
1103 | spin_unlock(&journal->j_state_lock); | 1121 | spin_unlock(&journal->j_state_lock); |
1104 | 1122 | ||
1105 | journal_write_superblock(journal); | 1123 | journal_write_superblock(journal, WRITE_FUA); |
1106 | 1124 | ||
1107 | spin_lock(&journal->j_state_lock); | 1125 | spin_lock(&journal->j_state_lock); |
1108 | /* Log is empty */ | 1126 | /* Log is empty */ |
@@ -1127,7 +1145,7 @@ static void journal_update_sb_errno(journal_t *journal) | |||
1127 | sb->s_errno = cpu_to_be32(journal->j_errno); | 1145 | sb->s_errno = cpu_to_be32(journal->j_errno); |
1128 | spin_unlock(&journal->j_state_lock); | 1146 | spin_unlock(&journal->j_state_lock); |
1129 | 1147 | ||
1130 | journal_write_superblock(journal); | 1148 | journal_write_superblock(journal, WRITE_SYNC); |
1131 | } | 1149 | } |
1132 | 1150 | ||
1133 | /* | 1151 | /* |