Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 11 Feb 2011 14:49:25 +0000 (UTC)
From:      Alexander Motin <mav@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject:   svn commit: r218569 - projects/graid/head/sys/geom/raid
Message-ID:  <201102111449.p1BEnPn5063771@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: mav
Date: Fri Feb 11 14:49:25 2011
New Revision: 218569
URL: http://svn.freebsd.org/changeset/base/218569

Log:
  Fix second volume offset/size rounding. Previous version could create
  intersecting volumes.

Modified:
  projects/graid/head/sys/geom/raid/md_intel.c

Modified: projects/graid/head/sys/geom/raid/md_intel.c
==============================================================================
--- projects/graid/head/sys/geom/raid/md_intel.c	Fri Feb 11 14:44:00 2011	(r218568)
+++ projects/graid/head/sys/geom/raid/md_intel.c	Fri Feb 11 14:49:25 2011	(r218569)
@@ -1681,19 +1681,6 @@ makedisk:
 			size = size - (sd->sd_offset + sd->sd_size);
 		}
 
-		/* Handle size argument. */
-		len = sizeof(*sizearg);
-		sizearg = gctl_get_param(req, "size", &len);
-		if (sizearg != NULL && len == sizeof(*sizearg) &&
-		    *sizearg > 0) {
-			if (*sizearg > size) {
-				gctl_error(req, "Size too big %lld > %lld.",
-				    (long long)*sizearg, (long long)size);
-				return (-9);
-			}
-			size = *sizearg;
-		}
-
 		/* Handle strip argument. */
 		strip = 131072;
 		len = sizeof(*striparg);
@@ -1716,8 +1703,23 @@ makedisk:
 		}
 
 		/* Round offset up to strip. */
-		size -= ((strip - off) % strip);
-		off += ((strip - off) % strip);
+		if (off % strip != 0) {
+			size -= strip - off % strip;
+			off += strip - off % strip;
+		}
+
+		/* Handle size argument. */
+		len = sizeof(*sizearg);
+		sizearg = gctl_get_param(req, "size", &len);
+		if (sizearg != NULL && len == sizeof(*sizearg) &&
+		    *sizearg > 0) {
+			if (*sizearg > size) {
+				gctl_error(req, "Size too big %lld > %lld.",
+				    (long long)*sizearg, (long long)size);
+				return (-9);
+			}
+			size = *sizearg;
+		}
 
 		/* Round size down to strip or sector. */
 		if (level == G_RAID_VOLUME_RL_RAID1)



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201102111449.p1BEnPn5063771>