svn commit: r185038 - head/sbin/geom/class/part
Marcel Moolenaar
marcel at FreeBSD.org
Mon Nov 17 16:03:31 PST 2008
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 at 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");
More information about the svn-src-all
mailing list