Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 18 Nov 2008 00:03:30 +0000 (UTC)
From:      Marcel Moolenaar <marcel@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r185038 - head/sbin/geom/class/part
Message-ID:  <200811180003.mAI03UKc061998@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: marcel
Date: Tue Nov 18 00:03:30 2008
New Revision: 185038
URL: http://svn.freebsd.org/changeset/base/185038

Log:
  Pad the bootcode we write to the partition to a multiple of the
  sector size.
  
  Submitted by:	Alexey Shuvaev <shuvaev@physik.uni-wuerzburg.de>
  Prompted by: 	delphij
  MFC after:	3 days

Modified:
  head/sbin/geom/class/part/geom_part.c

Modified: head/sbin/geom/class/part/geom_part.c
==============================================================================
--- head/sbin/geom/class/part/geom_part.c	Tue Nov 18 00:01:16 2008	(r185037)
+++ head/sbin/geom/class/part/geom_part.c	Tue Nov 18 00:03:30 2008	(r185038)
@@ -393,6 +393,8 @@ gpart_write_partcode(struct gctl_req *re
 	struct ggeom *gp;
 	struct gprovider *pp;
 	const char *s;
+	char *buf;
+	off_t bsize;
 	int error, fd;
 
 	s = gctl_get_ascii(req, "class");
@@ -428,8 +430,21 @@ gpart_write_partcode(struct gctl_req *re
 			errx(EXIT_FAILURE, "%s: not enough space", dsf);
 		if (lseek(fd, 0, SEEK_SET) != 0)
 			err(EXIT_FAILURE, "%s", dsf);
-		if (write(fd, code, size) != size)
+
+		/*
+		 * When writing to a disk device, the write must be
+		 * sector aligned and not write to any partial sectors,
+		 * so round up the buffer size to the next sector and zero it.
+		 */
+		bsize = (size + pp->lg_sectorsize - 1) /
+		    pp->lg_sectorsize * pp->lg_sectorsize;
+		buf = calloc(1, bsize);
+		if (buf == NULL)
+			err(EXIT_FAILURE, "%s", dsf);
+		bcopy(code, buf, size);
+		if (write(fd, buf, bsize) != bsize)
 			err(EXIT_FAILURE, "%s", dsf);
+		free(buf);
 		close(fd);
 	} else
 		errx(EXIT_FAILURE, "invalid partition index");



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