1 // SPDX-License-Identifier: GPL-2.0+ 2 /* 3 * linux/fs/jbd2/checkpoint.c 4 * 5 * Written by Stephen C. Tweedie <sct@redhat.com>, 1999 6 * 7 * Copyright 1999 Red Hat Software --- All Rights Reserved 8 * 9 * Checkpoint routines for the generic filesystem journaling code. 10 * Part of the ext2fs journaling system. 11 * 12 * Checkpointing is the process of ensuring that a section of the log is 13 * committed fully to disk, so that that portion of the log can be 14 * reused. 15 */ 16 17 #include <linux/time.h> 18 #include <linux/fs.h> 19 #include <linux/jbd2.h> 20 #include <linux/errno.h> 21 #include <linux/slab.h> 22 #include <linux/blkdev.h> 23 #include <trace/events/jbd2.h> 24 25 /* 26 * Unlink a buffer from a transaction checkpoint list. 27 * 28 * Called with j_list_lock held. 29 */ 30 static inline void __buffer_unlink(struct journal_head *jh) 31 { 32 transaction_t *transaction = jh->b_cp_transaction; 33 34 jh->b_cpnext->b_cpprev = jh->b_cpprev; 35 jh->b_cpprev->b_cpnext = jh->b_cpnext; 36 if (transaction->t_checkpoint_list == jh) { 37 transaction->t_checkpoint_list = jh->b_cpnext; 38 if (transaction->t_checkpoint_list == jh) 39 transaction->t_checkpoint_list = NULL; 40 } 41 } 42 43 /* 44 * __jbd2_log_wait_for_space: wait until there is space in the journal. 45 * 46 * Called under j-state_lock *only*. It will be unlocked if we have to wait 47 * for a checkpoint to free up some space in the log. 48 */ 49 void __jbd2_log_wait_for_space(journal_t *journal) 50 __acquires(&journal->j_state_lock) 51 __releases(&journal->j_state_lock) 52 { 53 int nblocks, space_left; 54 /* assert_spin_locked(&journal->j_state_lock); */ 55 56 nblocks = journal->j_max_transaction_buffers; 57 while (jbd2_log_space_left(journal) < nblocks) { 58 write_unlock(&journal->j_state_lock); 59 mutex_lock_io(&journal->j_checkpoint_mutex); 60 61 /* 62 * Test again, another process may have checkpointed while we 63 * were waiting for the checkpoint lock. If there are no 64 * transactions ready to be checkpointed, try to recover 65 * journal space by calling cleanup_journal_tail(), and if 66 * that doesn't work, by waiting for the currently committing 67 * transaction to complete. If there is absolutely no way 68 * to make progress, this is either a BUG or corrupted 69 * filesystem, so abort the journal and leave a stack 70 * trace for forensic evidence. 71 */ 72 write_lock(&journal->j_state_lock); 73 if (journal->j_flags & JBD2_ABORT) { 74 mutex_unlock(&journal->j_checkpoint_mutex); 75 return; 76 } 77 spin_lock(&journal->j_list_lock); 78 space_left = jbd2_log_space_left(journal); 79 if (space_left < nblocks) { 80 int chkpt = journal->j_checkpoint_transactions != NULL; 81 tid_t tid = 0; 82 bool has_transaction = false; 83 84 if (journal->j_committing_transaction) { 85 tid = journal->j_committing_transaction->t_tid; 86 has_transaction = true; 87 } 88 spin_unlock(&journal->j_list_lock); 89 write_unlock(&journal->j_state_lock); 90 if (chkpt) { 91 jbd2_log_do_checkpoint(journal); 92 } else if (jbd2_cleanup_journal_tail(journal) <= 0) { 93 /* 94 * We were able to recover space or the 95 * journal was aborted due to an error. 96 */ 97 ; 98 } else if (has_transaction) { 99 /* 100 * jbd2_journal_commit_transaction() may want 101 * to take the checkpoint_mutex if JBD2_FLUSHED 102 * is set. So we need to temporarily drop it. 103 */ 104 mutex_unlock(&journal->j_checkpoint_mutex); 105 jbd2_log_wait_commit(journal, tid); 106 write_lock(&journal->j_state_lock); 107 continue; 108 } else { 109 printk(KERN_ERR "%s: needed %d blocks and " 110 "only had %d space available\n", 111 __func__, nblocks, space_left); 112 printk(KERN_ERR "%s: no way to get more " 113 "journal space in %s\n", __func__, 114 journal->j_devname); 115 WARN_ON(1); 116 jbd2_journal_abort(journal, -EIO); 117 } 118 write_lock(&journal->j_state_lock); 119 } else { 120 spin_unlock(&journal->j_list_lock); 121 } 122 mutex_unlock(&journal->j_checkpoint_mutex); 123 } 124 } 125 126 static void 127 __flush_batch(journal_t *journal, int *batch_count) 128 { 129 int i; 130 struct blk_plug plug; 131 132 blk_start_plug(&plug); 133 for (i = 0; i < *batch_count; i++) 134 write_dirty_buffer(journal->j_chkpt_bhs[i], REQ_SYNC); 135 blk_finish_plug(&plug); 136 137 for (i = 0; i < *batch_count; i++) { 138 struct buffer_head *bh = journal->j_chkpt_bhs[i]; 139 BUFFER_TRACE(bh, "brelse"); 140 __brelse(bh); 141 journal->j_chkpt_bhs[i] = NULL; 142 } 143 *batch_count = 0; 144 } 145 146 /* 147 * Perform an actual checkpoint. We take the first transaction on the 148 * list of transactions to be checkpointed and send all its buffers 149 * to disk. We submit larger chunks of data at once. 150 * 151 * The journal should be locked before calling this function. 152 * Called with j_checkpoint_mutex held. 153 */ 154 int jbd2_log_do_checkpoint(journal_t *journal) 155 { 156 struct journal_head *jh; 157 struct buffer_head *bh; 158 transaction_t *transaction; 159 tid_t this_tid; 160 int result, batch_count = 0; 161 162 jbd2_debug(1, "Start checkpoint\n"); 163 164 /* 165 * First thing: if there are any transactions in the log which 166 * don't need checkpointing, just eliminate them from the 167 * journal straight away. 168 */ 169 result = jbd2_cleanup_journal_tail(journal); 170 trace_jbd2_checkpoint(journal, result); 171 jbd2_debug(1, "cleanup_journal_tail returned %d\n", result); 172 if (result <= 0) 173 return result; 174 175 /* 176 * OK, we need to start writing disk blocks. Take one transaction 177 * and write it. 178 */ 179 spin_lock(&journal->j_list_lock); 180 if (!journal->j_checkpoint_transactions) 181 goto out; 182 transaction = journal->j_checkpoint_transactions; 183 if (transaction->t_chp_stats.cs_chp_time == 0) 184 transaction->t_chp_stats.cs_chp_time = jiffies; 185 this_tid = transaction->t_tid; 186 restart: 187 /* 188 * If someone cleaned up this transaction while we slept, we're 189 * done (maybe it's a new transaction, but it fell at the same 190 * address). 191 */ 192 if (journal->j_checkpoint_transactions != transaction || 193 transaction->t_tid != this_tid) 194 goto out; 195 196 /* checkpoint all of the transaction's buffers */ 197 while (transaction->t_checkpoint_list) { 198 jh = transaction->t_checkpoint_list; 199 bh = jh2bh(jh); 200 201 if (jh->b_transaction != NULL) { 202 transaction_t *t = jh->b_transaction; 203 tid_t tid = t->t_tid; 204 205 transaction->t_chp_stats.cs_forced_to_close++; 206 spin_unlock(&journal->j_list_lock); 207 if (unlikely(journal->j_flags & JBD2_UNMOUNT)) 208 /* 209 * The journal thread is dead; so 210 * starting and waiting for a commit 211 * to finish will cause us to wait for 212 * a _very_ long time. 213 */ 214 printk(KERN_ERR 215 "JBD2: %s: Waiting for Godot: block %llu\n", 216 journal->j_devname, (unsigned long long) bh->b_blocknr); 217 218 if (batch_count) 219 __flush_batch(journal, &batch_count); 220 jbd2_log_start_commit(journal, tid); 221 /* 222 * jbd2_journal_commit_transaction() may want 223 * to take the checkpoint_mutex if JBD2_FLUSHED 224 * is set, jbd2_update_log_tail() called by 225 * jbd2_journal_commit_transaction() may also take 226 * checkpoint_mutex. So we need to temporarily 227 * drop it. 228 */ 229 mutex_unlock(&journal->j_checkpoint_mutex); 230 jbd2_log_wait_commit(journal, tid); 231 mutex_lock_io(&journal->j_checkpoint_mutex); 232 spin_lock(&journal->j_list_lock); 233 goto restart; 234 } 235 if (!trylock_buffer(bh)) { 236 /* 237 * The buffer is locked, it may be writing back, or 238 * flushing out in the last couple of cycles, or 239 * re-adding into a new transaction, need to check 240 * it again until it's unlocked. 241 */ 242 get_bh(bh); 243 spin_unlock(&journal->j_list_lock); 244 wait_on_buffer(bh); 245 /* the journal_head may have gone by now */ 246 BUFFER_TRACE(bh, "brelse"); 247 __brelse(bh); 248 goto retry; 249 } else if (!buffer_dirty(bh)) { 250 unlock_buffer(bh); 251 BUFFER_TRACE(bh, "remove from checkpoint"); 252 /* 253 * If the transaction was released or the checkpoint 254 * list was empty, we're done. 255 */ 256 if (__jbd2_journal_remove_checkpoint(jh) || 257 !transaction->t_checkpoint_list) 258 goto out; 259 } else { 260 unlock_buffer(bh); 261 /* 262 * We are about to write the buffer, it could be 263 * raced by some other transaction shrink or buffer 264 * re-log logic once we release the j_list_lock, 265 * leave it on the checkpoint list and check status 266 * again to make sure it's clean. 267 */ 268 BUFFER_TRACE(bh, "queue"); 269 get_bh(bh); 270 J_ASSERT_BH(bh, !buffer_jwrite(bh)); 271 journal->j_chkpt_bhs[batch_count++] = bh; 272 transaction->t_chp_stats.cs_written++; 273 transaction->t_checkpoint_list = jh->b_cpnext; 274 } 275 276 if ((batch_count == JBD2_NR_BATCH) || 277 need_resched() || spin_needbreak(&journal->j_list_lock) || 278 jh2bh(transaction->t_checkpoint_list) == journal->j_chkpt_bhs[0]) 279 goto unlock_and_flush; 280 } 281 282 if (batch_count) { 283 unlock_and_flush: 284 spin_unlock(&journal->j_list_lock); 285 retry: 286 if (batch_count) 287 __flush_batch(journal, &batch_count); 288 cond_resched(); 289 spin_lock(&journal->j_list_lock); 290 goto restart; 291 } 292 293 out: 294 spin_unlock(&journal->j_list_lock); 295 result = jbd2_cleanup_journal_tail(journal); 296 297 return (result < 0) ? result : 0; 298 } 299 300 /* 301 * Check the list of checkpoint transactions for the journal to see if 302 * we have already got rid of any since the last update of the log tail 303 * in the journal superblock. If so, we can instantly roll the 304 * superblock forward to remove those transactions from the log. 305 * 306 * Return <0 on error, 0 on success, 1 if there was nothing to clean up. 307 * 308 * Called with the journal lock held. 309 * 310 * This is the only part of the journaling code which really needs to be 311 * aware of transaction aborts. Checkpointing involves writing to the 312 * main filesystem area rather than to the journal, so it can proceed 313 * even in abort state, but we must not update the super block if 314 * checkpointing may have failed. Otherwise, we would lose some metadata 315 * buffers which should be written-back to the filesystem. 316 */ 317 318 int jbd2_cleanup_journal_tail(journal_t *journal) 319 { 320 tid_t first_tid; 321 unsigned long blocknr; 322 323 if (is_journal_aborted(journal)) 324 return -EIO; 325 326 if (!jbd2_journal_get_log_tail(journal, &first_tid, &blocknr)) 327 return 1; 328 J_ASSERT(blocknr != 0); 329 330 /* 331 * We need to make sure that any blocks that were recently written out 332 * --- perhaps by jbd2_log_do_checkpoint() --- are flushed out before 333 * we drop the transactions from the journal. It's unlikely this will 334 * be necessary, especially with an appropriately sized journal, but we 335 * need this to guarantee correctness. Fortunately 336 * jbd2_cleanup_journal_tail() doesn't get called all that often. 337 */ 338 if (journal->j_flags & JBD2_BARRIER) 339 blkdev_issue_flush(journal->j_fs_dev); 340 341 return __jbd2_update_log_tail(journal, first_tid, blocknr); 342 } 343 344 345 /* Checkpoint list management */ 346 347 /* 348 * journal_shrink_one_cp_list 349 * 350 * Find all the written-back checkpoint buffers in the given list 351 * and try to release them. If the whole transaction is released, set 352 * the 'released' parameter. Return the number of released checkpointed 353 * buffers. 354 * 355 * Called with j_list_lock held. 356 */ 357 static unsigned long journal_shrink_one_cp_list(struct journal_head *jh, 358 enum jbd2_shrink_type type, 359 bool *released) 360 { 361 struct journal_head *last_jh; 362 struct journal_head *next_jh = jh; 363 unsigned long nr_freed = 0; 364 int ret; 365 366 *released = false; 367 if (!jh) 368 return 0; 369 370 last_jh = jh->b_cpprev; 371 do { 372 jh = next_jh; 373 next_jh = jh->b_cpnext; 374 375 if (type == JBD2_SHRINK_DESTROY) { 376 ret = __jbd2_journal_remove_checkpoint(jh); 377 } else { 378 ret = jbd2_journal_try_remove_checkpoint(jh); 379 if (ret < 0) { 380 if (type == JBD2_SHRINK_BUSY_SKIP) 381 continue; 382 break; 383 } 384 } 385 386 nr_freed++; 387 if (ret) { 388 *released = true; 389 break; 390 } 391 392 if (need_resched()) 393 break; 394 } while (jh != last_jh); 395 396 return nr_freed; 397 } 398 399 /* 400 * jbd2_journal_shrink_checkpoint_list 401 * 402 * Find 'nr_to_scan' written-back checkpoint buffers in the journal 403 * and try to release them. Return the number of released checkpointed 404 * buffers. 405 * 406 * Called with j_list_lock held. 407 */ 408 unsigned long jbd2_journal_shrink_checkpoint_list(journal_t *journal, 409 unsigned long *nr_to_scan) 410 { 411 transaction_t *transaction, *last_transaction, *next_transaction; 412 bool __maybe_unused released; 413 tid_t first_tid = 0, last_tid = 0, next_tid = 0; 414 tid_t tid = 0; 415 unsigned long nr_freed = 0; 416 unsigned long freed; 417 bool first_set = false; 418 419 again: 420 spin_lock(&journal->j_list_lock); 421 if (!journal->j_checkpoint_transactions) { 422 spin_unlock(&journal->j_list_lock); 423 goto out; 424 } 425 426 /* 427 * Get next shrink transaction, resume previous scan or start 428 * over again. If some others do checkpoint and drop transaction 429 * from the checkpoint list, we ignore saved j_shrink_transaction 430 * and start over unconditionally. 431 */ 432 if (journal->j_shrink_transaction) 433 transaction = journal->j_shrink_transaction; 434 else 435 transaction = journal->j_checkpoint_transactions; 436 437 if (!first_set) { 438 first_tid = transaction->t_tid; 439 first_set = true; 440 } 441 last_transaction = journal->j_checkpoint_transactions->t_cpprev; 442 next_transaction = transaction; 443 last_tid = last_transaction->t_tid; 444 do { 445 transaction = next_transaction; 446 next_transaction = transaction->t_cpnext; 447 tid = transaction->t_tid; 448 449 freed = journal_shrink_one_cp_list(transaction->t_checkpoint_list, 450 JBD2_SHRINK_BUSY_SKIP, &released); 451 nr_freed += freed; 452 (*nr_to_scan) -= min(*nr_to_scan, freed); 453 if (*nr_to_scan == 0) 454 break; 455 if (need_resched() || spin_needbreak(&journal->j_list_lock)) 456 break; 457 } while (transaction != last_transaction); 458 459 if (transaction != last_transaction) { 460 journal->j_shrink_transaction = next_transaction; 461 next_tid = next_transaction->t_tid; 462 } else { 463 journal->j_shrink_transaction = NULL; 464 next_tid = 0; 465 } 466 467 spin_unlock(&journal->j_list_lock); 468 cond_resched(); 469 470 if (*nr_to_scan && journal->j_shrink_transaction) 471 goto again; 472 out: 473 trace_jbd2_shrink_checkpoint_list(journal, first_tid, tid, last_tid, 474 nr_freed, next_tid); 475 476 return nr_freed; 477 } 478 479 /* 480 * journal_clean_checkpoint_list 481 * 482 * Find all the written-back checkpoint buffers in the journal and release them. 483 * If 'type' is JBD2_SHRINK_DESTROY, release all buffers unconditionally. If 484 * 'type' is JBD2_SHRINK_BUSY_STOP, will stop release buffers if encounters a 485 * busy buffer. To avoid wasting CPU cycles scanning the buffer list in some 486 * cases, don't pass JBD2_SHRINK_BUSY_SKIP 'type' for this function. 487 * 488 * Called with j_list_lock held. 489 */ 490 void __jbd2_journal_clean_checkpoint_list(journal_t *journal, 491 enum jbd2_shrink_type type) 492 { 493 transaction_t *transaction, *last_transaction, *next_transaction; 494 bool released; 495 496 WARN_ON_ONCE(type == JBD2_SHRINK_BUSY_SKIP); 497 498 transaction = journal->j_checkpoint_transactions; 499 if (!transaction) 500 return; 501 502 last_transaction = transaction->t_cpprev; 503 next_transaction = transaction; 504 do { 505 transaction = next_transaction; 506 next_transaction = transaction->t_cpnext; 507 journal_shrink_one_cp_list(transaction->t_checkpoint_list, 508 type, &released); 509 /* 510 * This function only frees up some memory if possible so we 511 * dont have an obligation to finish processing. Bail out if 512 * preemption requested: 513 */ 514 if (need_resched()) 515 return; 516 /* 517 * Stop scanning if we couldn't free the transaction. This 518 * avoids pointless scanning of transactions which still 519 * weren't checkpointed. 520 */ 521 if (!released) 522 return; 523 } while (transaction != last_transaction); 524 } 525 526 /* 527 * Remove buffers from all checkpoint lists as journal is aborted and we just 528 * need to free memory 529 */ 530 void jbd2_journal_destroy_checkpoint(journal_t *journal) 531 { 532 /* 533 * We loop because __jbd2_journal_clean_checkpoint_list() may abort 534 * early due to a need of rescheduling. 535 */ 536 while (1) { 537 spin_lock(&journal->j_list_lock); 538 if (!journal->j_checkpoint_transactions) { 539 spin_unlock(&journal->j_list_lock); 540 break; 541 } 542 __jbd2_journal_clean_checkpoint_list(journal, JBD2_SHRINK_DESTROY); 543 spin_unlock(&journal->j_list_lock); 544 cond_resched(); 545 } 546 } 547 548 /* 549 * journal_remove_checkpoint: called after a buffer has been committed 550 * to disk (either by being write-back flushed to disk, or being 551 * committed to the log). 552 * 553 * We cannot safely clean a transaction out of the log until all of the 554 * buffer updates committed in that transaction have safely been stored 555 * elsewhere on disk. To achieve this, all of the buffers in a 556 * transaction need to be maintained on the transaction's checkpoint 557 * lists until they have been rewritten, at which point this function is 558 * called to remove the buffer from the existing transaction's 559 * checkpoint lists. 560 * 561 * The function returns 1 if it frees the transaction, 0 otherwise. 562 * The function can free jh and bh. 563 * 564 * This function is called with j_list_lock held. 565 */ 566 int __jbd2_journal_remove_checkpoint(struct journal_head *jh) 567 { 568 struct transaction_chp_stats_s *stats; 569 transaction_t *transaction; 570 journal_t *journal; 571 572 JBUFFER_TRACE(jh, "entry"); 573 574 transaction = jh->b_cp_transaction; 575 if (!transaction) { 576 JBUFFER_TRACE(jh, "not on transaction"); 577 return 0; 578 } 579 journal = transaction->t_journal; 580 581 JBUFFER_TRACE(jh, "removing from transaction"); 582 583 __buffer_unlink(jh); 584 jh->b_cp_transaction = NULL; 585 percpu_counter_dec(&journal->j_checkpoint_jh_count); 586 jbd2_journal_put_journal_head(jh); 587 588 /* Is this transaction empty? */ 589 if (transaction->t_checkpoint_list) 590 return 0; 591 592 /* 593 * There is one special case to worry about: if we have just pulled the 594 * buffer off a running or committing transaction's checkpoing list, 595 * then even if the checkpoint list is empty, the transaction obviously 596 * cannot be dropped! 597 * 598 * The locking here around t_state is a bit sleazy. 599 * See the comment at the end of jbd2_journal_commit_transaction(). 600 */ 601 if (transaction->t_state != T_FINISHED) 602 return 0; 603 604 /* 605 * OK, that was the last buffer for the transaction, we can now 606 * safely remove this transaction from the log. 607 */ 608 stats = &transaction->t_chp_stats; 609 if (stats->cs_chp_time) 610 stats->cs_chp_time = jbd2_time_diff(stats->cs_chp_time, 611 jiffies); 612 trace_jbd2_checkpoint_stats(journal->j_fs_dev->bd_dev, 613 transaction->t_tid, stats); 614 615 __jbd2_journal_drop_transaction(journal, transaction); 616 jbd2_journal_free_transaction(transaction); 617 return 1; 618 } 619 620 /* 621 * Check the checkpoint buffer and try to remove it from the checkpoint 622 * list if it's clean. Returns -EBUSY if it is not clean, returns 1 if 623 * it frees the transaction, 0 otherwise. 624 * 625 * This function is called with j_list_lock held. 626 */ 627 int jbd2_journal_try_remove_checkpoint(struct journal_head *jh) 628 { 629 struct buffer_head *bh = jh2bh(jh); 630 631 if (jh->b_transaction) 632 return -EBUSY; 633 if (!trylock_buffer(bh)) 634 return -EBUSY; 635 if (buffer_dirty(bh)) { 636 unlock_buffer(bh); 637 return -EBUSY; 638 } 639 unlock_buffer(bh); 640 641 /* 642 * Buffer is clean and the IO has finished (we held the buffer 643 * lock) so the checkpoint is done. We can safely remove the 644 * buffer from this transaction. 645 */ 646 JBUFFER_TRACE(jh, "remove from checkpoint list"); 647 return __jbd2_journal_remove_checkpoint(jh); 648 } 649 650 /* 651 * journal_insert_checkpoint: put a committed buffer onto a checkpoint 652 * list so that we know when it is safe to clean the transaction out of 653 * the log. 654 * 655 * Called with the journal locked. 656 * Called with j_list_lock held. 657 */ 658 void __jbd2_journal_insert_checkpoint(struct journal_head *jh, 659 transaction_t *transaction) 660 { 661 JBUFFER_TRACE(jh, "entry"); 662 J_ASSERT_JH(jh, buffer_dirty(jh2bh(jh)) || buffer_jbddirty(jh2bh(jh))); 663 J_ASSERT_JH(jh, jh->b_cp_transaction == NULL); 664 665 /* Get reference for checkpointing transaction */ 666 jbd2_journal_grab_journal_head(jh2bh(jh)); 667 jh->b_cp_transaction = transaction; 668 669 if (!transaction->t_checkpoint_list) { 670 jh->b_cpnext = jh->b_cpprev = jh; 671 } else { 672 jh->b_cpnext = transaction->t_checkpoint_list; 673 jh->b_cpprev = transaction->t_checkpoint_list->b_cpprev; 674 jh->b_cpprev->b_cpnext = jh; 675 jh->b_cpnext->b_cpprev = jh; 676 } 677 transaction->t_checkpoint_list = jh; 678 percpu_counter_inc(&transaction->t_journal->j_checkpoint_jh_count); 679 } 680 681 /* 682 * We've finished with this transaction structure: adios... 683 * 684 * The transaction must have no links except for the checkpoint by this 685 * point. 686 * 687 * Called with the journal locked. 688 * Called with j_list_lock held. 689 */ 690 691 void __jbd2_journal_drop_transaction(journal_t *journal, transaction_t *transaction) 692 { 693 assert_spin_locked(&journal->j_list_lock); 694 695 journal->j_shrink_transaction = NULL; 696 if (transaction->t_cpnext) { 697 transaction->t_cpnext->t_cpprev = transaction->t_cpprev; 698 transaction->t_cpprev->t_cpnext = transaction->t_cpnext; 699 if (journal->j_checkpoint_transactions == transaction) 700 journal->j_checkpoint_transactions = 701 transaction->t_cpnext; 702 if (journal->j_checkpoint_transactions == transaction) 703 journal->j_checkpoint_transactions = NULL; 704 } 705 706 J_ASSERT(transaction->t_state == T_FINISHED); 707 J_ASSERT(transaction->t_buffers == NULL); 708 J_ASSERT(transaction->t_forget == NULL); 709 J_ASSERT(transaction->t_shadow_list == NULL); 710 J_ASSERT(transaction->t_checkpoint_list == NULL); 711 J_ASSERT(atomic_read(&transaction->t_updates) == 0); 712 J_ASSERT(journal->j_committing_transaction != transaction); 713 J_ASSERT(journal->j_running_transaction != transaction); 714 715 trace_jbd2_drop_transaction(journal, transaction); 716 717 jbd2_debug(1, "Dropping transaction %d, all done\n", transaction->t_tid); 718 } 719