diff options
author | Poul-Henning Kamp <phk@FreeBSD.org> | 2003-04-21 19:54:11 +0000 |
---|---|---|
committer | Poul-Henning Kamp <phk@FreeBSD.org> | 2003-04-21 19:54:11 +0000 |
commit | 666223979c3c8cb7bf980aab90e4dc71b800a36e (patch) | |
tree | 7435ad476a64c53a84694abb56322626d214aa9a /sys/geom/geom_sunlabel.c | |
parent | 9bd6be665d5dd7b816d136280906cb8f26408b81 (diff) |
Update GEOM::SUN to use the decoding functions in geom_sunlabel_enc.c
and #defines from sys/sun_disklabel.h.
Notes
Notes:
svn path=/head/; revision=113819
Diffstat (limited to 'sys/geom/geom_sunlabel.c')
-rw-r--r-- | sys/geom/geom_sunlabel.c | 61 |
1 files changed, 16 insertions, 45 deletions
diff --git a/sys/geom/geom_sunlabel.c b/sys/geom/geom_sunlabel.c index 8c2d5ac032e4..f7a66676c46b 100644 --- a/sys/geom/geom_sunlabel.c +++ b/sys/geom/geom_sunlabel.c @@ -45,6 +45,7 @@ #include <sys/malloc.h> #include <sys/lock.h> #include <sys/mutex.h> +#include <sys/sun_disklabel.h> #include <geom/geom.h> #include <geom/geom_slice.h> #include <machine/endian.h> @@ -63,23 +64,17 @@ g_sunlabel_modify(struct g_geom *gp, struct g_sunlabel_softc *ms, u_char *sec0) { int i, error; u_int u, v, csize; + struct sun_disklabel sl; - /* The second last short is a magic number */ - if (be16dec(sec0 + 508) != 0xdabe) - return (EBUSY); + error = sunlabel_dec(sec0, &sl); + if (error) + return (error); - /* The shortword parity of the entire thing must be even */ - u = 0; - for (i = 0; i < 512; i += 2) - u ^= be16dec(sec0 + i); - if (u != 0) - return(EBUSY); + csize = sl.sl_ntracks * sl.sl_nsectors; - csize = be16dec(sec0 + 436) * be16dec(sec0 + 438); - - for (i = 0; i < 8; i++) { - v = be32dec(sec0 + 444 + i * 8); - u = be32dec(sec0 + 448 + i * 8); + for (i = 0; i < SUN_NPART; i++) { + v = sl.sl_part[i].sdkp_cyloffset; + u = sl.sl_part[i].sdkp_nsectors; g_topology_lock(); error = g_slice_config(gp, i, G_SLICE_CONFIG_CHECK, ((off_t)v * csize) << 9ULL, @@ -90,9 +85,9 @@ g_sunlabel_modify(struct g_geom *gp, struct g_sunlabel_softc *ms, u_char *sec0) if (error) return (error); } - for (i = 0; i < 8; i++) { - v = be32dec(sec0 + 444 + i * 8); - u = be32dec(sec0 + 448 + i * 8); + for (i = 0; i < SUN_NPART; i++) { + v = sl.sl_part[i].sdkp_cyloffset; + u = sl.sl_part[i].sdkp_nsectors; g_topology_lock(); g_slice_config(gp, i, G_SLICE_CONFIG_SET, ((off_t)v * csize) << 9ULL, @@ -101,9 +96,9 @@ g_sunlabel_modify(struct g_geom *gp, struct g_sunlabel_softc *ms, u_char *sec0) "%s%c", gp->name, 'a' + i); g_topology_unlock(); } - ms->nalt = be16dec(sec0 + 434); - ms->nheads = be16dec(sec0 + 436); - ms->nsects = be16dec(sec0 + 438); + ms->nalt = sl.sl_acylinders; + ms->nheads = sl.sl_ntracks; + ms->nsects = sl.sl_nsectors; return (0); } @@ -141,7 +136,7 @@ g_sunlabel_taste(struct g_class *mp, struct g_provider *pp, int flags) { struct g_geom *gp; struct g_consumer *cp; - int error, i, npart; + int error, npart; u_char *buf; struct g_sunlabel_softc *ms; off_t mediasize; @@ -169,30 +164,6 @@ g_sunlabel_taste(struct g_class *mp, struct g_provider *pp, int flags) buf = g_read_data(cp, 0, ms->sectorsize, &error); if (buf == NULL || error != 0) break; - - if (bootverbose) { - g_hexdump(buf, 128); - for (i = 0; i < 8; i++) { - printf("part %d %u %u\n", i, - be32dec(buf + 444 + i * 8), - be32dec(buf + 448 + i * 8)); - } - printf("v_version = %d\n", be32dec(buf + 128)); - printf("v_nparts = %d\n", be16dec(buf + 140)); - for (i = 0; i < 8; i++) { - printf("v_part[%d] = %d %d\n", - i, be16dec(buf + 142 + i * 4), - be16dec(buf + 144 + i * 4)); - } - printf("v_sanity %x\n", be32dec(buf + 186)); - printf("v_version = %d\n", be32dec(buf + 128)); - printf("v_rpm %d\n", be16dec(buf + 420)); - printf("v_totalcyl %d\n", be16dec(buf + 422)); - printf("v_cyl %d\n", be16dec(buf + 432)); - printf("v_alt %d\n", be16dec(buf + 434)); - printf("v_head %d\n", be16dec(buf + 436)); - printf("v_sec %d\n", be16dec(buf + 438)); - } g_sunlabel_modify(gp, ms, buf); |