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>