All of lore.kernel.org
 help / color / mirror / Atom feed
From: Nikolay Borisov <nborisov@suse.com>
To: Anand Jain <anand.jain@oracle.com>, linux-btrfs@vger.kernel.org
Subject: Re: [PATCH v2 2/4] btrfs: delete identified alien device in open_fs_devices
Date: Sun, 6 Oct 2019 14:44:11 +0300	[thread overview]
Message-ID: <8dea451e-5473-9136-f4c3-aa41b2ab438f@suse.com> (raw)
In-Reply-To: <20191006024711.4666-1-anand.jain@oracle.com>



On 6.10.19 г. 5:47 ч., Anand Jain wrote:
> In open_fs_devices() we identify alien device but we don't reset its
> the device::name. So progs device list does not show the device missing
> as shown in the script below.
> 
> mkfs.btrfs -fq /dev/sdd && mount /dev/sdd /btrfs
> mkfs.btrfs -fq -draid1 -mraid1 /dev/sdc /dev/sdb
> sleep 3 # avoid racing with udev's useless scans if needed
> btrfs dev add -f /dev/sdb /btrfs
> mount -o degraded /dev/sdc /btrfs1
> 
> No missing device:
> btrfs fi show -m /btrfs1
> Label: none  uuid: 3eb7cd50-4594-458f-9d68-c243cc49954d
> 	Total devices 2 FS bytes used 128.00KiB
> 	devid    1 size 12.00GiB used 1.26GiB path /dev/sdc
> 	devid    2 size 12.00GiB used 1.26GiB path /dev/sdb
> 
> Signed-off-by: Anand Jain <anand.jain@oracle.com>
> ---
> v2: Move free alien part to its parent function btrfs_open_one_device.
>     Thanks Nikolay.
> 
> PS: Fundamentally its wrong approach that btrfs-progs deduces the device
> missing state in the userland instead of obtaining it from the kernel.
> I objected on the patch, but still those patches got merged, this bug is
> one of its side effects. Ironically I wrote patches to read device_state
> from the kernel using ioctl, procfs and sysfs but didn't get the due
> attention till a merger.
> 
>  fs/btrfs/volumes.c | 32 +++++++++++++++++++++++---------
>  1 file changed, 23 insertions(+), 9 deletions(-)
> 
> diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c
> index c223a8147bfd..21aaf64c59b2 100644
> --- a/fs/btrfs/volumes.c
> +++ b/fs/btrfs/volumes.c
> @@ -591,13 +591,18 @@ static int btrfs_open_one_device(struct btrfs_fs_devices *fs_devices,
>  	if (ret)
>  		return ret;
>  
> +	ret = -EINVAL;
>  	disk_super = (struct btrfs_super_block *)bh->b_data;
>  	devid = btrfs_stack_device_id(&disk_super->dev_item);
> -	if (devid != device->devid)
> +	if (devid != device->devid) {
> +		ret = -EUCLEAN;
>  		goto error_brelse;
> +	}
>  
> -	if (memcmp(device->uuid, disk_super->dev_item.uuid, BTRFS_UUID_SIZE))
> +	if (memcmp(device->uuid, disk_super->dev_item.uuid, BTRFS_UUID_SIZE)) {
> +		ret = -EUCLEAN;
>  		goto error_brelse;
> +	}
>  
>  	device->generation = btrfs_super_generation(disk_super);
>  
> @@ -640,7 +645,7 @@ static int btrfs_open_one_device(struct btrfs_fs_devices *fs_devices,
>  	brelse(bh);
>  	blkdev_put(bdev, flags);
>  
> -	return -EINVAL;
> +	return ret;
>  }
>  
>  /*
> @@ -1121,19 +1126,28 @@ int btrfs_close_devices(struct btrfs_fs_devices *fs_devices)
>  static int open_fs_devices(struct btrfs_fs_devices *fs_devices,
>  				fmode_t flags, void *holder)
>  {
> +	int ret;
>  	struct btrfs_device *device;
> +	struct btrfs_device *tmp_device;
>  	struct btrfs_device *latest_dev = NULL;
>  
>  	flags |= FMODE_EXCL;
>  
> -	list_for_each_entry(device, &fs_devices->devices, dev_list) {
> +	list_for_each_entry_safe(device, tmp_device, &fs_devices->devices,
> +				 dev_list) {
>  		/* Just open everything we can; ignore failures here */
> -		if (btrfs_open_one_device(fs_devices, device, flags, holder))
> -			continue;
> -
> -		if (!latest_dev ||
> -		    device->generation > latest_dev->generation)
> +		ret = btrfs_open_one_device(fs_devices, device, flags, holder);
> +		if (ret == 0 && (!latest_dev ||
> +		    device->generation > latest_dev->generation)) {
>  			latest_dev = device;
> +			continue;
> +		}

nit: Had you used if () {} else if {}  you could have done away with the
continue.

> +		if (ret == -EUCLEAN) {
> +			/* An alien device. Clean it up */
> +			fs_devices->num_devices--;
> +			list_del(&device->dev_list);
> +			btrfs_free_device(device);
> +		}
>  	}
>  	if (fs_devices->open_devices == 0)
>  		return -EINVAL;
> 

  reply	other threads:[~2019-10-06 11:44 UTC|newest]

Thread overview: 15+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-10-04  7:49 [PATCH 0/4] btrfs: fix issues due to alien device Anand Jain
2019-10-04  7:50 ` [PATCH 1/4] btrfs: drop useless goto in open_fs_devices Anand Jain
2019-10-04  8:12   ` Nikolay Borisov
2019-10-04  7:50 ` [PATCH 2/4] btrfs: delete identified alien device " Anand Jain
2019-10-04  8:18   ` Nikolay Borisov
2019-10-06  2:47     ` [PATCH v2 " Anand Jain
2019-10-06 11:44       ` Nikolay Borisov [this message]
2019-10-06  2:51     ` [PATCH " Anand Jain
2019-10-04  7:50 ` [PATCH 3/4] btrfs: include non-missing as a qualifier for the latest_bdev Anand Jain
2019-10-04  8:11   ` Nikolay Borisov
2019-10-04  9:08     ` [Not TLS] " Graham Cobb
2019-10-04  9:20       ` Nikolay Borisov
2019-10-04  7:50 ` [PATCH 4/4] btrfs: free alien device due to device add Anand Jain
2019-10-04  8:19 ` [PATCH 0/4] btrfs: fix issues due to alien device Nikolay Borisov
2019-10-07  9:42   ` 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=8dea451e-5473-9136-f4c3-aa41b2ab438f@suse.com \
    --to=nborisov@suse.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 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.