--- src/sys/sys/disklabel.h 2007/06/17 23:50:12 1.26 +++ src/sys/sys/disklabel.h 2007/06/18 05:13:42 1.27 @@ -1,39 +1,41 @@ /* - * Copyright (c) 1987, 1988, 1993 - * The Regents of the University of California. All rights reserved. - * + * Copyright (c) 2007 The DragonFly Project. All rights reserved. + * + * This code is derived from software contributed to The DragonFly Project + * by Matthew Dillon + * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: + * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name of The DragonFly Project nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific, prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. - * - * @(#)disklabel.h 8.2 (Berkeley) 7/10/94 - * $FreeBSD: src/sys/sys/disklabel.h,v 1.49.2.7 2001/05/27 05:58:26 jkh Exp $ + * * $DragonFly$ */ +/* + * Disklabel abstraction + */ #ifndef _SYS_DISKLABEL_H_ #define _SYS_DISKLABEL_H_ @@ -41,177 +43,50 @@ #ifndef _SYS_TYPES_H_ #include #endif -#if defined(_KERNEL) && !defined(_SYS_SYSTM_H_) -#include -#endif -#ifndef _SYS_IOCCOM_H_ -#include +#ifndef _SYS_UUID_H_ +#include #endif -/* - * Each disk has a label which includes information about the hardware - * disk geometry, filesystem partitions, and drive specific information. - * The label is in block 0 or 1, possibly offset from the beginning - * to leave room for a bootstrap, etc. - */ - -/* XXX these should be defined per controller (or drive) elsewhere, not here! */ -#ifdef __i386__ -#define LABELSECTOR 1 /* sector containing label */ -#define LABELOFFSET 0 /* offset of label in sector */ -#endif - -#define DISKMAGIC ((u_int32_t)0x82564557) /* The disk magic number */ -#ifndef MAXPARTITIONS -#define MAXPARTITIONS 16 -#endif - -#define LABEL_PART 2 /* partition containing label */ -#define RAW_PART 2 /* partition containing whole disk */ -#define SWAP_PART 1 /* partition normally containing swap */ - -#ifndef LOCORE -struct disklabel { - u_int32_t d_magic; /* the magic number */ - u_int16_t d_type; /* drive type */ - u_int16_t d_subtype; /* controller/d_type specific */ - char d_typename[16]; /* type name, e.g. "eagle" */ - - char d_packname[16]; /* pack identifier */ - - /* disk geometry: */ - u_int32_t d_secsize; /* # of bytes per sector */ - u_int32_t d_nsectors; /* # of data sectors per track */ - u_int32_t d_ntracks; /* # of tracks per cylinder */ - u_int32_t d_ncylinders; /* # of data cylinders per unit */ - u_int32_t d_secpercyl; /* # of data sectors per cylinder */ - u_int32_t d_secperunit; /* # of data sectors per unit */ - - /* - * Spares (bad sector replacements) below are not counted in - * d_nsectors or d_secpercyl. Spare sectors are assumed to - * be physical sectors which occupy space at the end of each - * track and/or cylinder. - */ - u_int16_t d_sparespertrack; /* # of spare sectors per track */ - u_int16_t d_sparespercyl; /* # of spare sectors per cylinder */ - /* - * Alternate cylinders include maintenance, replacement, configuration - * description areas, etc. - */ - u_int32_t d_acylinders; /* # of alt. cylinders per unit */ - - /* hardware characteristics: */ - /* - * d_interleave, d_trackskew and d_cylskew describe perturbations - * in the media format used to compensate for a slow controller. - * Interleave is physical sector interleave, set up by the - * formatter or controller when formatting. When interleaving is - * in use, logically adjacent sectors are not physically - * contiguous, but instead are separated by some number of - * sectors. It is specified as the ratio of physical sectors - * traversed per logical sector. Thus an interleave of 1:1 - * implies contiguous layout, while 2:1 implies that logical - * sector 0 is separated by one sector from logical sector 1. - * d_trackskew is the offset of sector 0 on track N relative to - * sector 0 on track N-1 on the same cylinder. Finally, d_cylskew - * is the offset of sector 0 on cylinder N relative to sector 0 - * on cylinder N-1. - */ - u_int16_t d_rpm; /* rotational speed */ - u_int16_t d_interleave; /* hardware sector interleave */ - u_int16_t d_trackskew; /* sector 0 skew, per track */ - u_int16_t d_cylskew; /* sector 0 skew, per cylinder */ - u_int32_t d_headswitch; /* head switch time, usec */ - u_int32_t d_trkseek; /* track-to-track seek, usec */ - u_int32_t d_flags; /* generic flags (now unused) */ -#define NDDATA 5 - u_int32_t d_drivedata[NDDATA]; /* drive-type specific information */ -#define NSPARE 5 - u_int32_t d_spare[NSPARE]; /* reserved for future use */ - u_int32_t d_magic2; /* the magic number (again) */ - u_int16_t d_checksum; /* xor of data incl. partitions */ - - /* filesystem and partition information: */ - u_int16_t d_npartitions; /* number of partitions in following */ - u_int32_t d_bbsize; /* size of boot area at sn0, bytes */ - u_int32_t d_sbsize; /* max size of fs superblock, bytes */ - struct partition { /* the partition table */ - u_int32_t p_size; /* number of sectors in partition */ - u_int32_t p_offset; /* starting sector */ - u_int32_t p_fsize; /* filesystem basic fragment size */ - u_int8_t p_fstype; /* filesystem type, see below */ - u_int8_t p_frag; /* filesystem fragments per block */ - union { - u_int16_t cpg; /* UFS: FS cylinders per group */ - u_int16_t sgs; /* LFS: FS segment shift */ - } __partition_u1; -#define p_cpg __partition_u1.cpg -#define p_sgs __partition_u1.sgs - } d_partitions[MAXPARTITIONS]; /* actually may be more */ -}; +struct disklabel32; +struct disklabel64; -static u_int16_t dkcksum(struct disklabel *lp); - -static __inline u_int16_t -dkcksum(struct disklabel *lp) -{ - u_int16_t *start, *end; - u_int16_t sum = 0; - - start = (u_int16_t *)lp; - end = (u_int16_t *)&lp->d_partitions[lp->d_npartitions]; - while (start < end) - sum ^= *start++; - return (sum); -} - -#else /* LOCORE */ - /* - * offsets for asm boot files. - */ - .set d_secsize,40 - .set d_nsectors,44 - .set d_ntracks,48 - .set d_ncylinders,52 - .set d_secpercyl,56 - .set d_secperunit,60 - .set d_end_,276 /* size of disk label */ -#endif /* LOCORE */ - -#ifndef LOCORE - -/* - * Disk-specific ioctls. - */ -#define DIOCGDINFO _IOR('d', 101, struct disklabel)/* get */ -#define DIOCSDINFO _IOW('d', 102, struct disklabel)/* set */ -#define DIOCWDINFO _IOW('d', 103, struct disklabel)/* set, update disk */ -#define DIOCGDVIRGIN _IOR('d', 105, struct disklabel) /* get virgin label */ - -#ifdef _KERNEL +typedef union abstracted_disklabel { + void *opaque; + struct disklabel32 *lab32; + struct disklabel64 *lab64; +} disklabel_t; +struct cdev; struct diskslice; struct diskslices; struct disk_info; -char *readdisklabel (cdev_t dev, struct disklabel *lp); -int setdisklabel (struct disklabel *olp, struct disklabel *nlp, - struct diskslice *sp, u_int32_t *openmask); -int writedisklabel (cdev_t dev, struct disklabel *lp); -struct disklabel *clone_label(struct disk_info *info, struct diskslice *sp); -char *fixlabel(const char *sname, struct diskslice *sp, - struct disklabel *lp, int writeflag); -void adjust_label_reserved(struct diskslices *ssp, int slice, struct diskslice *sp); -int getpartbounds(struct disklabel *lp, u_int32_t part, - u_int64_t *start, u_int64_t *blocks); -int getpartfstype(struct disklabel *lp, u_int32_t part); -u_int32_t getnumparts(struct disklabel *lp); -void makevirginlabel(struct disklabel *lp, struct diskslices *ssp, - struct diskslice *sp, struct disk_info *info); - -#endif /* _KERNEL */ - -#endif /* LOCORE */ +struct disklabel_ops { + struct uuid type; /* uuid specifies disklabel type */ + int labelsect; + int labelsize; /* size of disklabel in bytes */ + + const char *(*op_readdisklabel) + (struct cdev *, struct diskslice *, disklabel_t *, + struct disk_info *); + int (*op_setdisklabel) + (disklabel_t, disklabel_t, struct diskslice *, u_int32_t *); + int (*op_writedisklabel) + (struct cdev *, struct diskslice *, disklabel_t); + disklabel_t (*op_clone_label) + (struct disk_info *, struct diskslice *); + void (*op_adjust_label_reserved) + (struct diskslices *, int, struct diskslice *); + int (*op_getpartbounds) + (disklabel_t, u_int32_t, u_int64_t *, u_int64_t *); + int (*op_getpartfstype) + (disklabel_t, u_int32_t); + u_int32_t (*op_getnumparts) + (disklabel_t); + void (*op_makevirginlabel) + (disklabel_t, struct diskslices *, + struct diskslice *, struct disk_info *); +}; #endif /* !_SYS_DISKLABEL_H_ */ +