svn commit: r185038 - head/sbin/geom/class/part

Xin LI delphij at gmail.com
Mon Nov 17 20:57:26 PST 2008


Thanks!

On Mon, Nov 17, 2008 at 4:03 PM, Marcel Moolenaar <marcel at freebsd.org> wrote:
> 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");
>



-- 
Xin LI <delphij at delphij.net> http://www.delphij.net


More information about the svn-src-head mailing list