|
47 | 47 | * overwriting the new data. We don't even need to clear the revoke
|
48 | 48 | * bit here.
|
49 | 49 | *
|
| 50 | + * We cache revoke status of a buffer in the current transaction in b_states |
| 51 | + * bits. As the name says, revokevalid flag indicates that the cached revoke |
| 52 | + * status of a buffer is valid and we can rely on the cached status. |
| 53 | + * |
50 | 54 | * Revoke information on buffers is a tri-state value:
|
51 | 55 | *
|
52 | 56 | * RevokeValid clear: no cached revoke status, need to look it up
|
@@ -478,6 +482,36 @@ int jbd2_journal_cancel_revoke(handle_t *handle, struct journal_head *jh)
|
478 | 482 | return did_revoke;
|
479 | 483 | }
|
480 | 484 |
|
| 485 | +/* |
| 486 | + * journal_clear_revoked_flag clears revoked flag of buffers in |
| 487 | + * revoke table to reflect there is no revoked buffers in the next |
| 488 | + * transaction which is going to be started. |
| 489 | + */ |
| 490 | +void jbd2_clear_buffer_revoked_flags(journal_t *journal) |
| 491 | +{ |
| 492 | + struct jbd2_revoke_table_s *revoke = journal->j_revoke; |
| 493 | + int i = 0; |
| 494 | + |
| 495 | + for (i = 0; i < revoke->hash_size; i++) { |
| 496 | + struct list_head *hash_list; |
| 497 | + struct list_head *list_entry; |
| 498 | + hash_list = &revoke->hash_table[i]; |
| 499 | + |
| 500 | + list_for_each(list_entry, hash_list) { |
| 501 | + struct jbd2_revoke_record_s *record; |
| 502 | + struct buffer_head *bh; |
| 503 | + record = (struct jbd2_revoke_record_s *)list_entry; |
| 504 | + bh = __find_get_block(journal->j_fs_dev, |
| 505 | + record->blocknr, |
| 506 | + journal->j_blocksize); |
| 507 | + if (bh) { |
| 508 | + clear_buffer_revoked(bh); |
| 509 | + __brelse(bh); |
| 510 | + } |
| 511 | + } |
| 512 | + } |
| 513 | +} |
| 514 | + |
481 | 515 | /* journal_switch_revoke table select j_revoke for next transaction
|
482 | 516 | * we do not want to suspend any processing until all revokes are
|
483 | 517 | * written -bzzz
|
|
0 commit comments