Initial Linux ZFS GIT Repo
[zfs.git] / zfs / lib / libsolcompat / include / sys / vtoc.h
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License, Version 1.0 only
6  * (the "License").  You may not use this file except in compliance
7  * with the License.
8  *
9  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10  * or http://www.opensolaris.org/os/licensing.
11  * See the License for the specific language governing permissions
12  * and limitations under the License.
13  *
14  * When distributing Covered Code, include this CDDL HEADER in each
15  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16  * If applicable, add the following below this CDDL HEADER, with the
17  * fields enclosed by brackets "[]" replaced with your own identifying
18  * information: Portions Copyright [yyyy] [name of copyright owner]
19  *
20  * CDDL HEADER END
21  */
22 /*
23  * Copyright 1997-1998,2002 Sun Microsystems, Inc.  All rights reserved.
24  * Use is subject to license terms.
25  */
26
27
28 /*      Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
29 /*        All Rights Reserved   */
30
31
32 #ifndef _SYS_VTOC_H
33 #define _SYS_VTOC_H
34
35
36
37 #include <sys/dklabel.h>
38
39 #ifdef  __cplusplus
40 extern "C" {
41 #endif
42
43 /*
44  *      Note:  the VTOC is not implemented fully, nor in the manner
45  *      that AT&T implements it.  AT&T puts the vtoc structure
46  *      into a sector, usually the second sector (pdsector is first).
47  *
48  *      Sun incorporates the tag, flag, version, and volume vtoc fields into
49  *      its Disk Label, which already has some vtoc-equivalent fields.
50  *      Upon reading the vtoc with read_vtoc(), the following exceptions
51  *      occur:
52  *              v_bootinfo [all]        returned as zero
53  *              v_sanity                returned as VTOC_SANE
54  *                                              if Disk Label was sane
55  *              v_sectorsz              returned as 512
56  *              v_reserved [all]        retunred as zero
57  *              timestamp [all]         returned as zero
58  *
59  *      See  dklabel.h, read_vtoc(), and write_vtoc().
60  */
61
62 #define V_NUMPAR        NDKMAP          /* The number of partitions */
63                                         /* (from dkio.h) */
64
65 #define VTOC_SANE       0x600DDEEE      /* Indicates a sane VTOC */
66 #define V_VERSION       0x01            /* layout version number */
67
68 /*
69  * Partition identification tags
70  */
71 #define V_UNASSIGNED    0x00            /* unassigned partition */
72 #define V_BOOT          0x01            /* Boot partition */
73 #define V_ROOT          0x02            /* Root filesystem */
74 #define V_SWAP          0x03            /* Swap filesystem */
75 #define V_USR           0x04            /* Usr filesystem */
76 #define V_BACKUP        0x05            /* full disk */
77 #define V_STAND         0x06            /* Stand partition */
78 #define V_VAR           0x07            /* Var partition */
79 #define V_HOME          0x08            /* Home partition */
80 #define V_ALTSCTR       0x09            /* Alternate sector partition */
81 #define V_CACHE         0x0a            /* Cache (cachefs) partition */
82 #define V_RESERVED      0x0b            /* SMI reserved data */
83
84 /*
85  * Partition permission flags
86  */
87 #define V_UNMNT         0x01            /* Unmountable partition */
88 #define V_RONLY         0x10            /* Read only */
89
90 /*
91  * error codes for reading & writing vtoc
92  */
93 #define VT_ERROR        (-2)            /* errno supplies specific error */
94 #define VT_EIO          (-3)            /* I/O error accessing vtoc */
95 #define VT_EINVAL       (-4)            /* illegal value in vtoc or request */
96 #define VT_ENOTSUP      (-5)            /* VTOC op. not supported */
97
98 struct partition        {
99         ushort_t p_tag;                 /* ID tag of partition */
100         ushort_t p_flag;                        /* permision flags */
101         daddr_t p_start;                /* start sector no of partition */
102         long    p_size;                 /* # of blocks in partition */
103 };
104
105 struct vtoc {
106         unsigned long   v_bootinfo[3];  /* info needed by mboot (unsupported) */
107         unsigned long   v_sanity;       /* to verify vtoc sanity */
108         unsigned long   v_version;      /* layout version */
109         char    v_volume[LEN_DKL_VVOL]; /* volume name */
110         ushort_t        v_sectorsz;     /* sector size in bytes */
111         ushort_t        v_nparts;       /* number of partitions */
112         unsigned long   v_reserved[10]; /* free space */
113         struct partition v_part[V_NUMPAR]; /* partition headers */
114         time_t  timestamp[V_NUMPAR];    /* partition timestamp (unsupported) */
115         char    v_asciilabel[LEN_DKL_ASCII];    /* for compatibility */
116 };
117
118 #if defined(_SYSCALL32)
119 struct partition32      {
120         uint16_t        p_tag;          /* ID tag of partition */
121         uint16_t        p_flag;         /* permision flags */
122         daddr32_t       p_start;        /* start sector no of partition */
123         int32_t         p_size;         /* # of blocks in partition */
124 };
125
126 struct vtoc32 {
127         uint32_t        v_bootinfo[3];  /* info needed by mboot (unsupported) */
128         uint32_t        v_sanity;       /* to verify vtoc sanity */
129         uint32_t        v_version;      /* layout version */
130         char    v_volume[LEN_DKL_VVOL]; /* volume name */
131         uint16_t        v_sectorsz;     /* sector size in bytes */
132         uint16_t        v_nparts;       /* number of partitions */
133         uint32_t        v_reserved[10]; /* free space */
134         struct partition32 v_part[V_NUMPAR]; /* partition headers */
135         time32_t timestamp[V_NUMPAR];   /* partition timestamp (unsupported) */
136         char    v_asciilabel[LEN_DKL_ASCII];    /* for compatibility */
137 };
138
139 #define vtoc32tovtoc(v32, v)                            \
140         {                                               \
141         int i;                                          \
142         v.v_bootinfo[0]         = v32.v_bootinfo[0];    \
143         v.v_bootinfo[1]         = v32.v_bootinfo[1];    \
144         v.v_bootinfo[2]         = v32.v_bootinfo[2];    \
145         v.v_sanity              = v32.v_sanity;         \
146         v.v_version             = v32.v_version;        \
147         bcopy(v32.v_volume, v.v_volume, LEN_DKL_VVOL);  \
148         v.v_sectorsz            = v32.v_sectorsz;       \
149         v.v_nparts              = v32.v_nparts;         \
150         v.v_version             = v32.v_version;        \
151         for (i = 0; i < 10; i++)                        \
152                 v.v_reserved[i] = v32.v_reserved[i];    \
153         for (i = 0; i < V_NUMPAR; i++) {                \
154                 v.v_part[i].p_tag = (ushort_t)v32.v_part[i].p_tag;      \
155                 v.v_part[i].p_flag = (ushort_t)v32.v_part[i].p_flag;    \
156                 v.v_part[i].p_start = (daddr_t)v32.v_part[i].p_start;   \
157                 v.v_part[i].p_size = (long)v32.v_part[i].p_size;        \
158         }                                               \
159         for (i = 0; i < V_NUMPAR; i++)                  \
160                 v.timestamp[i] = (time_t)v32.timestamp[i];              \
161         bcopy(v32.v_asciilabel, v.v_asciilabel, LEN_DKL_ASCII);         \
162         }
163
164 #define vtoctovtoc32(v, v32)                            \
165         {                                               \
166         int i;                                          \
167         v32.v_bootinfo[0]       = v.v_bootinfo[0];      \
168         v32.v_bootinfo[1]       = v.v_bootinfo[1];      \
169         v32.v_bootinfo[2]       = v.v_bootinfo[2];      \
170         v32.v_sanity            = v.v_sanity;           \
171         v32.v_version           = v.v_version;          \
172         bcopy(v.v_volume, v32.v_volume, LEN_DKL_VVOL);  \
173         v32.v_sectorsz          = v.v_sectorsz;         \
174         v32.v_nparts            = v.v_nparts;           \
175         v32.v_version           = v.v_version;          \
176         for (i = 0; i < 10; i++)                        \
177                 v32.v_reserved[i] = v.v_reserved[i];    \
178         for (i = 0; i < V_NUMPAR; i++) {                \
179                 v32.v_part[i].p_tag = (ushort_t)v.v_part[i].p_tag;      \
180                 v32.v_part[i].p_flag = (ushort_t)v.v_part[i].p_flag;    \
181                 v32.v_part[i].p_start = (daddr32_t)v.v_part[i].p_start; \
182                 v32.v_part[i].p_size = (int32_t)v.v_part[i].p_size;     \
183         }                                               \
184         for (i = 0; i < V_NUMPAR; i++) {                \
185                 if (v.timestamp[i] > TIME32_MAX)        \
186                         v32.timestamp[i] = TIME32_MAX;  \
187                 else                                    \
188                         v32.timestamp[i] = (time32_t)v.timestamp[i];    \
189         }                                               \
190         bcopy(v.v_asciilabel, v32.v_asciilabel, LEN_DKL_ASCII);         \
191         }
192
193 #endif /* _SYSCALL32 */
194
195 /*
196  * These defines are the mode parameter for the checksum routines.
197  */
198 #define CK_CHECKSUM     0       /* check checksum */
199 #define CK_MAKESUM      1       /* generate checksum */
200
201 #if defined(__STDC__)
202
203 extern  int     read_vtoc(int, struct vtoc *);
204 extern  int     write_vtoc(int, struct vtoc *);
205
206 #else
207
208 extern  int     read_vtoc();
209 extern  int     write_vtoc();
210
211 #endif  /* __STDC__ */
212
213 #ifdef  __cplusplus
214 }
215 #endif
216
217 #endif  /* _SYS_VTOC_H */