Re: [md PATCH 2/5] md: Enable reshape for external metadata

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

 



On Wed, 9 Jun 2010 15:21:05 +0100
"Kwolek, Adam" <adam.kwolek@xxxxxxxxx> wrote:

> (md: Online Capacity Expansion for IMSM)
> Reshape can't go forward for external metadatas due to fact, that internal md flags are updated during native meta writing. For external metadatas
> md_update_sb() is not called (reshape process is blocked).
> To take carry about md flags in external metadata array case and allow reshape to roll over, md_update_sb() is called in similar way to native metadata. The difference is that metadata is not stored to disks by md, but externally by mdmon.

I agree there is a problem here but I think you are approaching it the wrong
way.  We need to make sure the problem flag doesn't get set when external
metadata is used.

I found something similar (maybe the same thing) when writing the dm-raid456
module.  Does that patch:

http://neil.brown.name/git?p=md;a=commitdiff;h=3b930b37e50702f97f8fad6d7f5ee6d3f268394e

solve the problem for you?

Thanks,
NeilBrown


> ---
> 
>  drivers/md/md.c |   24 +++++++++++++++++-------
>  1 files changed, 17 insertions(+), 7 deletions(-)
> 
> diff --git a/drivers/md/md.c b/drivers/md/md.c index 9cec771..0a51406 100644
> --- a/drivers/md/md.c
> +++ b/drivers/md/md.c
> @@ -2065,8 +2065,6 @@ static void md_update_sb(mddev_t * mddev, int force_change)
>  	int nospares = 0;
>  
>  	mddev->utime = get_seconds();
> -	if (mddev->external)
> -		return;
>  repeat:
>  	spin_lock_irq(&mddev->write_lock);
>  
> @@ -2130,11 +2128,16 @@ repeat:
>  	/*
>  	 * do not write anything to disk if using
>  	 * nonpersistent superblocks
> +	 * and
> +	 * for external meta and reshape
> +	 * we can get here also
>  	 */
> -	if (!mddev->persistent) {
> -		if (!mddev->external)
> -			clear_bit(MD_CHANGE_PENDING, &mddev->flags);
> -
> +	if (!mddev->persistent ||
> +	    mddev->external) {
> +		/* Reshape for external meta
> +		 * MD_CHANGE_PENDING has to be cleared also
> +		 */
> +		clear_bit(MD_CHANGE_PENDING, &mddev->flags);
>  		spin_unlock_irq(&mddev->write_lock);
>  		wake_up(&mddev->sb_wait);
>  		return;
> @@ -6895,8 +6898,15 @@ void md_check_recovery(mddev_t *mddev)
>  		(mddev->external == 0 && mddev->safemode == 1) ||
>  		(mddev->safemode == 2 && ! atomic_read(&mddev->writes_pending)
>  		 && !mddev->in_sync && mddev->recovery_cp == MaxSector)
> -		))
> +		)) {
> +
> +		/* Reshape for external meta /add disks/
> +		 */
> +		if ((mddev->external) && (mddev->flags))
> +			md_update_sb(mddev, 0);
> +
>  		return;
> +	}
>  
>  	if (mddev_trylock(mddev)) {
>  		int spares = 0;
> 

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