MFC: Don't allow to specify wrong stripe size. Index: sbin/geom/class/stripe/geom_stripe.c =================================================================== RCS file: /private/FreeBSD/src/sbin/geom/class/stripe/geom_stripe.c,v retrieving revision 1.6.2.1 retrieving revision 1.8 diff -u -p -r1.6.2.1 -r1.8 --- sbin/geom/class/stripe/geom_stripe.c 14 Sep 2004 15:42:23 -0000 1.6.2.1 +++ sbin/geom/class/stripe/geom_stripe.c 26 Sep 2004 17:15:42 -0000 1.8 @@ -25,7 +25,7 @@ */ #include -__FBSDID("$FreeBSD: src/sbin/geom/class/stripe/geom_stripe.c,v 1.6.2.1 2004/09/14 15:42:23 pjd Exp $"); +__FBSDID("$FreeBSD: src/sbin/geom/class/stripe/geom_stripe.c,v 1.8 2004/09/26 17:15:42 pjd Exp $"); #include #include @@ -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; /*