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