linux-btrfs.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Zhao Lei <zhaolei@cn.fujitsu.com>
To: "'Anand Jain'" <anand.jain@oracle.com>, <linux-btrfs@vger.kernel.org>
Subject: RE: [PATCH] btrfs: Add raid56 support for updating num_tolerated_disk_barrier_failures in btrfs_balance()
Date: Fri, 17 Jul 2015 17:38:32 +0800	[thread overview]
Message-ID: <02a801d0c074$58ce7890$0a6b69b0$@cn.fujitsu.com> (raw)
In-Reply-To: <55A8C6DB.80208@oracle.com>

Hi, Anand Jain

Thanks for review it.

> -----Original Message-----
> From: Anand Jain [mailto:anand.jain@oracle.com]
> Sent: Friday, July 17, 2015 5:12 PM
> To: Zhaolei; linux-btrfs@vger.kernel.org
> Subject: Re: [PATCH] btrfs: Add raid56 support for updating
> num_tolerated_disk_barrier_failures in btrfs_balance()
> 
> 
> 
> nice clean up thanks. but... more below.
> 
> On 07/16/2015 08:15 PM, Zhaolei wrote:
> > From: Zhao Lei <zhaolei@cn.fujitsu.com>
> >
> > Code for updating fs_info->num_tolerated_disk_barrier_failures in
> > btrfs_balance() lacks raid56 support.
> >
> > Reason:
> >   Above code was wroten in 2012-08-01, together with
> >   btrfs_calc_num_tolerated_disk_barrier_failures()'s first version.
> >
> >   Then, btrfs_calc_num_tolerated_disk_barrier_failures() was updated
> >   later to support raid56, but code in btrfs_balance() was not
> >   updated together.
> >
> > Fix:
> >   Merge these similar code by adding a argument to
> >   btrfs_calc_num_tolerated_disk_barrier_failures() to make it
> >   support both case.
> >
> >   It can fix this bug with a bonus of cleanup, and make these code
> >   never in current no-sync state from now on.
> >
> > Signed-off-by: Zhao Lei <zhaolei@cn.fujitsu.com>
> > ---
> >   fs/btrfs/disk-io.c |  9 +++++----
> >   fs/btrfs/disk-io.h |  2 +-
> >   fs/btrfs/volumes.c | 28 +++++++++-------------------
> >   3 files changed, 15 insertions(+), 24 deletions(-)
> >
> > diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c index
> > b6600c7..ac26111 100644
> > --- a/fs/btrfs/disk-io.c
> > +++ b/fs/btrfs/disk-io.c
> > @@ -2946,7 +2946,7 @@ retry_root_backup:
> >   		goto fail_sysfs;
> >   	}
> >   	fs_info->num_tolerated_disk_barrier_failures =
> > -		btrfs_calc_num_tolerated_disk_barrier_failures(fs_info);
> > +		btrfs_calc_num_tolerated_disk_barrier_failures(fs_info, 0);
> >   	if (fs_info->fs_devices->missing_devices >
> >   	     fs_info->num_tolerated_disk_barrier_failures &&
> >   	    !(sb->s_flags & MS_RDONLY)) {
> > @@ -3441,7 +3441,7 @@ static int barrier_all_devices(struct btrfs_fs_info
> *info)
> >   }
> >
> >   int btrfs_calc_num_tolerated_disk_barrier_failures(
> > -	struct btrfs_fs_info *fs_info)
> > +	struct btrfs_fs_info *fs_info, u64 extra_flags)
> >   {
> 
>   extra_flags not required. since .. more below.
> 
> >   	struct btrfs_ioctl_space_info space;
> >   	struct btrfs_space_info *sinfo;
> > @@ -3481,7 +3481,7 @@ int
> btrfs_calc_num_tolerated_disk_barrier_failures(
> >   						   &space);
> >   			if (space.total_bytes == 0 || space.used_bytes == 0)
> >   				continue;
> > -			flags = space.flags;
> > +			flags = space.flags | extra_flags;
> >   			/*
> >   			 * return
> >   			 * 0: if dup, single or RAID0 is configured for @@ -3493,7
> > +3493,8 @@ int btrfs_calc_num_tolerated_disk_barrier_failures(
> >   			 */
> >   			if (num_tolerated_disk_barrier_failures > 0 &&
> >   			    ((flags & (BTRFS_BLOCK_GROUP_DUP |
> > -				       BTRFS_BLOCK_GROUP_RAID0)) ||
> > +				       BTRFS_BLOCK_GROUP_RAID0 |
> > +				       BTRFS_AVAIL_ALLOC_BIT_SINGLE)) ||
> >   			     ((flags & BTRFS_BLOCK_GROUP_PROFILE_MASK) ==
> 0)))
> >   				num_tolerated_disk_barrier_failures = 0;
> >   			else if (num_tolerated_disk_barrier_failures > 1 && diff
> --git
> > a/fs/btrfs/disk-io.h b/fs/btrfs/disk-io.h index d4cbfee..aceaa8d
> > 100644
> > --- a/fs/btrfs/disk-io.h
> > +++ b/fs/btrfs/disk-io.h
> > @@ -140,7 +140,7 @@ struct btrfs_root *btrfs_create_tree(struct
> btrfs_trans_handle *trans,
> >   int btree_lock_page_hook(struct page *page, void *data,
> >   				void (*flush_fn)(void *));
> >   int btrfs_calc_num_tolerated_disk_barrier_failures(
> > -	struct btrfs_fs_info *fs_info);
> > +	struct btrfs_fs_info *fs_info, u64 extra_flags);
> >   int __init btrfs_end_io_wq_init(void);
> >   void btrfs_end_io_wq_exit(void);
> >
> > diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c index
> > fbe7c10..d739915 100644
> > --- a/fs/btrfs/volumes.c
> > +++ b/fs/btrfs/volumes.c
> > @@ -1812,7 +1812,8 @@ int btrfs_rm_device(struct btrfs_root *root, char
> *device_path)
> >   	}
> >
> >   	root->fs_info->num_tolerated_disk_barrier_failures =
> > -		btrfs_calc_num_tolerated_disk_barrier_failures(root->fs_info);
> > +		btrfs_calc_num_tolerated_disk_barrier_failures(root->fs_info,
> > +							       0);
> >
> >   	/*
> >   	 * at this point, the device is zero sized.  We want to @@ -2342,7
> > +2343,8 @@ int btrfs_init_new_device(struct btrfs_root *root, char
> *device_path)
> >   	}
> >
> >   	root->fs_info->num_tolerated_disk_barrier_failures =
> > -		btrfs_calc_num_tolerated_disk_barrier_failures(root->fs_info);
> > +		btrfs_calc_num_tolerated_disk_barrier_failures(root->fs_info,
> > +							       0);
> >   	ret = btrfs_commit_transaction(trans, root);
> >
> >   	if (seeding_dev) {
> > @@ -3573,23 +3575,10 @@ int btrfs_balance(struct btrfs_balance_control
> *bctl,
> >   	} while (read_seqretry(&fs_info->profiles_lock, seq));
> >
> >   	if (bctl->sys.flags & BTRFS_BALANCE_ARGS_CONVERT) {
> > -		int num_tolerated_disk_barrier_failures;
> > -		u64 target = bctl->sys.target;
> > -
> > -		num_tolerated_disk_barrier_failures =
> > -			btrfs_calc_num_tolerated_disk_barrier_failures(fs_info);
> > -		if (num_tolerated_disk_barrier_failures > 0 &&
> > -		    (target &
> > -		     (BTRFS_BLOCK_GROUP_DUP | BTRFS_BLOCK_GROUP_RAID0 |
> > -		      BTRFS_AVAIL_ALLOC_BIT_SINGLE)))
> > -			num_tolerated_disk_barrier_failures = 0;
> > -		else if (num_tolerated_disk_barrier_failures > 1 &&
> > -			 (target &
> > -			  (BTRFS_BLOCK_GROUP_RAID1 |
> BTRFS_BLOCK_GROUP_RAID10)))
> > -			num_tolerated_disk_barrier_failures = 1;
> > -
> >   		fs_info->num_tolerated_disk_barrier_failures =	
> > -			num_tolerated_disk_barrier_failures;
> > +			btrfs_calc_num_tolerated_disk_barrier_failures(
> > +				fs_info,
> > +				bctl->sys.target);
> >   	}


> 
>   target is part of the user-end set item. please don't propagate
>   that to the function btrfs_calc_num_tolerated_disk_barrier_failures()
>   which is quite usefully used by many more functions. target must be
>   handled in here.
> 
>   Also, while you are here it looks like this and
>    btrfs_chunk_max_errors() can be merged as well.
> 

Do you means use btrfs_chunk_max_errors() here to calculate
s_info->num_tolerated_disk_barrier_failures here, instead of 
adding a extea argument to btrfs_calc_num_tolerated_disk_barrier_failures(),
like:

info->num_tolerated_disk_barrier_failures =	
min(
btrfs_calc_num_tolerated_disk_barrier_failures(fs_info),
btrfs_chunk_max_errors(bctl->sys.target)
);

Thanks
Zhaolei

> Thanks. Anand
> 
> 
> >   	ret = insert_balance_item(fs_info->tree_root, bctl); @@ -3616,7
> > +3605,8 @@ int btrfs_balance(struct btrfs_balance_control *bctl,
> >
> >   	if (bctl->sys.flags & BTRFS_BALANCE_ARGS_CONVERT) {
> >   		fs_info->num_tolerated_disk_barrier_failures =
> > -			btrfs_calc_num_tolerated_disk_barrier_failures(fs_info);
> > +			btrfs_calc_num_tolerated_disk_barrier_failures(fs_info,
> > +								       0);
> >   	}
> >
> >   	if (bargs) {
> >


  reply	other threads:[~2015-07-17  9:38 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-07-16 12:15 [PATCH] btrfs: Add raid56 support for updating num_tolerated_disk_barrier_failures in btrfs_balance() Zhaolei
2015-07-17  9:11 ` Anand Jain
2015-07-17  9:38   ` Zhao Lei [this message]
2015-07-20  9:04     ` Zhao Lei
2015-07-21 11:06       ` Anand Jain

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='02a801d0c074$58ce7890$0a6b69b0$@cn.fujitsu.com' \
    --to=zhaolei@cn.fujitsu.com \
    --cc=anand.jain@oracle.com \
    --cc=linux-btrfs@vger.kernel.org \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).