diff options
| author | Theodore Ts'o <tytso@mit.edu> | 2009-04-14 07:50:56 -0400 |
|---|---|---|
| committer | Theodore Ts'o <tytso@mit.edu> | 2009-04-14 07:50:56 -0400 |
| commit | 67c457a8c378a006a34d92f9bd3078a80a92f250 (patch) | |
| tree | 63028e792b62fa42724507b86acded4da356c185 /fs/jbd2 | |
| parent | 6b82f3cb2d480b7714eb0ff61aee99c22160389e (diff) | |
jbd2: use SWRITE_SYNC_PLUG when writing synchronous revoke records
The revoke records must be written using the same way as the rest of
the blocks during the commit process; that is, either marked as
synchronous writes or as asynchornous writes.
Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
Diffstat (limited to 'fs/jbd2')
| -rw-r--r-- | fs/jbd2/commit.c | 3 | ||||
| -rw-r--r-- | fs/jbd2/revoke.c | 21 |
2 files changed, 14 insertions, 10 deletions
diff --git a/fs/jbd2/commit.c b/fs/jbd2/commit.c index 073c8c3df7cd..0b7d3b8226fd 100644 --- a/fs/jbd2/commit.c +++ b/fs/jbd2/commit.c | |||
| @@ -506,7 +506,8 @@ void jbd2_journal_commit_transaction(journal_t *journal) | |||
| 506 | if (err) | 506 | if (err) |
| 507 | jbd2_journal_abort(journal, err); | 507 | jbd2_journal_abort(journal, err); |
| 508 | 508 | ||
| 509 | jbd2_journal_write_revoke_records(journal, commit_transaction); | 509 | jbd2_journal_write_revoke_records(journal, commit_transaction, |
| 510 | write_op); | ||
| 510 | 511 | ||
| 511 | jbd_debug(3, "JBD: commit phase 2\n"); | 512 | jbd_debug(3, "JBD: commit phase 2\n"); |
| 512 | 513 | ||
diff --git a/fs/jbd2/revoke.c b/fs/jbd2/revoke.c index bbe6d592d8b3..a360b06af2e3 100644 --- a/fs/jbd2/revoke.c +++ b/fs/jbd2/revoke.c | |||
| @@ -86,6 +86,7 @@ | |||
| 86 | #include <linux/slab.h> | 86 | #include <linux/slab.h> |
| 87 | #include <linux/list.h> | 87 | #include <linux/list.h> |
| 88 | #include <linux/init.h> | 88 | #include <linux/init.h> |
| 89 | #include <linux/bio.h> | ||
| 89 | #endif | 90 | #endif |
| 90 | #include <linux/log2.h> | 91 | #include <linux/log2.h> |
| 91 | 92 | ||
| @@ -118,8 +119,8 @@ struct jbd2_revoke_table_s | |||
| 118 | #ifdef __KERNEL__ | 119 | #ifdef __KERNEL__ |
| 119 | static void write_one_revoke_record(journal_t *, transaction_t *, | 120 | static void write_one_revoke_record(journal_t *, transaction_t *, |
| 120 | struct journal_head **, int *, | 121 | struct journal_head **, int *, |
| 121 | struct jbd2_revoke_record_s *); | 122 | struct jbd2_revoke_record_s *, int); |
| 122 | static void flush_descriptor(journal_t *, struct journal_head *, int); | 123 | static void flush_descriptor(journal_t *, struct journal_head *, int, int); |
| 123 | #endif | 124 | #endif |
| 124 | 125 | ||
| 125 | /* Utility functions to maintain the revoke table */ | 126 | /* Utility functions to maintain the revoke table */ |
| @@ -499,7 +500,8 @@ void jbd2_journal_switch_revoke_table(journal_t *journal) | |||
| 499 | * revoke hash, deleting the entries as we go. | 500 | * revoke hash, deleting the entries as we go. |
| 500 | */ | 501 | */ |
| 501 | void jbd2_journal_write_revoke_records(journal_t *journal, | 502 | void jbd2_journal_write_revoke_records(journal_t *journal, |
| 502 | transaction_t *transaction) | 503 | transaction_t *transaction, |
| 504 | int write_op) | ||
| 503 | { | 505 | { |
| 504 | struct journal_head *descriptor; | 506 | struct journal_head *descriptor; |
| 505 | struct jbd2_revoke_record_s *record; | 507 | struct jbd2_revoke_record_s *record; |
| @@ -523,14 +525,14 @@ void jbd2_journal_write_revoke_records(journal_t *journal, | |||
| 523 | hash_list->next; | 525 | hash_list->next; |
| 524 | write_one_revoke_record(journal, transaction, | 526 | write_one_revoke_record(journal, transaction, |
| 525 | &descriptor, &offset, | 527 | &descriptor, &offset, |
| 526 | record); | 528 | record, write_op); |
| 527 | count++; | 529 | count++; |
| 528 | list_del(&record->hash); | 530 | list_del(&record->hash); |
| 529 | kmem_cache_free(jbd2_revoke_record_cache, record); | 531 | kmem_cache_free(jbd2_revoke_record_cache, record); |
| 530 | } | 532 | } |
| 531 | } | 533 | } |
| 532 | if (descriptor) | 534 | if (descriptor) |
| 533 | flush_descriptor(journal, descriptor, offset); | 535 | flush_descriptor(journal, descriptor, offset, write_op); |
| 534 | jbd_debug(1, "Wrote %d revoke records\n", count); | 536 | jbd_debug(1, "Wrote %d revoke records\n", count); |
| 535 | } | 537 | } |
| 536 | 538 | ||
| @@ -543,7 +545,8 @@ static void write_one_revoke_record(journal_t *journal, | |||
| 543 | transaction_t *transaction, | 545 | transaction_t *transaction, |
| 544 | struct journal_head **descriptorp, | 546 | struct journal_head **descriptorp, |
| 545 | int *offsetp, | 547 | int *offsetp, |
| 546 | struct jbd2_revoke_record_s *record) | 548 | struct jbd2_revoke_record_s *record, |
| 549 | int write_op) | ||
| 547 | { | 550 | { |
| 548 | struct journal_head *descriptor; | 551 | struct journal_head *descriptor; |
| 549 | int offset; | 552 | int offset; |
| @@ -562,7 +565,7 @@ static void write_one_revoke_record(journal_t *journal, | |||
| 562 | /* Make sure we have a descriptor with space left for the record */ | 565 | /* Make sure we have a descriptor with space left for the record */ |
| 563 | if (descriptor) { | 566 | if (descriptor) { |
| 564 | if (offset == journal->j_blocksize) { | 567 | if (offset == journal->j_blocksize) { |
| 565 | flush_descriptor(journal, descriptor, offset); | 568 | flush_descriptor(journal, descriptor, offset, write_op); |
| 566 | descriptor = NULL; | 569 | descriptor = NULL; |
| 567 | } | 570 | } |
| 568 | } | 571 | } |
| @@ -607,7 +610,7 @@ static void write_one_revoke_record(journal_t *journal, | |||
| 607 | 610 | ||
| 608 | static void flush_descriptor(journal_t *journal, | 611 | static void flush_descriptor(journal_t *journal, |
| 609 | struct journal_head *descriptor, | 612 | struct journal_head *descriptor, |
| 610 | int offset) | 613 | int offset, int write_op) |
| 611 | { | 614 | { |
| 612 | jbd2_journal_revoke_header_t *header; | 615 | jbd2_journal_revoke_header_t *header; |
| 613 | struct buffer_head *bh = jh2bh(descriptor); | 616 | struct buffer_head *bh = jh2bh(descriptor); |
| @@ -622,7 +625,7 @@ static void flush_descriptor(journal_t *journal, | |||
| 622 | set_buffer_jwrite(bh); | 625 | set_buffer_jwrite(bh); |
| 623 | BUFFER_TRACE(bh, "write"); | 626 | BUFFER_TRACE(bh, "write"); |
| 624 | set_buffer_dirty(bh); | 627 | set_buffer_dirty(bh); |
| 625 | ll_rw_block(SWRITE, 1, &bh); | 628 | ll_rw_block((write_op == WRITE) ? SWRITE : SWRITE_SYNC_PLUG, 1, &bh); |
| 626 | } | 629 | } |
| 627 | #endif | 630 | #endif |
| 628 | 631 | ||
