bin/127922: gpart auto-padding gptboot
Alexey Shuvaev
shuvaev at physik.uni-wuerzburg.de
Tue Oct 7 14:00:14 UTC 2008
>Number: 127922
>Category: bin
>Synopsis: gpart auto-padding gptboot
>Confidential: no
>Severity: non-critical
>Priority: low
>Responsible: freebsd-bugs
>State: open
>Quarter:
>Keywords:
>Date-Required:
>Class: sw-bug
>Submitter-Id: current-users
>Arrival-Date: Tue Oct 07 14:00:14 UTC 2008
>Closed-Date:
>Last-Modified:
>Originator: Alexey Shuvaev
>Release: 8.0-CURRENT
>Organization:
University of Wuerzburg
>Environment:
FreeBSD wep4035.physik.uni-wuerzburg.de 8.0-CURRENT FreeBSD 8.0-CURRENT #0: Wed Oct 1 16:59:10 CEST 2008 root at wep4035.physik.uni-wuerzburg.de:/usr/obj/usr/src/sys/GENERIC amd64
>Description:
This is about gpart's "bootcode" verb
(namely -b bootcode -i part_index part of the verb).
The code is taken from gpt(8) utility (removed from current).
It adds automatic padding of gptboot bootcode to the nearest sector boundary.
Otherwise gptboot is trancated and is unable to boot.
>How-To-Repeat:
>Fix:
Patch attached with submission follows:
--- sbin/geom/class/part/geom_part.c.orig 2008-08-08 18:14:25.000000000 +0200
+++ sbin/geom/class/part/geom_part.c 2008-09-20 04:13:15.000000000 +0200
@@ -386,6 +386,8 @@
struct ggeom *gp;
struct gprovider *pp;
const char *s;
+ char *buf;
+ off_t bsize;
int error, fd;
s = gctl_get_ascii(req, "class");
@@ -421,7 +423,17 @@
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);
+ bcopy(code, buf, size);
+ if (write(fd, buf, bsize) != bsize)
err(EXIT_FAILURE, "%s", dsf);
close(fd);
} else
>Release-Note:
>Audit-Trail:
>Unformatted:
More information about the freebsd-bugs
mailing list