jbd: 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>
This commit is contained in:
parent
67c457a8c3
commit
38d726d153
@ -502,7 +502,7 @@ void journal_commit_transaction(journal_t *journal)
|
||||
err = 0;
|
||||
}
|
||||
|
||||
journal_write_revoke_records(journal, commit_transaction);
|
||||
journal_write_revoke_records(journal, commit_transaction, write_op);
|
||||
|
||||
/*
|
||||
* If we found any dirty or locked buffers, then we should have
|
||||
|
@ -67,6 +67,7 @@
|
||||
#include <linux/slab.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/bio.h>
|
||||
#endif
|
||||
#include <linux/log2.h>
|
||||
|
||||
@ -99,8 +100,8 @@ struct jbd_revoke_table_s
|
||||
#ifdef __KERNEL__
|
||||
static void write_one_revoke_record(journal_t *, transaction_t *,
|
||||
struct journal_head **, int *,
|
||||
struct jbd_revoke_record_s *);
|
||||
static void flush_descriptor(journal_t *, struct journal_head *, int);
|
||||
struct jbd_revoke_record_s *, int);
|
||||
static void flush_descriptor(journal_t *, struct journal_head *, int, int);
|
||||
#endif
|
||||
|
||||
/* Utility functions to maintain the revoke table */
|
||||
@ -486,7 +487,7 @@ void journal_switch_revoke_table(journal_t *journal)
|
||||
*/
|
||||
|
||||
void journal_write_revoke_records(journal_t *journal,
|
||||
transaction_t *transaction)
|
||||
transaction_t *transaction, int write_op)
|
||||
{
|
||||
struct journal_head *descriptor;
|
||||
struct jbd_revoke_record_s *record;
|
||||
@ -510,14 +511,14 @@ void journal_write_revoke_records(journal_t *journal,
|
||||
hash_list->next;
|
||||
write_one_revoke_record(journal, transaction,
|
||||
&descriptor, &offset,
|
||||
record);
|
||||
record, write_op);
|
||||
count++;
|
||||
list_del(&record->hash);
|
||||
kmem_cache_free(revoke_record_cache, record);
|
||||
}
|
||||
}
|
||||
if (descriptor)
|
||||
flush_descriptor(journal, descriptor, offset);
|
||||
flush_descriptor(journal, descriptor, offset, write_op);
|
||||
jbd_debug(1, "Wrote %d revoke records\n", count);
|
||||
}
|
||||
|
||||
@ -530,7 +531,8 @@ static void write_one_revoke_record(journal_t *journal,
|
||||
transaction_t *transaction,
|
||||
struct journal_head **descriptorp,
|
||||
int *offsetp,
|
||||
struct jbd_revoke_record_s *record)
|
||||
struct jbd_revoke_record_s *record,
|
||||
int write_op)
|
||||
{
|
||||
struct journal_head *descriptor;
|
||||
int offset;
|
||||
@ -549,7 +551,7 @@ static void write_one_revoke_record(journal_t *journal,
|
||||
/* Make sure we have a descriptor with space left for the record */
|
||||
if (descriptor) {
|
||||
if (offset == journal->j_blocksize) {
|
||||
flush_descriptor(journal, descriptor, offset);
|
||||
flush_descriptor(journal, descriptor, offset, write_op);
|
||||
descriptor = NULL;
|
||||
}
|
||||
}
|
||||
@ -586,7 +588,7 @@ static void write_one_revoke_record(journal_t *journal,
|
||||
|
||||
static void flush_descriptor(journal_t *journal,
|
||||
struct journal_head *descriptor,
|
||||
int offset)
|
||||
int offset, int write_op)
|
||||
{
|
||||
journal_revoke_header_t *header;
|
||||
struct buffer_head *bh = jh2bh(descriptor);
|
||||
@ -601,7 +603,7 @@ static void flush_descriptor(journal_t *journal,
|
||||
set_buffer_jwrite(bh);
|
||||
BUFFER_TRACE(bh, "write");
|
||||
set_buffer_dirty(bh);
|
||||
ll_rw_block(SWRITE, 1, &bh);
|
||||
ll_rw_block((write_op == WRITE) ? SWRITE : SWRITE_SYNC_PLUG, 1, &bh);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
@ -978,7 +978,8 @@ extern void journal_destroy_revoke(journal_t *);
|
||||
extern int journal_revoke (handle_t *,
|
||||
unsigned long, struct buffer_head *);
|
||||
extern int journal_cancel_revoke(handle_t *, struct journal_head *);
|
||||
extern void journal_write_revoke_records(journal_t *, transaction_t *);
|
||||
extern void journal_write_revoke_records(journal_t *,
|
||||
transaction_t *, int);
|
||||
|
||||
/* Recovery revoke support */
|
||||
extern int journal_set_revoke(journal_t *, unsigned long, tid_t);
|
||||
|
Loading…
Reference in New Issue
Block a user