svn commit: r225565 - stable/8/sbin/geom/class/part

Andrey V. Elsukov ae at FreeBSD.org
Thu Sep 15 04:32:14 UTC 2011


Author: ae
Date: Thu Sep 15 04:32:14 2011
New Revision: 225565
URL: http://svn.freebsd.org/changeset/base/225565

Log:
  MFC r225445:
    Don't use the whole free space when resizing  partition to a larger size
    on a disk with non zero stripesize (e.g. disks with 4k sector size)[1].
    Also do not use automatic alignment when size is exactly specified, but
    an alignment is not. Use automatic alignment only for case when user
    omits both "-s" and "-a" options.
  
    Reported by:	Mikael Fridh <frimik at gmail> [1]

Modified:
  stable/8/sbin/geom/class/part/geom_part.c
Directory Properties:
  stable/8/sbin/geom/class/part/   (props changed)

Modified: stable/8/sbin/geom/class/part/geom_part.c
==============================================================================
--- stable/8/sbin/geom/class/part/geom_part.c	Thu Sep 15 04:16:03 2011	(r225564)
+++ stable/8/sbin/geom/class/part/geom_part.c	Thu Sep 15 04:32:14 2011	(r225565)
@@ -310,7 +310,7 @@ gpart_autofill_resize(struct gctl_req *r
 	off_t lba, new_lba, alignment, offset;
 	const char *s;
 	char *val;
-	int error, idx;
+	int error, idx, has_alignment;
 
 	s = gctl_get_ascii(req, index_param);
 	idx = strtol(s, &val, 10);
@@ -337,8 +337,9 @@ gpart_autofill_resize(struct gctl_req *r
 		errx(EXIT_FAILURE, "Provider for geom %s not found.", s);
 
 	s = gctl_get_ascii(req, "alignment");
+	has_alignment = (*s == '*') ? 0 : 1;
 	alignment = 1;
-	if (*s != '*') {
+	if (has_alignment) {
 		error = g_parse_lba(s, pp->lg_sectorsize, &alignment);
 		if (error)
 			errc(EXIT_FAILURE, error, "Invalid alignment param");
@@ -361,7 +362,7 @@ gpart_autofill_resize(struct gctl_req *r
 		if (error)
 			errc(EXIT_FAILURE, error, "Invalid size param");
 		/* no autofill necessary. */
-		if (alignment == 1)
+		if (has_alignment == 0)
 			goto done;
 	}
 
@@ -392,7 +393,8 @@ gpart_autofill_resize(struct gctl_req *r
 		lba = (off_t)strtoimax(s, NULL, 0);
 	size = lba - start + 1;
 
-	if (new_size > 0 && new_size <= size) {
+	pp = find_provider(gp, lba + 1);
+	if (new_size > 0 && (new_size <= size || pp == NULL)) {
 		/* The start offset may be not aligned, so we align the end
 		 * offset and then calculate the size.
 		 */
@@ -400,8 +402,6 @@ gpart_autofill_resize(struct gctl_req *r
 		    alignment) - start - offset;
 		goto done;
 	}
-
-	pp = find_provider(gp, lba + 1);
 	if (pp == NULL) {
 		new_size = ALIGNDOWN(last + offset + 1, alignment) -
 		    start - offset;


More information about the svn-src-stable mailing list