[PATCH] Warn the user about too small array size

[PATCH] Warn the user about too small array size

am 28.02.2011 06:00:43 von krzysztof.wojcik

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
---
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@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html

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

am 10.03.2011 10:40:33 von krzysztof.wojcik

TmVpbCwNCg0KQ291bGQgeW91IGluY2x1ZGUgYWxzbyB0aGlzIHBhdGNoLCBw bGVhc2UuDQoNClJl
Z2FyZHMNCg0KPiAtLS0tLU9yaWdpbmFsIE1lc3NhZ2UtLS0tLQ0KPiBGcm9t OiBsaW51eC1yYWlk
LW93bmVyQHZnZXIua2VybmVsLm9yZyBbbWFpbHRvOmxpbnV4LXJhaWQtDQo+ IG93bmVyQHZnZXIu
a2VybmVsLm9yZ10gT24gQmVoYWxmIE9mIEtyenlzenRvZiBXb2pjaWsNCj4g U2VudDogTW9uZGF5
LCBGZWJydWFyeSAyOCwgMjAxMSA2OjAxIEFNDQo+IFRvOiBuZWlsYkBzdXNl LmRlDQo+IENjOiBs
aW51eC1yYWlkQHZnZXIua2VybmVsLm9yZzsgTmV1YmF1ZXIsIFdvamNpZWNo OyBLd29sZWssIEFk
YW07DQo+IFdpbGxpYW1zLCBEYW4gSjsgQ2llY2hhbm93c2tpLCBFZA0KPiBT dWJqZWN0OiBbUEFU
Q0hdIFdhcm4gdGhlIHVzZXIgYWJvdXQgdG9vIHNtYWxsIGFycmF5IHNpemUN Cj4gDQo+IElmIHNp
bmdsZS1kaXNrIFJBSUQwIG9yIFJBSUQxIGFycmF5IGlzIGNyZWF0ZWQsIHVz ZXIgbWF5IHByZXNl
cnZlIGRhdGENCj4gb24NCj4gZGlzay4gSWYgYXJyYXkgZ2l2ZW4gc2l6ZSBj b3ZlcnMgYWxsIHBh
cnRpdGlvbnMgb24gZGlzaywgYWxsIGRhdGEgd2lsbA0KPiBiZQ0KPiBhdmFp bGFibGUgb24gY3Jl
YXRlZCBhcnJheS4gSWYgYXJyYXkgc2l6ZSBpcyB0b28gc21hbGwgKG5vdCBj b3ZlcnMNCj4gYWxs
IHBhcnRpdGlvbnMpLCBkYXRhIHdpbGwgYmUgbm90IGFjY2Vzc2libGUuDQo+ IFRoaXMgcGF0Y2gg
aW50cm9kdWNlcyB3YXJuaW5nIG1lc3NhZ2UgZHVyaW5nIGFycmF5IGNyZWF0 aW9uIGlmIGdpdmVu
DQo+IHNpemUNCj4gaXMgdG9vIHNtYWxsLiBVc2VyIG1heSBpbnRlcnJ1cHQg Y3JlYXRpb24gcHJv
Y2VzcyB0byBhdm9pZCBkYXRhIGxvc3MuDQo+IA0KPiBTaWduZWQtb2ZmLWJ5 OiBLcnp5c3p0b2Yg
V29qY2lrIDxrcnp5c3p0b2Yud29qY2lrQGludGVsLmNvbT4NCj4gLS0tDQo+ ICBDcmVhdGUuYyB8
ICAgIDcgKysrLS0tLQ0KPiAgbWRhZG0uaCAgfCAgICAyICstDQo+ICB1dGls LmMgICB8ICAgIDkg
KysrKysrKystDQo+ICAzIGZpbGVzIGNoYW5nZWQsIDEyIGluc2VydGlvbnMo KyksIDYgZGVsZXRp
b25zKC0pDQo+IA0KPiBkaWZmIC0tZ2l0IGEvQ3JlYXRlLmMgYi9DcmVhdGUu Yw0KPiBpbmRleCBi
YmQyNWU1Li5mZjE4ZmY4IDEwMDY0NA0KPiAtLS0gYS9DcmVhdGUuYw0KPiAr KysgYi9DcmVhdGUu
Yw0KPiBAQCAtMTIxLDcgKzEyMSw2IEBAIGludCBDcmVhdGUoc3RydWN0IHN1 cGVydHlwZSAqc3Qs
IGNoYXIgKm1kZGV2LA0KPiAgCXVuc2lnbmVkIGxvbmcgbG9uZyBuZXdzaXpl Ow0KPiANCj4gIAlp
bnQgbWFqb3JfbnVtID0gQklUTUFQX01BSk9SX0hJOw0KPiAtDQo+ICAJbWVt c2V0KCZpbmZvLCAw
LCBzaXplb2YoaW5mbykpOw0KPiAgCWlmIChsZXZlbCA9PSBVblNldCAmJiBz dCAmJiBzdC0+c3Mt
PmRlZmF1bHRfZ2VvbWV0cnkpDQo+ICAJCXN0LT5zcy0+ZGVmYXVsdF9nZW9t ZXRyeShzdCwgJmxl
dmVsLCBOVUxMLCBOVUxMKTsNCj4gQEAgLTM4MCwxNCArMzc5LDE0IEBAIGlu dCBDcmVhdGUoc3Ry
dWN0IHN1cGVydHlwZSAqc3QsIGNoYXIgKm1kZGV2LA0KPiAgCQkJaWYgKHN0 cmNtcChzdC0+c3Mt
Pm5hbWUsICIxLngiKSA9PSAwICYmDQo+ICAJCQkgICAgc3QtPm1pbm9yX3Zl cnNpb24gPj0gMSkN
Cj4gIAkJCQkvKiBtZXRhZGF0YSBhdCBmcm9udCAqLw0KPiAtCQkJCXdhcm4g fD0gY2hlY2tfcGFy
dGl0aW9ucyhmZCwgZG5hbWUsIDApOw0KPiArCQkJCXdhcm4gfD0gY2hlY2tf cGFydGl0aW9ucyhm
ZCwgZG5hbWUsIDAsIDApOw0KPiAgCQkJZWxzZSBpZiAobGV2ZWwgPT0gMSB8 fCBsZXZlbCA9PSBM
RVZFTF9DT05UQUlORVINCj4gIAkJCQkgICAgfHwgKGxldmVsID09IDAgJiYg cmFpZGRpc2tzID09
IDEpKQ0KPiAgCQkJCS8qIHBhcnRpdGlvbnMgY291bGQgYmUgbWVhbmluZ2Z1 bCAqLw0KPiAtCQkJ
CXdhcm4gfD0gY2hlY2tfcGFydGl0aW9ucyhmZCwgZG5hbWUsDQo+IGZyZWVz aXplKjIpOw0KPiAr
CQkJCXdhcm4gfD0gY2hlY2tfcGFydGl0aW9ucyhmZCwgZG5hbWUsIGZyZWVz aXplKjIsDQo+IHNp
emUqMik7DQo+ICAJCQllbHNlDQo+ICAJCQkJLyogcGFydGl0aW9ucyBjYW5u b3QgYmUgbWVhbmlu
Z2Z1bCAqLw0KPiAtCQkJCXdhcm4gfD0gY2hlY2tfcGFydGl0aW9ucyhmZCwg ZG5hbWUsIDApOw0K
PiArCQkJCXdhcm4gfD0gY2hlY2tfcGFydGl0aW9ucyhmZCwgZG5hbWUsIDAs IDApOw0KPiAgCQkJ
aWYgKHN0cmNtcChzdC0+c3MtPm5hbWUsICIxLngiKSA9PSAwICYmDQo+ICAJ CQkgICAgc3QtPm1p
bm9yX3ZlcnNpb24gPj0gMSAmJg0KPiAgCQkJICAgIGRpZF9kZWZhdWx0ICYm DQo+IGRpZmYgLS1n
aXQgYS9tZGFkbS5oIGIvbWRhZG0uaA0KPiBpbmRleCBhMWJlODU2Li40NzZh MmJlIDEwMDY0NA0K
PiAtLS0gYS9tZGFkbS5oDQo+ICsrKyBiL21kYWRtLmgNCj4gQEAgLTEwNzgs NyArMTA3OCw3IEBA
IGV4dGVybiBpbnQgcGFyc2VfbGF5b3V0X2ZhdWx0eShjaGFyICpsYXlvdXQp Ow0KPiAgZXh0ZXJu
IGludCBjaGVja19leHQyKGludCBmZCwgY2hhciAqbmFtZSk7DQo+ICBleHRl cm4gaW50IGNoZWNr
X3JlaXNlcihpbnQgZmQsIGNoYXIgKm5hbWUpOw0KPiAgZXh0ZXJuIGludCBj aGVja19yYWlkKGlu
dCBmZCwgY2hhciAqbmFtZSk7DQo+IC1leHRlcm4gaW50IGNoZWNrX3BhcnRp dGlvbnMoaW50IGZk
LCBjaGFyICpkbmFtZSwgdW5zaWduZWQgbG9uZyBsb25nDQo+IGZyZWVzaXpl KTsNCj4gK2V4dGVy
biBpbnQgY2hlY2tfcGFydGl0aW9ucyhpbnQgZmQsIGNoYXIgKmRuYW1lLCB1 bnNpZ25lZCBsb25n
IGxvbmcNCj4gZnJlZXNpemUsIHVuc2lnbmVkIGxvbmcgbG9uZyBzaXplKTsN Cj4gDQo+ICBleHRl
cm4gaW50IGdldF9tZHBfbWFqb3Iodm9pZCk7DQo+ICBleHRlcm4gaW50IGRl dl9vcGVuKGNoYXIg
KmRldiwgaW50IGZsYWdzKTsNCj4gZGlmZiAtLWdpdCBhL3V0aWwuYyBiL3V0 aWwuYw0KPiBpbmRl
eCA4N2MyM2RjLi4wZjcyYjBlIDEwMDY0NA0KPiAtLS0gYS91dGlsLmMNCj4g KysrIGIvdXRpbC5j
DQo+IEBAIC0xMzcwLDcgKzEzNzAsOCBAQCBzdGF0aWMgaW50IGdldF9sYXN0 X3BhcnRpdGlvbl9l
bmQoaW50IGZkLA0KPiB1bnNpZ25lZCBsb25nIGxvbmcgKmVuZG9mcGFydCkN Cj4gIAlyZXR1cm4g
cmV0dmFsOw0KPiAgfQ0KPiANCj4gLWludCBjaGVja19wYXJ0aXRpb25zKGlu dCBmZCwgY2hhciAq
ZG5hbWUsIHVuc2lnbmVkIGxvbmcgbG9uZyBmcmVlc2l6ZSkNCj4gK2ludCBj aGVja19wYXJ0aXRp
b25zKGludCBmZCwgY2hhciAqZG5hbWUsIHVuc2lnbmVkIGxvbmcgbG9uZyBm cmVlc2l6ZSwNCj4g
KwkJCXVuc2lnbmVkIGxvbmcgbG9uZyBzaXplKQ0KPiAgew0KPiAgCS8qDQo+ ICAJICogQ2hlY2sg
d2hlcmUgdGhlIGxhc3QgcGFydGl0aW9uIGVuZHMNCj4gQEAgLTEzOTMsNiAr MTM5NCwxMiBAQCBp
bnQgY2hlY2tfcGFydGl0aW9ucyhpbnQgZmQsIGNoYXIgKmRuYW1lLA0KPiB1 bnNpZ25lZCBsb25n
IGxvbmcgZnJlZXNpemUpDQo+ICAJCQkJTmFtZSAiOiBtZXRhZGF0YSB3aWxs IG92ZXItd3JpdGUg
bGFzdCBwYXJ0aXRpb24NCj4gb24gJXMuXG4iLA0KPiAgCQkJCWRuYW1lKTsN Cj4gIAkJCXJldHVy
biAxOw0KPiArCQl9IGVsc2UgaWYgKHNpemUgJiYgZW5kb2ZwYXJ0ID4gc2l6 ZSkgew0KPiArCQkJ
LyogcGFydGl0aW9ucyB3aWxsIGJlIHRydW5jYXRlZCBpbiBuZXcgZGV2aWNl ICovDQo+ICsJCQlm
cHJpbnRmKHN0ZGVyciwNCj4gKwkJCQlOYW1lICI6IGFycmF5IHNpemUgaXMg dG9vIHNtYWxsIHRv
IGNvdmVyIGFsbA0KPiBwYXJ0aXRpb25zIG9uICVzLlxuIiwNCj4gKwkJCQlk bmFtZSk7DQo+ICsJ
CQlyZXR1cm4gMTsNCj4gIAkJfQ0KPiAgCX0NCj4gIAlyZXR1cm4gMDsNCj4g DQo+IC0tDQo+IFRv
IHVuc3Vic2NyaWJlIGZyb20gdGhpcyBsaXN0OiBzZW5kIHRoZSBsaW5lICJ1 bnN1YnNjcmliZSBs
aW51eC1yYWlkIg0KPiBpbg0KPiB0aGUgYm9keSBvZiBhIG1lc3NhZ2UgdG8g bWFqb3Jkb21vQHZn
ZXIua2VybmVsLm9yZw0KPiBNb3JlIG1ham9yZG9tbyBpbmZvIGF0ICBodHRw Oi8vdmdlci5rZXJu
ZWwub3JnL21ham9yZG9tby1pbmZvLmh0bWwNCg==
--
To unsubscribe from this list: send the line "unsubscribe linux-raid" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html

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

am 14.03.2011 08:23:05 von NeilBrown

On Thu, 10 Mar 2011 09:40:33 +0000 "Wojcik, Krzysztof"
wrote:

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

Applied. Thanks for the reminder.

NeilBrown


>
> Regards
>
> > -----Original Message-----
> > From: linux-raid-owner@vger.kernel.org [mailto:linux-raid-
> > owner@vger.kernel.org] On Behalf Of Krzysztof Wojcik
> > Sent: Monday, February 28, 2011 6:01 AM
> > To: neilb@suse.de
> > Cc: linux-raid@vger.kernel.org; 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
> > ---
> > 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@vger.kernel.org
> > 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@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html