All of lore.kernel.org
 help / color / mirror / Atom feed
From: Younger Liu <younger.liu@huawei.com>
To: ocfs2-devel@oss.oracle.com
Subject: [Ocfs2-devel] [patch 05/22] ocfs2: lighten up allocate transaction
Date: Tue, 3 Sep 2013 10:58:25 +0800	[thread overview]
Message-ID: <52255051.9070806@huawei.com> (raw)
In-Reply-To: <20130827210457.83C2E31C129@corp2gmr1-1.hot.corp.google.com>

On 2013/8/28 5:04, akpm at linux-foundation.org wrote:
> From: Younger Liu <younger.liu@huawei.com>
> Subject: ocfs2: lighten up allocate transaction
> 
> The issue scenario is as following:
> 
> When fallocating a very large disk space for a small file,
> __ocfs2_extend_allocation attempts to get a very large transaction.  For
> some journal sizes, there may be not enough room for this transaction, and
> the fallocate will fail.
> 
> The patch below extends & restarts the transaction as necessary while
> allocating space, and should work with even the smallest journal.  This
> patch refers ext4 resize.
> 
> Test:
> # mkfs.ocfs2 -b 4K -C 32K -T datafiles /dev/sdc
> ...(jounral size is 32M)
> # mount.ocfs2 /dev/sdc /mnt/ocfs2/
> # touch /mnt/ocfs2/1.log
> # fallocate -o 0 -l 400G /mnt/ocfs2/1.log
> fallocate: /mnt/ocfs2/1.log: fallocate failed: Cannot allocate memory
> # tail -f /var/log/messages
> [ 7372.278591] JBD: fallocate wants too many credits (2051 > 2048)
> [ 7372.278597] (fallocate,6438,0):__ocfs2_extend_allocation:709 ERROR: status = -12
> [ 7372.278603] (fallocate,6438,0):ocfs2_allocate_unwritten_extents:1504 ERROR: status = -12
> [ 7372.278607] (fallocate,6438,0):__ocfs2_change_file_space:1955 ERROR: status = -12
> ^C
> With this patch, the test works well.
> 

Hi Andrew Morton,
   This patch is not the newest one, I have sent patch V3. 
In patch V3, some coding style errors are modified. I will 
resent the patch V3 in a moment, and please drop this patch.
  Thanks.
	--Younger 

> Signed-off-by: Younger Liu <younger.liu@huawei.com>
> Cc: Jie Liu <jeff.liu@oracle.com>
> Cc: Joel Becker <jlbec@evilplan.org>
> Cc: Mark Fasheh <mfasheh@suse.com>
> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
> ---
> 
>  fs/ocfs2/file.c        |    6 +-----
>  fs/ocfs2/journal.c     |   35 +++++++++++++++++++++++++++++++++++
>  fs/ocfs2/journal.h     |   11 +++++++++++
>  fs/ocfs2/ocfs2_trace.h |    2 ++
>  4 files changed, 49 insertions(+), 5 deletions(-)
> 
> diff -puN fs/ocfs2/file.c~ocfs2-lighten-up-allocate-transaction fs/ocfs2/file.c
> --- a/fs/ocfs2/file.c~ocfs2-lighten-up-allocate-transaction
> +++ a/fs/ocfs2/file.c
> @@ -666,11 +666,7 @@ restarted_transaction:
>  		} else {
>  			BUG_ON(why != RESTART_TRANS);
>  
> -			/* TODO: This can be more intelligent. */
> -			credits = ocfs2_calc_extend_credits(osb->sb,
> -							    &fe->id2.i_list,
> -							    clusters_to_add);
> -			status = ocfs2_extend_trans(handle, credits);
> +			status = ocfs2_allocate_extend_trans(handle, 1);
>  			if (status < 0) {
>  				/* handle still has to be committed at
>  				 * this point. */
> diff -puN fs/ocfs2/journal.c~ocfs2-lighten-up-allocate-transaction fs/ocfs2/journal.c
> --- a/fs/ocfs2/journal.c~ocfs2-lighten-up-allocate-transaction
> +++ a/fs/ocfs2/journal.c
> @@ -455,6 +455,41 @@ bail:
>  	return status;
>  }
>  
> +/*
> + * If we have fewer than thresh credits, extend by OCFS2_MAX_TRANS_DATA.
> + * If that fails, restart the transaction & regain write access for the
> + * buffer head which is used for metadata modifications.
> + * Taken from Ext4: extend_or_restart_transaction()
> + */
> +int ocfs2_allocate_extend_trans(handle_t *handle, int thresh)
> +{
> +	int status, old_nblks;
> +
> +	BUG_ON(!handle);
> +
> +	old_nblks = handle->h_buffer_credits;
> +	trace_ocfs2_allocate_extend_trans(old_nblks, thresh);
> +
> +	if (old_nblks < thresh)
> +		return 0;
> +
> +	status = jbd2_journal_extend(handle, OCFS2_MAX_TRANS_DATA);
> +	if (status < 0) {
> +		mlog_errno(status);
> +		goto bail;
> +	}
> +
> +	if (status > 0) {
> +		status = jbd2_journal_restart(handle, OCFS2_MAX_TRANS_DATA);
> +		if (status < 0)
> +			mlog_errno(status);
> +	}
> +
> +bail:
> +	return status;
> +}
> +
> +
>  struct ocfs2_triggers {
>  	struct jbd2_buffer_trigger_type	ot_triggers;
>  	int				ot_offset;
> diff -puN fs/ocfs2/journal.h~ocfs2-lighten-up-allocate-transaction fs/ocfs2/journal.h
> --- a/fs/ocfs2/journal.h~ocfs2-lighten-up-allocate-transaction
> +++ a/fs/ocfs2/journal.h
> @@ -258,6 +258,17 @@ handle_t		    *ocfs2_start_trans(struct
>  int			     ocfs2_commit_trans(struct ocfs2_super *osb,
>  						handle_t *handle);
>  int			     ocfs2_extend_trans(handle_t *handle, int nblocks);
> +int			     ocfs2_allocate_extend_trans(handle_t *handle,
> +						int thresh);
> +
> +/*
> + * Define an arbitrary limit for the amount of data we will anticipate
> + * writing to any given transaction.  For unbounded transactions such as
> + * fallocate(2) we can write more than this, but we always
> + * start off at the maximum transaction size and grow the transaction
> + * optimistically as we go.
> + */
> +#define OCFS2_MAX_TRANS_DATA	64U
>  
>  /*
>   * Create access is for when we get a newly created buffer and we're
> diff -puN fs/ocfs2/ocfs2_trace.h~ocfs2-lighten-up-allocate-transaction fs/ocfs2/ocfs2_trace.h
> --- a/fs/ocfs2/ocfs2_trace.h~ocfs2-lighten-up-allocate-transaction
> +++ a/fs/ocfs2/ocfs2_trace.h
> @@ -2579,6 +2579,8 @@ DEFINE_OCFS2_INT_INT_EVENT(ocfs2_extend_
>  
>  DEFINE_OCFS2_INT_EVENT(ocfs2_extend_trans_restart);
>  
> +DEFINE_OCFS2_INT_INT_EVENT(ocfs2_allocate_extend_trans);
> +
>  DEFINE_OCFS2_ULL_ULL_UINT_UINT_EVENT(ocfs2_journal_access);
>  
>  DEFINE_OCFS2_ULL_EVENT(ocfs2_journal_dirty);
> _
> 
> .
> 

      reply	other threads:[~2013-09-03  2:58 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-08-27 21:04 [Ocfs2-devel] [patch 05/22] ocfs2: lighten up allocate transaction akpm at linux-foundation.org
2013-09-03  2:58 ` Younger Liu [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=52255051.9070806@huawei.com \
    --to=younger.liu@huawei.com \
    --cc=ocfs2-devel@oss.oracle.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.