RE: Single-drive RAID0

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 




> -----Original Message-----
> From: NeilBrown [mailto:neilb@xxxxxxx]
> Sent: Tuesday, February 22, 2011 1:50 AM
> To: Wojcik, Krzysztof
> Cc: linux-raid@xxxxxxxxxxxxxxx
> Subject: Re: Single-drive RAID0
> 
> On Mon, 21 Feb 2011 14:11:51 +0000 "Wojcik, Krzysztof"
> <krzysztof.wojcik@xxxxxxxxx> wrote:
> 
> > Hi,
> >
> > I tested your proposal.
> > It resolve the problem.
> 
> Thanks!
> 
> > What are your future plans?
> > Do you need to consult the patch with someone involved in the block
> devices code?
> > When can I expect final patch?
> 
> Here it is.  As you can see it is quite different - I figured out what
> is
> really going on..
> 
> 
> >
> > >
> > > If it does, then we can explore more...
> > > Did you say that this works better on earlier kernels?  If so, what
> is
> > > the
> > > latest kernel that you have tried that you don't have this problem
> on?
> >
> > I've tested on kernel 2.6.32 from RHEL6.0 and, if I remember
> correctly, 2.6.34- they work properly.
> 
> That fits - I discovered that I broke it in 2.6.35.
> 
> Thanks,
> NeilBrown

Hi,

I confirm. This patch resolve the problem.
I did tests on your current top of for-next branch and issue is not reproducible.
Thank for your cooperation! :-)

Regards
Krzysztof

> 
> From b7fea734c7780ca80f58fb87a6c9f55aa83314d7 Mon Sep 17 00:00:00 2001
> From: NeilBrown <neilb@xxxxxxx>
> Date: Tue, 22 Feb 2011 11:48:03 +1100
> Subject: [PATCH] md: Fix - again - partition detection when array
> becomes active
> 
> Revert
>     b821eaa572fd737faaf6928ba046e571526c36c6
> and
>     f3b99be19ded511a1bf05a148276239d9f13eefa
> 
> When I wrote the first of these I had a wrong idea about the
> lifetime of 'struct block_device'.  It can disappear at any time that
> the block device is not open if it falls out of the inode cache.
> 
> So relying on the 'size' recorded with it to detect when the
> device size has changed and so we need to revalidate, is wrong.
> 
> Rather, we really do need the 'changed' attribute stored directly in
> the mddev and set/tested as appropriate.
> 
> Without this patch, a sequence of:
>    mknod / open / close / unlink
> 
> (which can cause a block_device to be created and then destroyed)
> will result in a rescan of the partition table and consequence removal
> and addition of partitions.
> Several of these in a row can get udev racing to create and unlink and
> other code can get confused.
> 
> With the patch, the rescan is only performed when needed and so there
> are no races.
> 
> This is suitable for any stable kernel from 2.6.35.
> 
> Reported-by: "Wojcik, Krzysztof" <krzysztof.wojcik@xxxxxxxxx>
> Signed-off-by: NeilBrown <neilb@xxxxxxx>
> Cc: stable@xxxxxxxxxx
> ---
>  drivers/md/md.c |   22 +++++++++++++++++++++-
>  drivers/md/md.h |    2 ++
>  2 files changed, 23 insertions(+), 1 deletions(-)
> 
> diff --git a/drivers/md/md.c b/drivers/md/md.c
> index 330addf..818313e 100644
> --- a/drivers/md/md.c
> +++ b/drivers/md/md.c
> @@ -4627,6 +4627,7 @@ static int do_md_run(mddev_t *mddev)
>  	}
>  	set_capacity(mddev->gendisk, mddev->array_sectors);
>  	revalidate_disk(mddev->gendisk);
> +	mddev->changed = 1;
>  	kobject_uevent(&disk_to_dev(mddev->gendisk)->kobj, KOBJ_CHANGE);
>  out:
>  	return err;
> @@ -4715,6 +4716,7 @@ static void md_clean(mddev_t *mddev)
>  	mddev->sync_speed_min = mddev->sync_speed_max = 0;
>  	mddev->recovery = 0;
>  	mddev->in_sync = 0;
> +	mddev->changed = 0;
>  	mddev->degraded = 0;
>  	mddev->safemode = 0;
>  	mddev->bitmap_info.offset = 0;
> @@ -4830,6 +4832,7 @@ static int do_md_stop(mddev_t * mddev, int mode,
> int is_open)
> 
>  		set_capacity(disk, 0);
>  		mutex_unlock(&mddev->open_mutex);
> +		mddev->changed = 1;
>  		revalidate_disk(disk);
> 
>  		if (mddev->ro)
> @@ -6014,7 +6017,7 @@ static int md_open(struct block_device *bdev,
> fmode_t mode)
>  	atomic_inc(&mddev->openers);
>  	mutex_unlock(&mddev->open_mutex);
> 
> -	check_disk_size_change(mddev->gendisk, bdev);
> +	check_disk_change(bdev);
>   out:
>  	return err;
>  }
> @@ -6029,6 +6032,21 @@ static int md_release(struct gendisk *disk,
> fmode_t mode)
> 
>  	return 0;
>  }
> +
> +static int md_media_changed(struct gendisk *disk)
> +{
> +	mddev_t *mddev = disk->private_data;
> +
> +	return mddev->changed;
> +}
> +
> +static int md_revalidate(struct gendisk *disk)
> +{
> +	mddev_t *mddev = disk->private_data;
> +
> +	mddev->changed = 0;
> +	return 0;
> +}
>  static const struct block_device_operations md_fops =
>  {
>  	.owner		= THIS_MODULE,
> @@ -6039,6 +6057,8 @@ static const struct block_device_operations
> md_fops =
>  	.compat_ioctl	= md_compat_ioctl,
>  #endif
>  	.getgeo		= md_getgeo,
> +	.media_changed  = md_media_changed,
> +	.revalidate_disk= md_revalidate,
>  };
> 
>  static int md_thread(void * arg)
> diff --git a/drivers/md/md.h b/drivers/md/md.h
> index 7e90b85..12215d4 100644
> --- a/drivers/md/md.h
> +++ b/drivers/md/md.h
> @@ -274,6 +274,8 @@ struct mddev_s
>  	atomic_t			active;		/* general refcount */
>  	atomic_t			openers;	/* number of active opens */
> 
> +	int				changed;	/* True if we might need to
> +							 * reread partition info */
>  	int				degraded;	/* whether md should consider
>  							 * adding a spare
>  							 */
> --
> 1.7.1

--
To unsubscribe from this list: send the line "unsubscribe linux-raid" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux RAID Wiki]     [ATA RAID]     [Linux SCSI Target Infrastructure]     [Linux Block]     [Linux IDE]     [Linux SCSI]     [Linux Hams]     [Device Mapper]     [Device Mapper Cryptographics]     [Kernel]     [Linux Admin]     [Linux Net]     [GFS]     [RPM]     [git]     [Yosemite Forum]


  Powered by Linux