Re: [PATCH] Warn the user about too small array size

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

 



On Thu, 10 Mar 2011 09:40:33 +0000 "Wojcik, Krzysztof"
<krzysztof.wojcik@xxxxxxxxx> wrote:

> Neil,
> 
> Could you include also this patch, please.

Applied.  Thanks for the reminder.

NeilBrown


> 
> Regards
> 
> > -----Original Message-----
> > From: linux-raid-owner@xxxxxxxxxxxxxxx [mailto:linux-raid-
> > owner@xxxxxxxxxxxxxxx] On Behalf Of Krzysztof Wojcik
> > Sent: Monday, February 28, 2011 6:01 AM
> > To: neilb@xxxxxxx
> > Cc: linux-raid@xxxxxxxxxxxxxxx; Neubauer, Wojciech; Kwolek, Adam;
> > Williams, Dan J; Ciechanowski, Ed
> > Subject: [PATCH] Warn the user about too small array size
> > 
> > If single-disk RAID0 or RAID1 array is created, user may preserve data
> > on
> > disk. If array given size covers all partitions on disk, all data will
> > be
> > available on created array. If array size is too small (not covers
> > all partitions), data will be not accessible.
> > This patch introduces warning message during array creation if given
> > size
> > is too small. User may interrupt creation process to avoid data loss.
> > 
> > Signed-off-by: Krzysztof Wojcik <krzysztof.wojcik@xxxxxxxxx>
> > ---
> >  Create.c |    7 +++----
> >  mdadm.h  |    2 +-
> >  util.c   |    9 ++++++++-
> >  3 files changed, 12 insertions(+), 6 deletions(-)
> > 
> > diff --git a/Create.c b/Create.c
> > index bbd25e5..ff18ff8 100644
> > --- a/Create.c
> > +++ b/Create.c
> > @@ -121,7 +121,6 @@ int Create(struct supertype *st, char *mddev,
> >  	unsigned long long newsize;
> > 
> >  	int major_num = BITMAP_MAJOR_HI;
> > -
> >  	memset(&info, 0, sizeof(info));
> >  	if (level == UnSet && st && st->ss->default_geometry)
> >  		st->ss->default_geometry(st, &level, NULL, NULL);
> > @@ -380,14 +379,14 @@ int Create(struct supertype *st, char *mddev,
> >  			if (strcmp(st->ss->name, "1.x") == 0 &&
> >  			    st->minor_version >= 1)
> >  				/* metadata at front */
> > -				warn |= check_partitions(fd, dname, 0);
> > +				warn |= check_partitions(fd, dname, 0, 0);
> >  			else if (level == 1 || level == LEVEL_CONTAINER
> >  				    || (level == 0 && raiddisks == 1))
> >  				/* partitions could be meaningful */
> > -				warn |= check_partitions(fd, dname,
> > freesize*2);
> > +				warn |= check_partitions(fd, dname, freesize*2,
> > size*2);
> >  			else
> >  				/* partitions cannot be meaningful */
> > -				warn |= check_partitions(fd, dname, 0);
> > +				warn |= check_partitions(fd, dname, 0, 0);
> >  			if (strcmp(st->ss->name, "1.x") == 0 &&
> >  			    st->minor_version >= 1 &&
> >  			    did_default &&
> > diff --git a/mdadm.h b/mdadm.h
> > index a1be856..476a2be 100644
> > --- a/mdadm.h
> > +++ b/mdadm.h
> > @@ -1078,7 +1078,7 @@ extern int parse_layout_faulty(char *layout);
> >  extern int check_ext2(int fd, char *name);
> >  extern int check_reiser(int fd, char *name);
> >  extern int check_raid(int fd, char *name);
> > -extern int check_partitions(int fd, char *dname, unsigned long long
> > freesize);
> > +extern int check_partitions(int fd, char *dname, unsigned long long
> > freesize, unsigned long long size);
> > 
> >  extern int get_mdp_major(void);
> >  extern int dev_open(char *dev, int flags);
> > diff --git a/util.c b/util.c
> > index 87c23dc..0f72b0e 100644
> > --- a/util.c
> > +++ b/util.c
> > @@ -1370,7 +1370,8 @@ static int get_last_partition_end(int fd,
> > unsigned long long *endofpart)
> >  	return retval;
> >  }
> > 
> > -int check_partitions(int fd, char *dname, unsigned long long freesize)
> > +int check_partitions(int fd, char *dname, unsigned long long freesize,
> > +			unsigned long long size)
> >  {
> >  	/*
> >  	 * Check where the last partition ends
> > @@ -1393,6 +1394,12 @@ int check_partitions(int fd, char *dname,
> > unsigned long long freesize)
> >  				Name ": metadata will over-write last partition
> > on %s.\n",
> >  				dname);
> >  			return 1;
> > +		} else if (size && endofpart > size) {
> > +			/* partitions will be truncated in new device */
> > +			fprintf(stderr,
> > +				Name ": array size is too small to cover all
> > partitions on %s.\n",
> > +				dname);
> > +			return 1;
> >  		}
> >  	}
> >  	return 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

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