[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20130412081002.GB6799@gmail.com>
Date: Fri, 12 Apr 2013 16:10:02 +0800
From: Zheng Liu <gnehzuil.liu@...il.com>
To: Jan Kara <jack@...e.cz>
Cc: Ted Tso <tytso@....edu>, linux-ext4@...r.kernel.org
Subject: Re: [PATCH 06/29] jbd2: Remove journal_head from descriptor buffers
On Mon, Apr 08, 2013 at 11:32:11PM +0200, Jan Kara wrote:
> Similarly as for metadata buffers, also log descriptor buffers don't
> really need the journal head. So strip it and remove BJ_LogCtl list.
>
> Signed-off-by: Jan Kara <jack@...e.cz>
Reviewed-by: Zheng Liu <wenqing.lz@...bao.com>
Regards,
- Zheng
> ---
> fs/jbd2/checkpoint.c | 1 -
> fs/jbd2/commit.c | 78 +++++++++++++++++++-----------------------------
> fs/jbd2/journal.c | 4 +-
> fs/jbd2/revoke.c | 49 +++++++++++++++---------------
> fs/jbd2/transaction.c | 6 ----
> include/linux/jbd2.h | 19 ++++-------
> 6 files changed, 64 insertions(+), 93 deletions(-)
>
> diff --git a/fs/jbd2/checkpoint.c b/fs/jbd2/checkpoint.c
> index 2735fef..65ec076 100644
> --- a/fs/jbd2/checkpoint.c
> +++ b/fs/jbd2/checkpoint.c
> @@ -691,7 +691,6 @@ void __jbd2_journal_drop_transaction(journal_t *journal, transaction_t *transact
> J_ASSERT(transaction->t_buffers == NULL);
> J_ASSERT(transaction->t_forget == NULL);
> J_ASSERT(transaction->t_shadow_list == NULL);
> - J_ASSERT(transaction->t_log_list == NULL);
> J_ASSERT(transaction->t_checkpoint_list == NULL);
> J_ASSERT(transaction->t_checkpoint_io_list == NULL);
> J_ASSERT(atomic_read(&transaction->t_updates) == 0);
> diff --git a/fs/jbd2/commit.c b/fs/jbd2/commit.c
> index c503df6..1a03762 100644
> --- a/fs/jbd2/commit.c
> +++ b/fs/jbd2/commit.c
> @@ -85,8 +85,7 @@ nope:
> __brelse(bh);
> }
>
> -static void jbd2_commit_block_csum_set(journal_t *j,
> - struct journal_head *descriptor)
> +static void jbd2_commit_block_csum_set(journal_t *j, struct buffer_head *bh)
> {
> struct commit_header *h;
> __u32 csum;
> @@ -94,12 +93,11 @@ static void jbd2_commit_block_csum_set(journal_t *j,
> if (!JBD2_HAS_INCOMPAT_FEATURE(j, JBD2_FEATURE_INCOMPAT_CSUM_V2))
> return;
>
> - h = (struct commit_header *)(jh2bh(descriptor)->b_data);
> + h = (struct commit_header *)(bh->b_data);
> h->h_chksum_type = 0;
> h->h_chksum_size = 0;
> h->h_chksum[0] = 0;
> - csum = jbd2_chksum(j, j->j_csum_seed, jh2bh(descriptor)->b_data,
> - j->j_blocksize);
> + csum = jbd2_chksum(j, j->j_csum_seed, bh->b_data, j->j_blocksize);
> h->h_chksum[0] = cpu_to_be32(csum);
> }
>
> @@ -116,7 +114,6 @@ static int journal_submit_commit_record(journal_t *journal,
> struct buffer_head **cbh,
> __u32 crc32_sum)
> {
> - struct journal_head *descriptor;
> struct commit_header *tmp;
> struct buffer_head *bh;
> int ret;
> @@ -127,12 +124,10 @@ static int journal_submit_commit_record(journal_t *journal,
> if (is_journal_aborted(journal))
> return 0;
>
> - descriptor = jbd2_journal_get_descriptor_buffer(journal);
> - if (!descriptor)
> + bh = jbd2_journal_get_descriptor_buffer(journal);
> + if (!bh)
> return 1;
>
> - bh = jh2bh(descriptor);
> -
> tmp = (struct commit_header *)bh->b_data;
> tmp->h_magic = cpu_to_be32(JBD2_MAGIC_NUMBER);
> tmp->h_blocktype = cpu_to_be32(JBD2_COMMIT_BLOCK);
> @@ -146,9 +141,9 @@ static int journal_submit_commit_record(journal_t *journal,
> tmp->h_chksum_size = JBD2_CRC32_CHKSUM_SIZE;
> tmp->h_chksum[0] = cpu_to_be32(crc32_sum);
> }
> - jbd2_commit_block_csum_set(journal, descriptor);
> + jbd2_commit_block_csum_set(journal, bh);
>
> - JBUFFER_TRACE(descriptor, "submit commit block");
> + BUFFER_TRACE(bh, "submit commit block");
> lock_buffer(bh);
> clear_buffer_dirty(bh);
> set_buffer_uptodate(bh);
> @@ -180,7 +175,6 @@ static int journal_wait_on_commit_record(journal_t *journal,
> if (unlikely(!buffer_uptodate(bh)))
> ret = -EIO;
> put_bh(bh); /* One for getblk() */
> - jbd2_journal_put_journal_head(bh2jh(bh));
>
> return ret;
> }
> @@ -321,7 +315,7 @@ static void write_tag_block(int tag_bytes, journal_block_tag_t *tag,
> }
>
> static void jbd2_descr_block_csum_set(journal_t *j,
> - struct journal_head *descriptor)
> + struct buffer_head *bh)
> {
> struct jbd2_journal_block_tail *tail;
> __u32 csum;
> @@ -329,12 +323,10 @@ static void jbd2_descr_block_csum_set(journal_t *j,
> if (!JBD2_HAS_INCOMPAT_FEATURE(j, JBD2_FEATURE_INCOMPAT_CSUM_V2))
> return;
>
> - tail = (struct jbd2_journal_block_tail *)
> - (jh2bh(descriptor)->b_data + j->j_blocksize -
> + tail = (struct jbd2_journal_block_tail *)(bh->b_data + j->j_blocksize -
> sizeof(struct jbd2_journal_block_tail));
> tail->t_checksum = 0;
> - csum = jbd2_chksum(j, j->j_csum_seed, jh2bh(descriptor)->b_data,
> - j->j_blocksize);
> + csum = jbd2_chksum(j, j->j_csum_seed, bh->b_data, j->j_blocksize);
> tail->t_checksum = cpu_to_be32(csum);
> }
>
> @@ -368,7 +360,8 @@ void jbd2_journal_commit_transaction(journal_t *journal)
> {
> struct transaction_stats_s stats;
> transaction_t *commit_transaction;
> - struct journal_head *jh, *descriptor;
> + struct journal_head *jh;
> + struct buffer_head *descriptor;
> struct buffer_head **wbuf = journal->j_wbuf;
> int bufs;
> int flags;
> @@ -393,6 +386,7 @@ void jbd2_journal_commit_transaction(journal_t *journal)
> int update_tail;
> int csum_size = 0;
> LIST_HEAD(io_bufs);
> + LIST_HEAD(log_bufs);
>
> if (JBD2_HAS_INCOMPAT_FEATURE(journal, JBD2_FEATURE_INCOMPAT_CSUM_V2))
> csum_size = sizeof(struct jbd2_journal_block_tail);
> @@ -546,7 +540,7 @@ void jbd2_journal_commit_transaction(journal_t *journal)
>
> blk_start_plug(&plug);
> jbd2_journal_write_revoke_records(journal, commit_transaction,
> - WRITE_SYNC);
> + &log_bufs, WRITE_SYNC);
> blk_finish_plug(&plug);
>
> jbd_debug(3, "JBD2: commit phase 2\n");
> @@ -572,8 +566,8 @@ void jbd2_journal_commit_transaction(journal_t *journal)
> atomic_read(&commit_transaction->t_outstanding_credits));
>
> err = 0;
> - descriptor = NULL;
> bufs = 0;
> + descriptor = NULL;
> blk_start_plug(&plug);
> while (commit_transaction->t_buffers) {
>
> @@ -605,8 +599,6 @@ void jbd2_journal_commit_transaction(journal_t *journal)
> record the metadata buffer. */
>
> if (!descriptor) {
> - struct buffer_head *bh;
> -
> J_ASSERT (bufs == 0);
>
> jbd_debug(4, "JBD2: get descriptor\n");
> @@ -617,26 +609,26 @@ void jbd2_journal_commit_transaction(journal_t *journal)
> continue;
> }
>
> - bh = jh2bh(descriptor);
> jbd_debug(4, "JBD2: got buffer %llu (%p)\n",
> - (unsigned long long)bh->b_blocknr, bh->b_data);
> - header = (journal_header_t *)&bh->b_data[0];
> + (unsigned long long)descriptor->b_blocknr,
> + descriptor->b_data);
> + header = (journal_header_t *)descriptor->b_data;
> header->h_magic = cpu_to_be32(JBD2_MAGIC_NUMBER);
> header->h_blocktype = cpu_to_be32(JBD2_DESCRIPTOR_BLOCK);
> header->h_sequence = cpu_to_be32(commit_transaction->t_tid);
>
> - tagp = &bh->b_data[sizeof(journal_header_t)];
> - space_left = bh->b_size - sizeof(journal_header_t);
> + tagp = &descriptor->b_data[sizeof(journal_header_t)];
> + space_left = descriptor->b_size -
> + sizeof(journal_header_t);
> first_tag = 1;
> - set_buffer_jwrite(bh);
> - set_buffer_dirty(bh);
> - wbuf[bufs++] = bh;
> + set_buffer_jwrite(descriptor);
> + set_buffer_dirty(descriptor);
> + wbuf[bufs++] = descriptor;
>
> /* Record it so that we can wait for IO
> completion later */
> - BUFFER_TRACE(bh, "ph3: file as descriptor");
> - jbd2_journal_file_buffer(descriptor, commit_transaction,
> - BJ_LogCtl);
> + BUFFER_TRACE(descriptor, "ph3: file as descriptor");
> + jbd2_file_log_bh(&log_bufs, descriptor);
> }
>
> /* Where is the buffer to be written? */
> @@ -863,26 +855,19 @@ start_journal_io:
> jbd_debug(3, "JBD2: commit phase 4\n");
>
> /* Here we wait for the revoke record and descriptor record buffers */
> - wait_for_ctlbuf:
> - while (commit_transaction->t_log_list != NULL) {
> + while (!list_empty(&log_bufs)) {
> struct buffer_head *bh;
>
> - jh = commit_transaction->t_log_list->b_tprev;
> - bh = jh2bh(jh);
> - if (buffer_locked(bh)) {
> - wait_on_buffer(bh);
> - goto wait_for_ctlbuf;
> - }
> - if (cond_resched())
> - goto wait_for_ctlbuf;
> + bh = list_entry(log_bufs.prev, struct buffer_head, b_assoc_buffers);
> + wait_on_buffer(bh);
> + cond_resched();
>
> if (unlikely(!buffer_uptodate(bh)))
> err = -EIO;
>
> BUFFER_TRACE(bh, "ph5: control buffer writeout done: unfile");
> clear_buffer_jwrite(bh);
> - jbd2_journal_unfile_buffer(journal, jh);
> - jbd2_journal_put_journal_head(jh);
> + jbd2_unfile_log_bh(bh);
> __brelse(bh); /* One for getblk */
> /* AKPM: bforget here */
> }
> @@ -933,7 +918,6 @@ start_journal_io:
> J_ASSERT(commit_transaction->t_buffers == NULL);
> J_ASSERT(commit_transaction->t_checkpoint_list == NULL);
> J_ASSERT(commit_transaction->t_shadow_list == NULL);
> - J_ASSERT(commit_transaction->t_log_list == NULL);
>
> restart_loop:
> /*
> diff --git a/fs/jbd2/journal.c b/fs/jbd2/journal.c
> index eb6272b..e03aae0 100644
> --- a/fs/jbd2/journal.c
> +++ b/fs/jbd2/journal.c
> @@ -761,7 +761,7 @@ int jbd2_journal_bmap(journal_t *journal, unsigned long blocknr,
> * But we don't bother doing that, so there will be coherency problems with
> * mmaps of blockdevs which hold live JBD-controlled filesystems.
> */
> -struct journal_head *jbd2_journal_get_descriptor_buffer(journal_t *journal)
> +struct buffer_head *jbd2_journal_get_descriptor_buffer(journal_t *journal)
> {
> struct buffer_head *bh;
> unsigned long long blocknr;
> @@ -780,7 +780,7 @@ struct journal_head *jbd2_journal_get_descriptor_buffer(journal_t *journal)
> set_buffer_uptodate(bh);
> unlock_buffer(bh);
> BUFFER_TRACE(bh, "return this buffer");
> - return jbd2_journal_add_journal_head(bh);
> + return bh;
> }
>
> /*
> diff --git a/fs/jbd2/revoke.c b/fs/jbd2/revoke.c
> index f30b80b..198c9c1 100644
> --- a/fs/jbd2/revoke.c
> +++ b/fs/jbd2/revoke.c
> @@ -122,9 +122,10 @@ struct jbd2_revoke_table_s
>
> #ifdef __KERNEL__
> static void write_one_revoke_record(journal_t *, transaction_t *,
> - struct journal_head **, int *,
> + struct list_head *,
> + struct buffer_head **, int *,
> struct jbd2_revoke_record_s *, int);
> -static void flush_descriptor(journal_t *, struct journal_head *, int, int);
> +static void flush_descriptor(journal_t *, struct buffer_head *, int, int);
> #endif
>
> /* Utility functions to maintain the revoke table */
> @@ -531,9 +532,10 @@ void jbd2_journal_switch_revoke_table(journal_t *journal)
> */
> void jbd2_journal_write_revoke_records(journal_t *journal,
> transaction_t *transaction,
> + struct list_head *log_bufs,
> int write_op)
> {
> - struct journal_head *descriptor;
> + struct buffer_head *descriptor;
> struct jbd2_revoke_record_s *record;
> struct jbd2_revoke_table_s *revoke;
> struct list_head *hash_list;
> @@ -553,7 +555,7 @@ void jbd2_journal_write_revoke_records(journal_t *journal,
> while (!list_empty(hash_list)) {
> record = (struct jbd2_revoke_record_s *)
> hash_list->next;
> - write_one_revoke_record(journal, transaction,
> + write_one_revoke_record(journal, transaction, log_bufs,
> &descriptor, &offset,
> record, write_op);
> count++;
> @@ -573,13 +575,14 @@ void jbd2_journal_write_revoke_records(journal_t *journal,
>
> static void write_one_revoke_record(journal_t *journal,
> transaction_t *transaction,
> - struct journal_head **descriptorp,
> + struct list_head *log_bufs,
> + struct buffer_head **descriptorp,
> int *offsetp,
> struct jbd2_revoke_record_s *record,
> int write_op)
> {
> int csum_size = 0;
> - struct journal_head *descriptor;
> + struct buffer_head *descriptor;
> int offset;
> journal_header_t *header;
>
> @@ -609,26 +612,26 @@ static void write_one_revoke_record(journal_t *journal,
> descriptor = jbd2_journal_get_descriptor_buffer(journal);
> if (!descriptor)
> return;
> - header = (journal_header_t *) &jh2bh(descriptor)->b_data[0];
> + header = (journal_header_t *)descriptor->b_data;
> header->h_magic = cpu_to_be32(JBD2_MAGIC_NUMBER);
> header->h_blocktype = cpu_to_be32(JBD2_REVOKE_BLOCK);
> header->h_sequence = cpu_to_be32(transaction->t_tid);
>
> /* Record it so that we can wait for IO completion later */
> - JBUFFER_TRACE(descriptor, "file as BJ_LogCtl");
> - jbd2_journal_file_buffer(descriptor, transaction, BJ_LogCtl);
> + BUFFER_TRACE(descriptor, "file in log_bufs");
> + jbd2_file_log_bh(log_bufs, descriptor);
>
> offset = sizeof(jbd2_journal_revoke_header_t);
> *descriptorp = descriptor;
> }
>
> if (JBD2_HAS_INCOMPAT_FEATURE(journal, JBD2_FEATURE_INCOMPAT_64BIT)) {
> - * ((__be64 *)(&jh2bh(descriptor)->b_data[offset])) =
> + * ((__be64 *)(&descriptor->b_data[offset])) =
> cpu_to_be64(record->blocknr);
> offset += 8;
>
> } else {
> - * ((__be32 *)(&jh2bh(descriptor)->b_data[offset])) =
> + * ((__be32 *)(&descriptor->b_data[offset])) =
> cpu_to_be32(record->blocknr);
> offset += 4;
> }
> @@ -636,8 +639,7 @@ static void write_one_revoke_record(journal_t *journal,
> *offsetp = offset;
> }
>
> -static void jbd2_revoke_csum_set(journal_t *j,
> - struct journal_head *descriptor)
> +static void jbd2_revoke_csum_set(journal_t *j, struct buffer_head *bh)
> {
> struct jbd2_journal_revoke_tail *tail;
> __u32 csum;
> @@ -645,12 +647,10 @@ static void jbd2_revoke_csum_set(journal_t *j,
> if (!JBD2_HAS_INCOMPAT_FEATURE(j, JBD2_FEATURE_INCOMPAT_CSUM_V2))
> return;
>
> - tail = (struct jbd2_journal_revoke_tail *)
> - (jh2bh(descriptor)->b_data + j->j_blocksize -
> + tail = (struct jbd2_journal_revoke_tail *)(bh->b_data + j->j_blocksize -
> sizeof(struct jbd2_journal_revoke_tail));
> tail->r_checksum = 0;
> - csum = jbd2_chksum(j, j->j_csum_seed, jh2bh(descriptor)->b_data,
> - j->j_blocksize);
> + csum = jbd2_chksum(j, j->j_csum_seed, bh->b_data, j->j_blocksize);
> tail->r_checksum = cpu_to_be32(csum);
> }
>
> @@ -662,25 +662,24 @@ static void jbd2_revoke_csum_set(journal_t *j,
> */
>
> static void flush_descriptor(journal_t *journal,
> - struct journal_head *descriptor,
> + struct buffer_head *descriptor,
> int offset, int write_op)
> {
> jbd2_journal_revoke_header_t *header;
> - struct buffer_head *bh = jh2bh(descriptor);
>
> if (is_journal_aborted(journal)) {
> - put_bh(bh);
> + put_bh(descriptor);
> return;
> }
>
> - header = (jbd2_journal_revoke_header_t *) jh2bh(descriptor)->b_data;
> + header = (jbd2_journal_revoke_header_t *)descriptor->b_data;
> header->r_count = cpu_to_be32(offset);
> jbd2_revoke_csum_set(journal, descriptor);
>
> - set_buffer_jwrite(bh);
> - BUFFER_TRACE(bh, "write");
> - set_buffer_dirty(bh);
> - write_dirty_buffer(bh, write_op);
> + set_buffer_jwrite(descriptor);
> + BUFFER_TRACE(descriptor, "write");
> + set_buffer_dirty(descriptor);
> + write_dirty_buffer(descriptor, write_op);
> }
> #endif
>
> diff --git a/fs/jbd2/transaction.c b/fs/jbd2/transaction.c
> index 3be34c7..bc35899 100644
> --- a/fs/jbd2/transaction.c
> +++ b/fs/jbd2/transaction.c
> @@ -1625,9 +1625,6 @@ static void __jbd2_journal_temp_unlink_buffer(struct journal_head *jh)
> case BJ_Shadow:
> list = &transaction->t_shadow_list;
> break;
> - case BJ_LogCtl:
> - list = &transaction->t_log_list;
> - break;
> case BJ_Reserved:
> list = &transaction->t_reserved_list;
> break;
> @@ -2126,9 +2123,6 @@ void __jbd2_journal_file_buffer(struct journal_head *jh,
> case BJ_Shadow:
> list = &transaction->t_shadow_list;
> break;
> - case BJ_LogCtl:
> - list = &transaction->t_log_list;
> - break;
> case BJ_Reserved:
> list = &transaction->t_reserved_list;
> break;
> diff --git a/include/linux/jbd2.h b/include/linux/jbd2.h
> index a670595..4584518 100644
> --- a/include/linux/jbd2.h
> +++ b/include/linux/jbd2.h
> @@ -530,12 +530,6 @@ struct transaction_s
> struct journal_head *t_shadow_list;
>
> /*
> - * Doubly-linked circular list of control buffers being written to the
> - * log. [j_list_lock]
> - */
> - struct journal_head *t_log_list;
> -
> - /*
> * List of inodes whose data we've modified in data=ordered mode.
> * [j_list_lock]
> */
> @@ -994,7 +988,7 @@ static inline void jbd2_unfile_log_bh(struct buffer_head *bh)
> }
>
> /* Log buffer allocation */
> -extern struct journal_head * jbd2_journal_get_descriptor_buffer(journal_t *);
> +struct buffer_head *jbd2_journal_get_descriptor_buffer(journal_t *journal);
> int jbd2_journal_next_log_block(journal_t *, unsigned long long *);
> int jbd2_journal_get_log_tail(journal_t *journal, tid_t *tid,
> unsigned long *block);
> @@ -1178,8 +1172,10 @@ extern int jbd2_journal_init_revoke_caches(void);
> extern void jbd2_journal_destroy_revoke(journal_t *);
> extern int jbd2_journal_revoke (handle_t *, unsigned long long, struct buffer_head *);
> extern int jbd2_journal_cancel_revoke(handle_t *, struct journal_head *);
> -extern void jbd2_journal_write_revoke_records(journal_t *,
> - transaction_t *, int);
> +extern void jbd2_journal_write_revoke_records(journal_t *journal,
> + transaction_t *transaction,
> + struct list_head *log_bufs,
> + int write_op);
>
> /* Recovery revoke support */
> extern int jbd2_journal_set_revoke(journal_t *, unsigned long long, tid_t);
> @@ -1286,9 +1282,8 @@ static inline int jbd_space_needed(journal_t *journal)
> #define BJ_Metadata 1 /* Normal journaled metadata */
> #define BJ_Forget 2 /* Buffer superseded by this transaction */
> #define BJ_Shadow 3 /* Buffer contents being shadowed to the log */
> -#define BJ_LogCtl 4 /* Buffer contains log descriptors */
> -#define BJ_Reserved 5 /* Buffer is reserved for access by journal */
> -#define BJ_Types 6
> +#define BJ_Reserved 4 /* Buffer is reserved for access by journal */
> +#define BJ_Types 5
>
> extern int jbd_blocks_per_page(struct inode *inode);
>
> --
> 1.7.1
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-ext4" in
> the body of a message to majordomo@...r.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
--
To unsubscribe from this list: send the line "unsubscribe linux-ext4" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Powered by blists - more mailing lists