* Copyright (c) 1992 The Regents of the University of California.
* This software was developed by the Computer Systems Engineering group
* at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and
* contributed to Berkeley.
* %sccs.include.redist.c%
* @(#)sun_disklabel.c 7.1 (Berkeley) %G%
* from: $Header: sun_disklabel.c,v 1.5 92/06/17 07:04:12 torek Exp $
#include "sys/disklabel.h"
#include "sun_disklabel.h"
* Take a sector (cp) containing a SunOS disk label and set lp to a BSD
register struct disklabel
*lp
;
register struct sun_disklabel
*sl
;
sp
= (u_short
*)(cp
+ sizeof(struct sun_disklabel
));
while (sp
>= (u_short
*)cp
)
sl
= (struct sun_disklabel
*)cp
;
lp
->d_magic
= 0; /* denote as pseudo */
lp
->d_ncylinders
= sl
->sl_ncylinders
;
lp
->d_acylinders
= sl
->sl_acylinders
;
v
= (lp
->d_ntracks
= sl
->sl_ntracks
) *
(lp
->d_nsectors
= sl
->sl_nsectors
);
for (i
= 0; i
< 8; i
++) {
lp
->d_partitions
[i
].p_offset
=
sl
->sl_part
[i
].sdkp_cyloffset
* v
;
lp
->d_partitions
[i
].p_size
= sl
->sl_part
[i
].sdkp_nsectors
;
sun_dkioctl(dk
, cmd
, data
, partition
)
register struct partition
*p
;
#define geom ((struct sun_dkgeom *)data)
bzero(data
, sizeof(*geom
));
geom
->sdkc_ncylinders
= dk
->dk_label
.d_ncylinders
;
geom
->sdkc_acylinders
= dk
->dk_label
.d_acylinders
;
geom
->sdkc_ntracks
= dk
->dk_label
.d_ntracks
;
geom
->sdkc_nsectors
= dk
->dk_label
.d_nsectors
;
geom
->sdkc_interleave
= dk
->dk_label
.d_interleave
;
geom
->sdkc_sparespercyl
= dk
->dk_label
.d_sparespercyl
;
geom
->sdkc_rpm
= dk
->dk_label
.d_rpm
;
dk
->dk_label
.d_ncylinders
+ dk
->dk_label
.d_acylinders
;
/* Homey don't do DKIOCINFO */
bzero(data
, sizeof(struct sun_dkctlr
));
if (dk
->dk_label
.d_secpercyl
== 0)
return (ERANGE
); /* XXX */
p
= &dk
->dk_label
.d_partitions
[partition
];
if (p
->p_offset
% dk
->dk_label
.d_secpercyl
!= 0)
return (ERANGE
); /* XXX */
#define part ((struct sun_dkpart *)data)
part
->sdkp_cyloffset
= p
->p_offset
/ dk
->dk_label
.d_secpercyl
;
part
->sdkp_nsectors
= p
->p_size
;