diff options
author | Mauro Carvalho Chehab <m.chehab@samsung.com> | 2014-04-14 11:00:36 -0400 |
---|---|---|
committer | Mauro Carvalho Chehab <m.chehab@samsung.com> | 2014-04-14 11:00:36 -0400 |
commit | 277a163c83d7ba93fba1e8980d29a9f8bfcfba6c (patch) | |
tree | ccfd357d152292958957b6b8a993892e7a8cc95f /fs/jbd2 | |
parent | a83b93a7480441a47856dc9104bea970e84cda87 (diff) | |
parent | c9eaa447e77efe77b7fa4c953bd62de8297fd6c5 (diff) |
Merge tag 'v3.15-rc1' into patchwork
Linux 3.15-rc1
* tag 'v3.15-rc1': (12180 commits)
Linux 3.15-rc1
mm: Initialize error in shmem_file_aio_read()
cifs: Use min_t() when comparing "size_t" and "unsigned long"
sym53c8xx_2: Set DID_REQUEUE return code when aborting squeue
powerpc: Don't try to set LPCR unless we're in hypervisor mode
futex: update documentation for ordering guarantees
ceph: fix pr_fmt() redefinition
vti: don't allow to add the same tunnel twice
gre: don't allow to add the same tunnel twice
drivers: net: xen-netfront: fix array initialization bug
missing bits of "splice: fix racy pipe->buffers uses"
cifs: fix the race in cifs_writev()
ceph_sync_{,direct_}write: fix an oops on ceph_osdc_new_request() failure
pktgen: be friendly to LLTX devices
r8152: check RTL8152_UNPLUG
net: sun4i-emac: add promiscuous support
net/apne: replace IS_ERR and PTR_ERR with PTR_ERR_OR_ZERO
blackfin: cleanup board files
bf609: clock: drop unused clock bit set/clear functions
Blackfin: bf537: rename "CONFIG_ADT75"
...
Diffstat (limited to 'fs/jbd2')
-rw-r--r-- | fs/jbd2/commit.c | 77 | ||||
-rw-r--r-- | fs/jbd2/journal.c | 10 | ||||
-rw-r--r-- | fs/jbd2/transaction.c | 46 |
3 files changed, 65 insertions, 68 deletions
diff --git a/fs/jbd2/commit.c b/fs/jbd2/commit.c index cf2fc0594063..5f26139a165a 100644 --- a/fs/jbd2/commit.c +++ b/fs/jbd2/commit.c | |||
@@ -555,7 +555,6 @@ void jbd2_journal_commit_transaction(journal_t *journal) | |||
555 | blk_start_plug(&plug); | 555 | blk_start_plug(&plug); |
556 | jbd2_journal_write_revoke_records(journal, commit_transaction, | 556 | jbd2_journal_write_revoke_records(journal, commit_transaction, |
557 | &log_bufs, WRITE_SYNC); | 557 | &log_bufs, WRITE_SYNC); |
558 | blk_finish_plug(&plug); | ||
559 | 558 | ||
560 | jbd_debug(3, "JBD2: commit phase 2b\n"); | 559 | jbd_debug(3, "JBD2: commit phase 2b\n"); |
561 | 560 | ||
@@ -582,7 +581,6 @@ void jbd2_journal_commit_transaction(journal_t *journal) | |||
582 | err = 0; | 581 | err = 0; |
583 | bufs = 0; | 582 | bufs = 0; |
584 | descriptor = NULL; | 583 | descriptor = NULL; |
585 | blk_start_plug(&plug); | ||
586 | while (commit_transaction->t_buffers) { | 584 | while (commit_transaction->t_buffers) { |
587 | 585 | ||
588 | /* Find the next buffer to be journaled... */ | 586 | /* Find the next buffer to be journaled... */ |
@@ -1067,6 +1065,25 @@ restart_loop: | |||
1067 | goto restart_loop; | 1065 | goto restart_loop; |
1068 | } | 1066 | } |
1069 | 1067 | ||
1068 | /* Add the transaction to the checkpoint list | ||
1069 | * __journal_remove_checkpoint() can not destroy transaction | ||
1070 | * under us because it is not marked as T_FINISHED yet */ | ||
1071 | if (journal->j_checkpoint_transactions == NULL) { | ||
1072 | journal->j_checkpoint_transactions = commit_transaction; | ||
1073 | commit_transaction->t_cpnext = commit_transaction; | ||
1074 | commit_transaction->t_cpprev = commit_transaction; | ||
1075 | } else { | ||
1076 | commit_transaction->t_cpnext = | ||
1077 | journal->j_checkpoint_transactions; | ||
1078 | commit_transaction->t_cpprev = | ||
1079 | commit_transaction->t_cpnext->t_cpprev; | ||
1080 | commit_transaction->t_cpnext->t_cpprev = | ||
1081 | commit_transaction; | ||
1082 | commit_transaction->t_cpprev->t_cpnext = | ||
1083 | commit_transaction; | ||
1084 | } | ||
1085 | spin_unlock(&journal->j_list_lock); | ||
1086 | |||
1070 | /* Done with this transaction! */ | 1087 | /* Done with this transaction! */ |
1071 | 1088 | ||
1072 | jbd_debug(3, "JBD2: commit phase 7\n"); | 1089 | jbd_debug(3, "JBD2: commit phase 7\n"); |
@@ -1085,24 +1102,7 @@ restart_loop: | |||
1085 | atomic_read(&commit_transaction->t_handle_count); | 1102 | atomic_read(&commit_transaction->t_handle_count); |
1086 | trace_jbd2_run_stats(journal->j_fs_dev->bd_dev, | 1103 | trace_jbd2_run_stats(journal->j_fs_dev->bd_dev, |
1087 | commit_transaction->t_tid, &stats.run); | 1104 | commit_transaction->t_tid, &stats.run); |
1088 | 1105 | stats.ts_requested = (commit_transaction->t_requested) ? 1 : 0; | |
1089 | /* | ||
1090 | * Calculate overall stats | ||
1091 | */ | ||
1092 | spin_lock(&journal->j_history_lock); | ||
1093 | journal->j_stats.ts_tid++; | ||
1094 | if (commit_transaction->t_requested) | ||
1095 | journal->j_stats.ts_requested++; | ||
1096 | journal->j_stats.run.rs_wait += stats.run.rs_wait; | ||
1097 | journal->j_stats.run.rs_request_delay += stats.run.rs_request_delay; | ||
1098 | journal->j_stats.run.rs_running += stats.run.rs_running; | ||
1099 | journal->j_stats.run.rs_locked += stats.run.rs_locked; | ||
1100 | journal->j_stats.run.rs_flushing += stats.run.rs_flushing; | ||
1101 | journal->j_stats.run.rs_logging += stats.run.rs_logging; | ||
1102 | journal->j_stats.run.rs_handle_count += stats.run.rs_handle_count; | ||
1103 | journal->j_stats.run.rs_blocks += stats.run.rs_blocks; | ||
1104 | journal->j_stats.run.rs_blocks_logged += stats.run.rs_blocks_logged; | ||
1105 | spin_unlock(&journal->j_history_lock); | ||
1106 | 1106 | ||
1107 | commit_transaction->t_state = T_COMMIT_CALLBACK; | 1107 | commit_transaction->t_state = T_COMMIT_CALLBACK; |
1108 | J_ASSERT(commit_transaction == journal->j_committing_transaction); | 1108 | J_ASSERT(commit_transaction == journal->j_committing_transaction); |
@@ -1122,24 +1122,6 @@ restart_loop: | |||
1122 | 1122 | ||
1123 | write_unlock(&journal->j_state_lock); | 1123 | write_unlock(&journal->j_state_lock); |
1124 | 1124 | ||
1125 | if (journal->j_checkpoint_transactions == NULL) { | ||
1126 | journal->j_checkpoint_transactions = commit_transaction; | ||
1127 | commit_transaction->t_cpnext = commit_transaction; | ||
1128 | commit_transaction->t_cpprev = commit_transaction; | ||
1129 | } else { | ||
1130 | commit_transaction->t_cpnext = | ||
1131 | journal->j_checkpoint_transactions; | ||
1132 | commit_transaction->t_cpprev = | ||
1133 | commit_transaction->t_cpnext->t_cpprev; | ||
1134 | commit_transaction->t_cpnext->t_cpprev = | ||
1135 | commit_transaction; | ||
1136 | commit_transaction->t_cpprev->t_cpnext = | ||
1137 | commit_transaction; | ||
1138 | } | ||
1139 | spin_unlock(&journal->j_list_lock); | ||
1140 | /* Drop all spin_locks because commit_callback may be block. | ||
1141 | * __journal_remove_checkpoint() can not destroy transaction | ||
1142 | * under us because it is not marked as T_FINISHED yet */ | ||
1143 | if (journal->j_commit_callback) | 1125 | if (journal->j_commit_callback) |
1144 | journal->j_commit_callback(journal, commit_transaction); | 1126 | journal->j_commit_callback(journal, commit_transaction); |
1145 | 1127 | ||
@@ -1150,7 +1132,7 @@ restart_loop: | |||
1150 | write_lock(&journal->j_state_lock); | 1132 | write_lock(&journal->j_state_lock); |
1151 | spin_lock(&journal->j_list_lock); | 1133 | spin_lock(&journal->j_list_lock); |
1152 | commit_transaction->t_state = T_FINISHED; | 1134 | commit_transaction->t_state = T_FINISHED; |
1153 | /* Recheck checkpoint lists after j_list_lock was dropped */ | 1135 | /* Check if the transaction can be dropped now that we are finished */ |
1154 | if (commit_transaction->t_checkpoint_list == NULL && | 1136 | if (commit_transaction->t_checkpoint_list == NULL && |
1155 | commit_transaction->t_checkpoint_io_list == NULL) { | 1137 | commit_transaction->t_checkpoint_io_list == NULL) { |
1156 | __jbd2_journal_drop_transaction(journal, commit_transaction); | 1138 | __jbd2_journal_drop_transaction(journal, commit_transaction); |
@@ -1159,4 +1141,21 @@ restart_loop: | |||
1159 | spin_unlock(&journal->j_list_lock); | 1141 | spin_unlock(&journal->j_list_lock); |
1160 | write_unlock(&journal->j_state_lock); | 1142 | write_unlock(&journal->j_state_lock); |
1161 | wake_up(&journal->j_wait_done_commit); | 1143 | wake_up(&journal->j_wait_done_commit); |
1144 | |||
1145 | /* | ||
1146 | * Calculate overall stats | ||
1147 | */ | ||
1148 | spin_lock(&journal->j_history_lock); | ||
1149 | journal->j_stats.ts_tid++; | ||
1150 | journal->j_stats.ts_requested += stats.ts_requested; | ||
1151 | journal->j_stats.run.rs_wait += stats.run.rs_wait; | ||
1152 | journal->j_stats.run.rs_request_delay += stats.run.rs_request_delay; | ||
1153 | journal->j_stats.run.rs_running += stats.run.rs_running; | ||
1154 | journal->j_stats.run.rs_locked += stats.run.rs_locked; | ||
1155 | journal->j_stats.run.rs_flushing += stats.run.rs_flushing; | ||
1156 | journal->j_stats.run.rs_logging += stats.run.rs_logging; | ||
1157 | journal->j_stats.run.rs_handle_count += stats.run.rs_handle_count; | ||
1158 | journal->j_stats.run.rs_blocks += stats.run.rs_blocks; | ||
1159 | journal->j_stats.run.rs_blocks_logged += stats.run.rs_blocks_logged; | ||
1160 | spin_unlock(&journal->j_history_lock); | ||
1162 | } | 1161 | } |
diff --git a/fs/jbd2/journal.c b/fs/jbd2/journal.c index 5fa344afb49a..67b8e303946c 100644 --- a/fs/jbd2/journal.c +++ b/fs/jbd2/journal.c | |||
@@ -122,7 +122,7 @@ EXPORT_SYMBOL(__jbd2_debug); | |||
122 | #endif | 122 | #endif |
123 | 123 | ||
124 | /* Checksumming functions */ | 124 | /* Checksumming functions */ |
125 | int jbd2_verify_csum_type(journal_t *j, journal_superblock_t *sb) | 125 | static int jbd2_verify_csum_type(journal_t *j, journal_superblock_t *sb) |
126 | { | 126 | { |
127 | if (!JBD2_HAS_INCOMPAT_FEATURE(j, JBD2_FEATURE_INCOMPAT_CSUM_V2)) | 127 | if (!JBD2_HAS_INCOMPAT_FEATURE(j, JBD2_FEATURE_INCOMPAT_CSUM_V2)) |
128 | return 1; | 128 | return 1; |
@@ -143,7 +143,7 @@ static __be32 jbd2_superblock_csum(journal_t *j, journal_superblock_t *sb) | |||
143 | return cpu_to_be32(csum); | 143 | return cpu_to_be32(csum); |
144 | } | 144 | } |
145 | 145 | ||
146 | int jbd2_superblock_csum_verify(journal_t *j, journal_superblock_t *sb) | 146 | static int jbd2_superblock_csum_verify(journal_t *j, journal_superblock_t *sb) |
147 | { | 147 | { |
148 | if (!JBD2_HAS_INCOMPAT_FEATURE(j, JBD2_FEATURE_INCOMPAT_CSUM_V2)) | 148 | if (!JBD2_HAS_INCOMPAT_FEATURE(j, JBD2_FEATURE_INCOMPAT_CSUM_V2)) |
149 | return 1; | 149 | return 1; |
@@ -151,7 +151,7 @@ int jbd2_superblock_csum_verify(journal_t *j, journal_superblock_t *sb) | |||
151 | return sb->s_checksum == jbd2_superblock_csum(j, sb); | 151 | return sb->s_checksum == jbd2_superblock_csum(j, sb); |
152 | } | 152 | } |
153 | 153 | ||
154 | void jbd2_superblock_csum_set(journal_t *j, journal_superblock_t *sb) | 154 | static void jbd2_superblock_csum_set(journal_t *j, journal_superblock_t *sb) |
155 | { | 155 | { |
156 | if (!JBD2_HAS_INCOMPAT_FEATURE(j, JBD2_FEATURE_INCOMPAT_CSUM_V2)) | 156 | if (!JBD2_HAS_INCOMPAT_FEATURE(j, JBD2_FEATURE_INCOMPAT_CSUM_V2)) |
157 | return; | 157 | return; |
@@ -302,8 +302,8 @@ static void journal_kill_thread(journal_t *journal) | |||
302 | journal->j_flags |= JBD2_UNMOUNT; | 302 | journal->j_flags |= JBD2_UNMOUNT; |
303 | 303 | ||
304 | while (journal->j_task) { | 304 | while (journal->j_task) { |
305 | wake_up(&journal->j_wait_commit); | ||
306 | write_unlock(&journal->j_state_lock); | 305 | write_unlock(&journal->j_state_lock); |
306 | wake_up(&journal->j_wait_commit); | ||
307 | wait_event(journal->j_wait_done_commit, journal->j_task == NULL); | 307 | wait_event(journal->j_wait_done_commit, journal->j_task == NULL); |
308 | write_lock(&journal->j_state_lock); | 308 | write_lock(&journal->j_state_lock); |
309 | } | 309 | } |
@@ -710,8 +710,8 @@ int jbd2_log_wait_commit(journal_t *journal, tid_t tid) | |||
710 | while (tid_gt(tid, journal->j_commit_sequence)) { | 710 | while (tid_gt(tid, journal->j_commit_sequence)) { |
711 | jbd_debug(1, "JBD2: want %d, j_commit_sequence=%d\n", | 711 | jbd_debug(1, "JBD2: want %d, j_commit_sequence=%d\n", |
712 | tid, journal->j_commit_sequence); | 712 | tid, journal->j_commit_sequence); |
713 | wake_up(&journal->j_wait_commit); | ||
714 | read_unlock(&journal->j_state_lock); | 713 | read_unlock(&journal->j_state_lock); |
714 | wake_up(&journal->j_wait_commit); | ||
715 | wait_event(journal->j_wait_done_commit, | 715 | wait_event(journal->j_wait_done_commit, |
716 | !tid_gt(tid, journal->j_commit_sequence)); | 716 | !tid_gt(tid, journal->j_commit_sequence)); |
717 | read_lock(&journal->j_state_lock); | 717 | read_lock(&journal->j_state_lock); |
diff --git a/fs/jbd2/transaction.c b/fs/jbd2/transaction.c index 60bb365f54a5..38cfcf5f6fce 100644 --- a/fs/jbd2/transaction.c +++ b/fs/jbd2/transaction.c | |||
@@ -1073,7 +1073,6 @@ int jbd2_journal_get_create_access(handle_t *handle, struct buffer_head *bh) | |||
1073 | * reused here. | 1073 | * reused here. |
1074 | */ | 1074 | */ |
1075 | jbd_lock_bh_state(bh); | 1075 | jbd_lock_bh_state(bh); |
1076 | spin_lock(&journal->j_list_lock); | ||
1077 | J_ASSERT_JH(jh, (jh->b_transaction == transaction || | 1076 | J_ASSERT_JH(jh, (jh->b_transaction == transaction || |
1078 | jh->b_transaction == NULL || | 1077 | jh->b_transaction == NULL || |
1079 | (jh->b_transaction == journal->j_committing_transaction && | 1078 | (jh->b_transaction == journal->j_committing_transaction && |
@@ -1096,12 +1095,14 @@ int jbd2_journal_get_create_access(handle_t *handle, struct buffer_head *bh) | |||
1096 | jh->b_modified = 0; | 1095 | jh->b_modified = 0; |
1097 | 1096 | ||
1098 | JBUFFER_TRACE(jh, "file as BJ_Reserved"); | 1097 | JBUFFER_TRACE(jh, "file as BJ_Reserved"); |
1098 | spin_lock(&journal->j_list_lock); | ||
1099 | __jbd2_journal_file_buffer(jh, transaction, BJ_Reserved); | 1099 | __jbd2_journal_file_buffer(jh, transaction, BJ_Reserved); |
1100 | } else if (jh->b_transaction == journal->j_committing_transaction) { | 1100 | } else if (jh->b_transaction == journal->j_committing_transaction) { |
1101 | /* first access by this transaction */ | 1101 | /* first access by this transaction */ |
1102 | jh->b_modified = 0; | 1102 | jh->b_modified = 0; |
1103 | 1103 | ||
1104 | JBUFFER_TRACE(jh, "set next transaction"); | 1104 | JBUFFER_TRACE(jh, "set next transaction"); |
1105 | spin_lock(&journal->j_list_lock); | ||
1105 | jh->b_next_transaction = transaction; | 1106 | jh->b_next_transaction = transaction; |
1106 | } | 1107 | } |
1107 | spin_unlock(&journal->j_list_lock); | 1108 | spin_unlock(&journal->j_list_lock); |
@@ -1312,7 +1313,7 @@ int jbd2_journal_dirty_metadata(handle_t *handle, struct buffer_head *bh) | |||
1312 | journal->j_running_transaction)) { | 1313 | journal->j_running_transaction)) { |
1313 | printk(KERN_ERR "JBD2: %s: " | 1314 | printk(KERN_ERR "JBD2: %s: " |
1314 | "jh->b_transaction (%llu, %p, %u) != " | 1315 | "jh->b_transaction (%llu, %p, %u) != " |
1315 | "journal->j_running_transaction (%p, %u)", | 1316 | "journal->j_running_transaction (%p, %u)\n", |
1316 | journal->j_devname, | 1317 | journal->j_devname, |
1317 | (unsigned long long) bh->b_blocknr, | 1318 | (unsigned long long) bh->b_blocknr, |
1318 | jh->b_transaction, | 1319 | jh->b_transaction, |
@@ -1335,30 +1336,25 @@ int jbd2_journal_dirty_metadata(handle_t *handle, struct buffer_head *bh) | |||
1335 | */ | 1336 | */ |
1336 | if (jh->b_transaction != transaction) { | 1337 | if (jh->b_transaction != transaction) { |
1337 | JBUFFER_TRACE(jh, "already on other transaction"); | 1338 | JBUFFER_TRACE(jh, "already on other transaction"); |
1338 | if (unlikely(jh->b_transaction != | 1339 | if (unlikely(((jh->b_transaction != |
1339 | journal->j_committing_transaction)) { | 1340 | journal->j_committing_transaction)) || |
1340 | printk(KERN_ERR "JBD2: %s: " | 1341 | (jh->b_next_transaction != transaction))) { |
1341 | "jh->b_transaction (%llu, %p, %u) != " | 1342 | printk(KERN_ERR "jbd2_journal_dirty_metadata: %s: " |
1342 | "journal->j_committing_transaction (%p, %u)", | 1343 | "bad jh for block %llu: " |
1344 | "transaction (%p, %u), " | ||
1345 | "jh->b_transaction (%p, %u), " | ||
1346 | "jh->b_next_transaction (%p, %u), jlist %u\n", | ||
1343 | journal->j_devname, | 1347 | journal->j_devname, |
1344 | (unsigned long long) bh->b_blocknr, | 1348 | (unsigned long long) bh->b_blocknr, |
1349 | transaction, transaction->t_tid, | ||
1345 | jh->b_transaction, | 1350 | jh->b_transaction, |
1346 | jh->b_transaction ? jh->b_transaction->t_tid : 0, | 1351 | jh->b_transaction ? |
1347 | journal->j_committing_transaction, | 1352 | jh->b_transaction->t_tid : 0, |
1348 | journal->j_committing_transaction ? | ||
1349 | journal->j_committing_transaction->t_tid : 0); | ||
1350 | ret = -EINVAL; | ||
1351 | } | ||
1352 | if (unlikely(jh->b_next_transaction != transaction)) { | ||
1353 | printk(KERN_ERR "JBD2: %s: " | ||
1354 | "jh->b_next_transaction (%llu, %p, %u) != " | ||
1355 | "transaction (%p, %u)", | ||
1356 | journal->j_devname, | ||
1357 | (unsigned long long) bh->b_blocknr, | ||
1358 | jh->b_next_transaction, | 1353 | jh->b_next_transaction, |
1359 | jh->b_next_transaction ? | 1354 | jh->b_next_transaction ? |
1360 | jh->b_next_transaction->t_tid : 0, | 1355 | jh->b_next_transaction->t_tid : 0, |
1361 | transaction, transaction->t_tid); | 1356 | jh->b_jlist); |
1357 | WARN_ON(1); | ||
1362 | ret = -EINVAL; | 1358 | ret = -EINVAL; |
1363 | } | 1359 | } |
1364 | /* And this case is illegal: we can't reuse another | 1360 | /* And this case is illegal: we can't reuse another |
@@ -1415,7 +1411,6 @@ int jbd2_journal_forget (handle_t *handle, struct buffer_head *bh) | |||
1415 | BUFFER_TRACE(bh, "entry"); | 1411 | BUFFER_TRACE(bh, "entry"); |
1416 | 1412 | ||
1417 | jbd_lock_bh_state(bh); | 1413 | jbd_lock_bh_state(bh); |
1418 | spin_lock(&journal->j_list_lock); | ||
1419 | 1414 | ||
1420 | if (!buffer_jbd(bh)) | 1415 | if (!buffer_jbd(bh)) |
1421 | goto not_jbd; | 1416 | goto not_jbd; |
@@ -1468,6 +1463,7 @@ int jbd2_journal_forget (handle_t *handle, struct buffer_head *bh) | |||
1468 | * we know to remove the checkpoint after we commit. | 1463 | * we know to remove the checkpoint after we commit. |
1469 | */ | 1464 | */ |
1470 | 1465 | ||
1466 | spin_lock(&journal->j_list_lock); | ||
1471 | if (jh->b_cp_transaction) { | 1467 | if (jh->b_cp_transaction) { |
1472 | __jbd2_journal_temp_unlink_buffer(jh); | 1468 | __jbd2_journal_temp_unlink_buffer(jh); |
1473 | __jbd2_journal_file_buffer(jh, transaction, BJ_Forget); | 1469 | __jbd2_journal_file_buffer(jh, transaction, BJ_Forget); |
@@ -1480,6 +1476,7 @@ int jbd2_journal_forget (handle_t *handle, struct buffer_head *bh) | |||
1480 | goto drop; | 1476 | goto drop; |
1481 | } | 1477 | } |
1482 | } | 1478 | } |
1479 | spin_unlock(&journal->j_list_lock); | ||
1483 | } else if (jh->b_transaction) { | 1480 | } else if (jh->b_transaction) { |
1484 | J_ASSERT_JH(jh, (jh->b_transaction == | 1481 | J_ASSERT_JH(jh, (jh->b_transaction == |
1485 | journal->j_committing_transaction)); | 1482 | journal->j_committing_transaction)); |
@@ -1491,7 +1488,9 @@ int jbd2_journal_forget (handle_t *handle, struct buffer_head *bh) | |||
1491 | 1488 | ||
1492 | if (jh->b_next_transaction) { | 1489 | if (jh->b_next_transaction) { |
1493 | J_ASSERT(jh->b_next_transaction == transaction); | 1490 | J_ASSERT(jh->b_next_transaction == transaction); |
1491 | spin_lock(&journal->j_list_lock); | ||
1494 | jh->b_next_transaction = NULL; | 1492 | jh->b_next_transaction = NULL; |
1493 | spin_unlock(&journal->j_list_lock); | ||
1495 | 1494 | ||
1496 | /* | 1495 | /* |
1497 | * only drop a reference if this transaction modified | 1496 | * only drop a reference if this transaction modified |
@@ -1503,7 +1502,6 @@ int jbd2_journal_forget (handle_t *handle, struct buffer_head *bh) | |||
1503 | } | 1502 | } |
1504 | 1503 | ||
1505 | not_jbd: | 1504 | not_jbd: |
1506 | spin_unlock(&journal->j_list_lock); | ||
1507 | jbd_unlock_bh_state(bh); | 1505 | jbd_unlock_bh_state(bh); |
1508 | __brelse(bh); | 1506 | __brelse(bh); |
1509 | drop: | 1507 | drop: |
@@ -1821,11 +1819,11 @@ __journal_try_to_free_buffer(journal_t *journal, struct buffer_head *bh) | |||
1821 | if (buffer_locked(bh) || buffer_dirty(bh)) | 1819 | if (buffer_locked(bh) || buffer_dirty(bh)) |
1822 | goto out; | 1820 | goto out; |
1823 | 1821 | ||
1824 | if (jh->b_next_transaction != NULL) | 1822 | if (jh->b_next_transaction != NULL || jh->b_transaction != NULL) |
1825 | goto out; | 1823 | goto out; |
1826 | 1824 | ||
1827 | spin_lock(&journal->j_list_lock); | 1825 | spin_lock(&journal->j_list_lock); |
1828 | if (jh->b_cp_transaction != NULL && jh->b_transaction == NULL) { | 1826 | if (jh->b_cp_transaction != NULL) { |
1829 | /* written-back checkpointed metadata buffer */ | 1827 | /* written-back checkpointed metadata buffer */ |
1830 | JBUFFER_TRACE(jh, "remove from checkpoint list"); | 1828 | JBUFFER_TRACE(jh, "remove from checkpoint list"); |
1831 | __jbd2_journal_remove_checkpoint(jh); | 1829 | __jbd2_journal_remove_checkpoint(jh); |