1 | /*␊ |
2 | * Copyright (c) 2003 Apple Computer, Inc. All rights reserved.␊ |
3 | *␊ |
4 | * Copyright (c) 1999-2003 Apple Computer, Inc. All Rights Reserved.␊ |
5 | * ␊ |
6 | * This file contains Original Code and/or Modifications of Original Code␊ |
7 | * as defined in and that are subject to the Apple Public Source License␊ |
8 | * Version 2.0 (the 'License'). You may not use this file except in␊ |
9 | * compliance with the License. Please obtain a copy of the License at␊ |
10 | * http://www.opensource.apple.com/apsl/ and read it before using this␊ |
11 | * file.␊ |
12 | * ␊ |
13 | * The Original Code and all software distributed under the License are␊ |
14 | * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER␊ |
15 | * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,␊ |
16 | * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,␊ |
17 | * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.␊ |
18 | * Please see the License for the specific language governing rights and␊ |
19 | * limitations under the License.␊ |
20 | * ␊ |
21 | *␉$NetBSD: ntfs.h,v 1.9 1999/10/31 19:45:26 jdolecek Exp $␊ |
22 | *␊ |
23 | * Copyright (c) 1998, 1999 Semen Ustimenko␊ |
24 | * All rights reserved.␊ |
25 | *␊ |
26 | * Redistribution and use in source and binary forms, with or without␊ |
27 | * modification, are permitted provided that the following conditions␊ |
28 | * are met:␊ |
29 | * 1. Redistributions of source code must retain the above copyright␊ |
30 | * notice, this list of conditions and the following disclaimer.␊ |
31 | * 2. Redistributions in binary form must reproduce the above copyright␊ |
32 | * notice, this list of conditions and the following disclaimer in the␊ |
33 | * documentation and/or other materials provided with the distribution.␊ |
34 | *␊ |
35 | * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND␊ |
36 | * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE␊ |
37 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE␊ |
38 | * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE␊ |
39 | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL␊ |
40 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS␊ |
41 | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)␊ |
42 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT␊ |
43 | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY␊ |
44 | * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF␊ |
45 | * SUCH DAMAGE.␊ |
46 | *␊ |
47 | * $FreeBSD: src/sys/fs/ntfs/ntfs.h,v 1.14 2001/11/27 00:18:33 jhb Exp $␊ |
48 | */␊ |
49 | ␊ |
50 | /*#define NTFS_DEBUG 1*/␊ |
51 | ␊ |
52 | #ifdef APPLE␊ |
53 | /* We're using FreeBSD style byte order macros in the source. */␊ |
54 | #include <libkern/OSByteOrder.h>␊ |
55 | #define le16toh(x)␉␉OSSwapLittleToHostInt16(x)␊ |
56 | #define le32toh(x)␉␉OSSwapLittleToHostInt32(x)␊ |
57 | #define le64toh(x)␉␉OSSwapLittleToHostInt64(x)␊ |
58 | ␊ |
59 | /* FreeBSD mutexes correspond to Darwin's simple locks */␊ |
60 | #define mtx_lock(lock)␉␉simple_lock(lock)␊ |
61 | #define mtx_unlock(lock)␉simple_unlock(lock)␊ |
62 | #define mtx_destroy(lock)␉/* Nothing. */␊ |
63 | ␊ |
64 | #define lockdestroy(lock)␉/* Nothing. */␊ |
65 | ␊ |
66 | #endif␊ |
67 | ␊ |
68 | typedef u_int64_t cn_t;␊ |
69 | typedef u_int16_t wchar;␊ |
70 | ␊ |
71 | #pragma pack(1)␊ |
72 | #define BBSIZE␉␉␉1024␊ |
73 | #define␉BBOFF␉␉␉((off_t)(0))␊ |
74 | #define␉BBLOCK␉␉␉((daddr_t)(0))␊ |
75 | #define␉NTFS_MFTINO␉␉0␊ |
76 | #define␉NTFS_VOLUMEINO␉␉3␊ |
77 | #define␉NTFS_ATTRDEFINO␉␉4␊ |
78 | #define␉NTFS_ROOTINO␉␉5␊ |
79 | #define␉NTFS_BITMAPINO␉␉6␊ |
80 | #define␉NTFS_BOOTINO␉␉7␊ |
81 | #define␉NTFS_BADCLUSINO␉␉8␊ |
82 | #define␉NTFS_UPCASEINO␉␉10␊ |
83 | #define NTFS_MAXFILENAME␉255␊ |
84 | ␊ |
85 | struct fixuphdr {␊ |
86 | ␉u_int32_t fh_magic;␊ |
87 | ␉u_int16_t fh_foff;␊ |
88 | ␉u_int16_t fh_fnum;␊ |
89 | };␊ |
90 | ␊ |
91 | #define NTFS_AF_INRUN␉0x00000001␊ |
92 | struct attrhdr {␊ |
93 | ␉u_int32_t a_type;␊ |
94 | ␉u_int32_t reclen;␊ |
95 | ␉u_int8_t a_flag;␊ |
96 | ␉u_int8_t a_namelen;␊ |
97 | ␉u_int8_t a_nameoff;␊ |
98 | ␉u_int8_t reserved1;␊ |
99 | ␉u_int8_t a_compression;␊ |
100 | ␉u_int8_t reserved2;␊ |
101 | ␉u_int16_t a_index;␊ |
102 | };␊ |
103 | #define NTFS_A_STD␉0x10␊ |
104 | #define NTFS_A_ATTRLIST␉0x20␊ |
105 | #define NTFS_A_NAME␉0x30␊ |
106 | #define NTFS_A_VOLUMENAME␉0x60␊ |
107 | #define NTFS_A_DATA␉0x80␊ |
108 | #define␉NTFS_A_INDXROOT␉0x90␊ |
109 | #define␉NTFS_A_INDX␉0xA0␊ |
110 | #define NTFS_A_INDXBITMAP 0xB0␊ |
111 | ␊ |
112 | #define NTFS_MAXATTRNAME␉255␊ |
113 | struct attr {␊ |
114 | ␉struct attrhdr a_hdr;␊ |
115 | ␉union {␊ |
116 | ␉␉struct {␊ |
117 | ␉␉␉u_int16_t a_datalen;␊ |
118 | ␉␉␉u_int16_t reserved1;␊ |
119 | ␉␉␉u_int16_t a_dataoff;␊ |
120 | ␉␉␉u_int16_t a_indexed;␊ |
121 | ␉␉} a_S_r;␊ |
122 | ␉␉struct {␊ |
123 | ␉␉␉cn_t a_vcnstart;␊ |
124 | ␉␉␉cn_t a_vcnend;␊ |
125 | ␉␉␉u_int16_t a_dataoff;␊ |
126 | ␉␉␉u_int16_t a_compressalg;␊ |
127 | ␉␉␉u_int32_t reserved1;␊ |
128 | ␉␉␉u_int64_t a_allocated;␊ |
129 | ␉␉␉u_int64_t a_datalen;␊ |
130 | ␉␉␉u_int64_t a_initialized;␊ |
131 | ␉␉} a_S_nr;␊ |
132 | ␉} a_S;␊ |
133 | };␊ |
134 | #define a_r␉a_S.a_S_r␊ |
135 | #define a_nr␉a_S.a_S_nr␊ |
136 | ␊ |
137 | typedef struct {␊ |
138 | ␉u_int64_t t_create;␊ |
139 | ␉u_int64_t t_write;␊ |
140 | ␉u_int64_t t_mftwrite;␊ |
141 | ␉u_int64_t t_access;␊ |
142 | } ntfs_times_t;␊ |
143 | ␊ |
144 | #define NTFS_FFLAG_RDONLY␉0x01LL␊ |
145 | #define NTFS_FFLAG_HIDDEN␉0x02LL␊ |
146 | #define NTFS_FFLAG_SYSTEM␉0x04LL␊ |
147 | #define NTFS_FFLAG_ARCHIVE␉0x20LL␊ |
148 | #define NTFS_FFLAG_COMPRESSED␉0x0800LL␊ |
149 | #define NTFS_FFLAG_DIR␉␉0x10000000LL␊ |
150 | ␊ |
151 | struct attr_name {␊ |
152 | ␉u_int32_t␉n_pnumber;␉/* Parent ntnode */␊ |
153 | ␉u_int32_t reserved;␊ |
154 | ␉ntfs_times_t n_times;␊ |
155 | ␉u_int64_t n_size;␊ |
156 | ␉u_int64_t n_attrsz;␊ |
157 | ␉u_int64_t n_flag;␊ |
158 | ␉u_int8_t n_namelen;␊ |
159 | ␉u_int8_t n_nametype;␊ |
160 | ␉u_int16_t n_name[1];␊ |
161 | };␊ |
162 | ␊ |
163 | #define NTFS_IRFLAG_INDXALLOC␉0x00000001␊ |
164 | struct attr_indexroot {␊ |
165 | ␉u_int32_t ir_unkn1;␉/* attribute type (0x30 for $FILE_NAME) */␊ |
166 | ␉u_int32_t ir_unkn2;␉/* collation rule (0x01 for file names) */␊ |
167 | ␉u_int32_t ir_size;␉/* size of index allocation entry */␊ |
168 | ␉u_int32_t ir_unkn3;␉/* clusters per index record, and 3 bytes padding */␊ |
169 | ␉u_int32_t ir_unkn4;␉/* (offset to first index entry?) always 0x10 */␊ |
170 | ␉u_int32_t ir_datalen;␉/* (total size of index enties?) sizeof something */␊ |
171 | ␉u_int32_t ir_allocated;␉/* (allocated size of index entries?) */␊ |
172 | ␉u_int8_t ␉ir_flag;␉/* 1=index allocation needed (large index) */␊ |
173 | u_int8_t␉ir_pad1;␉/* padding */␊ |
174 | ␉u_int16_t ir_pad2;␉/* padding */␊ |
175 | };␊ |
176 | ␊ |
177 | struct attr_attrlist {␊ |
178 | ␉u_int32_t al_type;␉/* Attribute type */␊ |
179 | ␉u_int16_t reclen;␉␉/* length of this entry */␊ |
180 | ␉u_int8_t al_namelen;␉/* Attribute name len */␊ |
181 | ␉u_int8_t al_nameoff;␉/* Name offset from entry start */␊ |
182 | ␉u_int64_t al_vcnstart;␉/* VCN number */␊ |
183 | ␉u_int32_t al_inumber;␉/* Parent ntnode */␊ |
184 | ␉u_int32_t reserved;␊ |
185 | ␉u_int16_t al_index;␉/* Attribute index in MFT record */␊ |
186 | ␉u_int16_t al_name[1];␉/* Name */␊ |
187 | };␊ |
188 | ␊ |
189 | #define␉NTFS_INDXMAGIC␉(u_int32_t)(0x58444E49)␊ |
190 | struct attr_indexalloc {␊ |
191 | ␉struct fixuphdr ia_fixup;␊ |
192 | ␉u_int64_t unknown1;␊ |
193 | ␉cn_t ia_bufcn;␊ |
194 | ␉u_int16_t ia_hdrsize;␊ |
195 | ␉u_int16_t unknown2;␊ |
196 | ␉u_int32_t ia_inuse;␊ |
197 | ␉u_int32_t ia_allocated;␊ |
198 | };␊ |
199 | ␊ |
200 | #define␉NTFS_IEFLAG_SUBNODE␉0x00000001␊ |
201 | #define␉NTFS_IEFLAG_LAST␉0x00000002␊ |
202 | ␊ |
203 | struct attr_indexentry {␊ |
204 | ␉u_int32_t ie_number;␊ |
205 | ␉u_int32_t unknown1;␊ |
206 | ␉u_int16_t reclen;␊ |
207 | ␉u_int16_t ie_size;␊ |
208 | ␉u_int32_t ie_flag;/* 1 - has subnodes, 2 - last */␊ |
209 | ␉u_int32_t ie_fpnumber;␊ |
210 | ␉u_int32_t unknown2;␊ |
211 | ␉ntfs_times_t ie_ftimes;␊ |
212 | ␉u_int64_t ie_fallocated;␊ |
213 | ␉u_int64_t ie_fsize;␊ |
214 | ␉u_int32_t ie_fflag;␊ |
215 | u_int32_t␉unknown3;␉/* used by reparse points and external attributes? */␊ |
216 | ␉u_int8_t ie_fnamelen;␊ |
217 | ␉u_int8_t ie_fnametype;␊ |
218 | ␉wchar ie_fname[NTFS_MAXFILENAME];␊ |
219 | ␉/* cn_t␉␉ie_bufcn;␉ buffer with subnodes */␊ |
220 | };␊ |
221 | ␊ |
222 | #define␉NTFS_FILEMAGIC␉(u_int32_t)(0x454C4946)␊ |
223 | #define␉NTFS_FRFLAG_DIR␉0x0002␊ |
224 | struct filerec {␊ |
225 | ␉struct fixuphdr fr_fixup;␊ |
226 | ␉u_int8_t reserved[8];␊ |
227 | ␉u_int16_t fr_seqnum;␉/* Sequence number */␊ |
228 | ␉u_int16_t fr_nlink;␊ |
229 | ␉u_int16_t fr_attroff;␉/* offset to attributes */␊ |
230 | ␉u_int16_t fr_flags;␉/* 1-nonresident attr, 2-directory */␊ |
231 | ␉u_int32_t fr_size;/* hdr + attributes */␊ |
232 | ␉u_int32_t fr_allocated;␉/* allocated length of record */␊ |
233 | ␉u_int64_t fr_mainrec;␉/* main record */␊ |
234 | ␉u_int16_t fr_attrnum;␉/* maximum attr number + 1 ??? */␊ |
235 | };␊ |
236 | ␊ |
237 | #define␉NTFS_ATTRNAME_MAXLEN␉0x40␊ |
238 | #define␉NTFS_ADFLAG_NONRES␉0x0080␉/* Attrib can be non resident */␊ |
239 | #define␉NTFS_ADFLAG_INDEX␉0x0002␉/* Attrib can be indexed */␊ |
240 | struct attrdef {␊ |
241 | ␉wchar␉␉ad_name[NTFS_ATTRNAME_MAXLEN];␊ |
242 | ␉u_int32_t␉ad_type;␊ |
243 | ␉u_int32_t␉reserved1[2];␊ |
244 | ␉u_int32_t␉ad_flag;␊ |
245 | ␉u_int64_t␉ad_minlen;␊ |
246 | ␉u_int64_t␉ad_maxlen;␉/* -1 for nonlimited */␊ |
247 | };␊ |
248 | ␊ |
249 | struct ntvattrdef {␊ |
250 | ␉char␉␉ad_name[0x40];␊ |
251 | ␉int␉␉ad_namelen;␊ |
252 | ␉u_int32_t␉ad_type;␊ |
253 | };␊ |
254 | ␊ |
255 | #define␉NTFS_BBID␉"NTFS "␊ |
256 | #define␉NTFS_BBIDLEN␉8␊ |
257 | struct bootfile {␊ |
258 | ␉u_int8_t reserved1[3];␉/* asm jmp near ... */␊ |
259 | ␉u_int8_t bf_sysid[8];␉/* 'NTFS ' */␊ |
260 | ␉u_int16_t bf_bps;␉␉/* bytes per sector */␊ |
261 | ␉u_int8_t bf_spc;␉␉/* sectors per cluster */␊ |
262 | ␉u_int8_t reserved2[7];␉/* unused (zeroed) */␊ |
263 | ␉u_int8_t bf_media;␉/* media desc. (0xF8) */␊ |
264 | ␉u_int8_t reserved3[2];␊ |
265 | ␉u_int16_t bf_spt;␉␉/* sectors per track */␊ |
266 | ␉u_int16_t bf_heads;␉/* number of heads */␊ |
267 | ␉u_int8_t reserver4[12];␊ |
268 | ␉u_int64_t bf_spv;␉␉/* sectors per volume */␊ |
269 | ␉cn_t bf_mftcn;␉/* $MFT cluster number */␊ |
270 | ␉cn_t bf_mftmirrcn;␉/* $MFTMirr cn */␊ |
271 | ␉u_int8_t bf_mftrecsz;␉/* MFT record size (clust) */␊ |
272 | ␉␉␉␉␉/* 0xF6 inducates 1/4 */␊ |
273 | u_int8_t reserved5[3];␊ |
274 | ␉u_int8_t bf_ibsz;␉/* index buffer size */␊ |
275 | u_int8_t reserved6[3];␊ |
276 | ␉u_int64_t bf_volsn;␉/* volume ser. num. */␊ |
277 | };␊ |
278 | ␊ |
279 | /*␊ |
280 | * Darwin's ntfs.util needs to include this file to get definitions␊ |
281 | * for the on-disk structures. It doesn't need the ntfsmount structure.␊ |
282 | * In fact, since it doesn't #define KERNEL, the struct netexport below␊ |
283 | * won't be defined.␊ |
284 | *␊ |
285 | * So, I'm using #ifdef KERNEL around the things that are only relevant␊ |
286 | * to the in-kernel implementation.␊ |
287 | *␊ |
288 | |
289 | * invent a different conditional here.␊ |
290 | */␊ |
291 | #ifdef KERNEL␊ |
292 | ␊ |
293 | #define␉NTFS_SYSNODESNUM␉0x0B␊ |
294 | struct ntfsmount {␊ |
295 | ␉struct mount *ntm_mountp;␉/* filesystem vfs structure */␊ |
296 | ␉struct bootfile ntm_bootfile;␊ |
297 | ␉dev_t ntm_dev;␉/* device mounted */␊ |
298 | ␉struct vnode *ntm_devvp;␉/* block device mounted vnode */␊ |
299 | ␉struct vnode *ntm_sysvn[NTFS_SYSNODESNUM];␊ |
300 | ␉u_int32_t ntm_bpmftrec;␊ |
301 | ␉uid_t ntm_uid;␊ |
302 | ␉gid_t ntm_gid;␊ |
303 | ␉mode_t ntm_mode;␊ |
304 | ␉u_long ntm_flag;␊ |
305 | ␉cn_t␉␉ntm_cfree;␊ |
306 | ␉struct ntvattrdef *ntm_ad;␉/* attribute names are stored in native byte order */␊ |
307 | ␉int␉␉ntm_adnum;␊ |
308 | ␉wchar *␉␉ntm_82u;␉/* 8bit to Unicode */␊ |
309 | ␉char **␉␉ntm_u28;␉/* Unicode to 8 bit */␊ |
310 | #ifdef APPLE␊ |
311 | ␉struct netexport ntm_export;␉/* NFS export information */␊ |
312 | #endif␊ |
313 | };␊ |
314 | ␊ |
315 | #define ntm_mftcn␉ntm_bootfile.bf_mftcn␊ |
316 | #define ntm_mftmirrcn␉ntm_bootfile.bf_mftmirrcn␊ |
317 | #define␉ntm_mftrecsz␉ntm_bootfile.bf_mftrecsz␊ |
318 | #define␉ntm_spc␉␉ntm_bootfile.bf_spc␊ |
319 | #define␉ntm_bps␉␉ntm_bootfile.bf_bps␊ |
320 | ␊ |
321 | #pragma pack()␊ |
322 | ␊ |
323 | #define␉NTFS_NEXTREC(s, type) ((type)(((caddr_t) s) + le16toh((s)->reclen)))␊ |
324 | ␊ |
325 | /* Convert mount ptr to ntfsmount ptr. */␊ |
326 | #define VFSTONTFS(mp)␉((struct ntfsmount *)((mp)->mnt_data))␊ |
327 | #define VTONT(v)␉FTONT(VTOF(v))␊ |
328 | #define␉VTOF(v)␉␉((struct fnode *)((v)->v_data))␊ |
329 | #define␉FTOV(f)␉␉((f)->f_vp)␊ |
330 | #define␉FTONT(f)␉((f)->f_ip)␊ |
331 | #define ntfs_cntobn(cn)␉((daddr_t)(cn) * (ntmp->ntm_spc))␊ |
332 | #define ntfs_cntob(cn)␉((off_t)(cn) * (ntmp)->ntm_spc * (ntmp)->ntm_bps)␊ |
333 | #define ntfs_btocn(off)␉(cn_t)((off) / ((ntmp)->ntm_spc * (ntmp)->ntm_bps))␊ |
334 | #define ntfs_btocl(off)␉(cn_t)((off + ntfs_cntob(1) - 1) / ((ntmp)->ntm_spc * (ntmp)->ntm_bps))␊ |
335 | #define ntfs_btocnoff(off)␉(off_t)((off) % ((ntmp)->ntm_spc * (ntmp)->ntm_bps))␊ |
336 | #define ntfs_bntob(bn)␉(daddr_t)((bn) * (ntmp)->ntm_bps)␊ |
337 | ␊ |
338 | #define␉ntfs_bpbl␉(daddr_t)((ntmp)->ntm_bps)␊ |
339 | ␊ |
340 | #ifdef MALLOC_DECLARE␊ |
341 | MALLOC_DECLARE(M_NTFSMNT);␊ |
342 | MALLOC_DECLARE(M_NTFSNTNODE);␊ |
343 | MALLOC_DECLARE(M_NTFSFNODE);␊ |
344 | MALLOC_DECLARE(M_NTFSDIR);␊ |
345 | MALLOC_DECLARE(M_NTFSNTHASH);␊ |
346 | #endif␊ |
347 | ␊ |
348 | #ifndef M_NTFSMNT␊ |
349 | #define M_NTFSMNT M_TEMP␊ |
350 | #endif␊ |
351 | #ifndef M_NTFSNTNODE␊ |
352 | #define M_NTFSNTNODE M_TEMP␊ |
353 | #endif␊ |
354 | #ifndef M_NTFSFNODE␊ |
355 | #define M_NTFSFNODE M_TEMP␊ |
356 | #endif␊ |
357 | #ifndef M_NTFSDIR␊ |
358 | #define M_NTFSDIR M_TEMP␊ |
359 | #endif␊ |
360 | #ifndef M_NTFSNTHASH␊ |
361 | #define M_NTFSNTHASH M_TEMP␊ |
362 | #endif␊ |
363 | #ifndef M_NTFSRUN␊ |
364 | #define M_NTFSRUN M_TEMP␊ |
365 | #endif␊ |
366 | #ifndef M_NTFSRDATA␊ |
367 | #define M_NTFSRDATA M_TEMP␊ |
368 | #endif␊ |
369 | #ifndef M_NTFSNTVATTR␊ |
370 | #define M_NTFSNTVATTR M_TEMP␊ |
371 | #endif␊ |
372 | #ifndef M_NTFSDECOMP␊ |
373 | #define M_NTFSDECOMP M_TEMP␊ |
374 | #endif␊ |
375 | #define VT_NTFS VT_OTHER␊ |
376 | ␊ |
377 | #if defined(NTFS_DEBUG)␊ |
378 | #define dprintf(a) printf a␊ |
379 | #if NTFS_DEBUG > 1␊ |
380 | #define ddprintf(a) printf a␊ |
381 | #else␊ |
382 | #define ddprintf(a)␊ |
383 | #endif␊ |
384 | #else␊ |
385 | #define dprintf(a)␊ |
386 | #define ddprintf(a)␊ |
387 | #endif␊ |
388 | ␊ |
389 | #ifdef APPLE␊ |
390 | typedef int vop_t(void *);␊ |
391 | #else␊ |
392 | #endif␊ |
393 | extern vop_t **ntfs_vnodeop_p;␊ |
394 | #endif /* KERNEL */␊ |
395 | |