Don't allow to specify wrong stripe size.

Reported by:	obrien
This commit is contained in:
Pawel Jakub Dawidek 2004-09-26 17:15:42 +00:00
parent 9007cc283f
commit 0c8a9da21e
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=135825

View File

@ -129,7 +129,7 @@ stripe_label(struct gctl_req *req)
intmax_t *stripesizep;
off_t compsize, msize;
u_char sector[512];
unsigned i, ssize;
unsigned i, ssize, secsize;
const char *name;
char param[16];
int *hardcode, *nargs, error;
@ -153,6 +153,7 @@ stripe_label(struct gctl_req *req)
* Clear last sector first to spoil all components if device exists.
*/
compsize = 0;
secsize = 0;
for (i = 1; i < (unsigned)*nargs; i++) {
snprintf(param, sizeof(param), "arg%u", i);
name = gctl_get_asciiparam(req, param);
@ -167,6 +168,10 @@ stripe_label(struct gctl_req *req)
msize -= ssize;
if (compsize == 0 || (compsize > 0 && msize < compsize))
compsize = msize;
if (secsize == 0)
secsize = ssize;
else
secsize = g_lcm(secsize, ssize);
error = g_metadata_clear(name, NULL);
if (error != 0) {
@ -191,6 +196,11 @@ stripe_label(struct gctl_req *req)
gctl_error(req, "No '%s' argument.", "stripesize");
return;
}
if ((*stripesizep % secsize) != 0) {
gctl_error(req, "Stripesize should be multiple of %u.",
secsize);
return;
}
md.md_stripesize = *stripesizep;
/*