path: root/sbin/bsdlabel/bsdlabel.c
diff options
authorMaxim Sobolev <sobomax@FreeBSD.org>2011-12-31 00:09:33 +0000
committerMaxim Sobolev <sobomax@FreeBSD.org>2011-12-31 00:09:33 +0000
commit3fd209e4f2df851fbeb3c74c0dc0bc921bf67b36 (patch)
tree51f4117a2870ea35cfc767f78f1fa47a23c64293 /sbin/bsdlabel/bsdlabel.c
parent0f1999cddff8cfccaa0388fd750bc044c0ba0d30 (diff)
Use in-label sectorsize to determine position of the label when
writing label into a file image. The most common use - putting disklabel into ISO file. Before this change the label would always go to the offset 512, while geom_part code expects it to be in the 1st sector (i.e. 2048 incase of ISO). BSD disklabels provide good and lightweight way to logically split livecds. It is non-intrusive as far as ISO9660 goes (both boot-wise and metadata-wise) and completely transparent to anything but BSD, so you can have BSD-specific area appended after regular ISO. And with a little bit of GEOM trickery you can do even more interesting stuff with it. For example we make "hybrid" bootable CDs using this method. We create bootable ISO with kernel and such and append UFS image compressed with UZIP and it works like a charm. We put label based on the offsef of the BSD part into the ISO. The kernel boots off normal ISO9660 part, tastes label attaches it, tastes UZIP, attaches it and finally mounts UFS using GEOM_LABEL. This provides much better way of eliminating waste than doing "crunched" build. MFC after: 1 month
Notes: svn path=/head/; revision=229049
Diffstat (limited to 'sbin/bsdlabel/bsdlabel.c')
1 files changed, 2 insertions, 2 deletions
diff --git a/sbin/bsdlabel/bsdlabel.c b/sbin/bsdlabel/bsdlabel.c
index 7be9db2807ea..2dcffd0a752b 100644
--- a/sbin/bsdlabel/bsdlabel.c
+++ b/sbin/bsdlabel/bsdlabel.c
@@ -400,7 +400,7 @@ writelabel(void)
for (i = 0; i < lab.d_npartitions; i++)
if (lab.d_partitions[i].p_size)
lab.d_partitions[i].p_offset += lba_offset;
- bsd_disklabel_le_enc(bootarea + labeloffset + labelsoffset * secsize,
+ bsd_disklabel_le_enc(bootarea + labeloffset + labelsoffset * lab.d_secsize,
fd = open(specname, O_RDWR);
@@ -434,7 +434,7 @@ writelabel(void)
gctl_ro_param(grq, "class", -1, "BSD");
gctl_ro_param(grq, "geom", -1, pname);
gctl_ro_param(grq, "label", 148+16*8,
- bootarea + labeloffset + labelsoffset * secsize);
+ bootarea + labeloffset + labelsoffset * lab.d_secsize);
errstr = gctl_issue(grq);
if (errstr != NULL) {
warnx("%s", errstr);