Patchwork [06/29] jbd2: Remove journal_head from descriptor buffers

login
register
mail settings
Submitter Jan Kara
Date April 8, 2013, 9:32 p.m.
Message ID <1365456754-29373-7-git-send-email-jack@suse.cz>
Download mbox | patch
Permalink /patch/234920/
State Superseded
Headers show

Comments

Jan Kara - April 8, 2013, 9:32 p.m.
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@suse.cz>
---
 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(-)
Zheng Liu - April 12, 2013, 8:10 a.m.
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@suse.cz>
Reviewed-by: Zheng Liu <wenqing.lz@taobao.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@vger.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@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Patch

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);