xref: /minix3/sbin/newfs_udf/udf_create.h (revision 9f988b79349f9b89ecc822458c30ec8897558560)
1*9f988b79SJean-Baptiste Boric /* $NetBSD: udf_create.h,v 1.7 2013/08/09 15:11:08 reinoud Exp $ */
2*9f988b79SJean-Baptiste Boric 
3*9f988b79SJean-Baptiste Boric /*
4*9f988b79SJean-Baptiste Boric  * Copyright (c) 2006, 2008 Reinoud Zandijk
5*9f988b79SJean-Baptiste Boric  * All rights reserved.
6*9f988b79SJean-Baptiste Boric  *
7*9f988b79SJean-Baptiste Boric  * Redistribution and use in source and binary forms, with or without
8*9f988b79SJean-Baptiste Boric  * modification, are permitted provided that the following conditions
9*9f988b79SJean-Baptiste Boric  * are met:
10*9f988b79SJean-Baptiste Boric  * 1. Redistributions of source code must retain the above copyright
11*9f988b79SJean-Baptiste Boric  *    notice, this list of conditions and the following disclaimer.
12*9f988b79SJean-Baptiste Boric  * 2. Redistributions in binary form must reproduce the above copyright
13*9f988b79SJean-Baptiste Boric  *    notice, this list of conditions and the following disclaimer in the
14*9f988b79SJean-Baptiste Boric  *    documentation and/or other materials provided with the distribution.
15*9f988b79SJean-Baptiste Boric  *
16*9f988b79SJean-Baptiste Boric  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
17*9f988b79SJean-Baptiste Boric  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
18*9f988b79SJean-Baptiste Boric  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
19*9f988b79SJean-Baptiste Boric  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
20*9f988b79SJean-Baptiste Boric  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
21*9f988b79SJean-Baptiste Boric  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
22*9f988b79SJean-Baptiste Boric  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
23*9f988b79SJean-Baptiste Boric  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24*9f988b79SJean-Baptiste Boric  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
25*9f988b79SJean-Baptiste Boric  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*9f988b79SJean-Baptiste Boric  *
27*9f988b79SJean-Baptiste Boric  */
28*9f988b79SJean-Baptiste Boric 
29*9f988b79SJean-Baptiste Boric #ifndef _FS_UDF_UDF_CREATE_H_
30*9f988b79SJean-Baptiste Boric #define _FS_UDF_UDF_CREATE_H_
31*9f988b79SJean-Baptiste Boric 
32*9f988b79SJean-Baptiste Boric #include <sys/types.h>
33*9f988b79SJean-Baptiste Boric #include <sys/stat.h>
34*9f988b79SJean-Baptiste Boric #if !HAVE_NBTOOL_CONFIG_H
35*9f988b79SJean-Baptiste Boric #include <fs/udf/ecma167-udf.h>
36*9f988b79SJean-Baptiste Boric #else
37*9f988b79SJean-Baptiste Boric #include "../../sys/fs/udf/ecma167-udf.h"
38*9f988b79SJean-Baptiste Boric #endif
39*9f988b79SJean-Baptiste Boric #include "udf_bswap.h"
40*9f988b79SJean-Baptiste Boric #include "udf_osta.h"
41*9f988b79SJean-Baptiste Boric 
42*9f988b79SJean-Baptiste Boric 
43*9f988b79SJean-Baptiste Boric /* format flags indicating properties of disc to create */
44*9f988b79SJean-Baptiste Boric #define FORMAT_WRITEONCE	0x00001
45*9f988b79SJean-Baptiste Boric #define FORMAT_SEQUENTIAL	0x00002
46*9f988b79SJean-Baptiste Boric #define FORMAT_REWRITABLE	0x00004
47*9f988b79SJean-Baptiste Boric #define FORMAT_SPARABLE		0x00008
48*9f988b79SJean-Baptiste Boric #define FORMAT_META		0x00010
49*9f988b79SJean-Baptiste Boric #define FORMAT_LOW		0x00020
50*9f988b79SJean-Baptiste Boric #define FORMAT_VAT		0x00040
51*9f988b79SJean-Baptiste Boric #define FORMAT_WORM		0x00080
52*9f988b79SJean-Baptiste Boric #define FORMAT_TRACK512		0x00100
53*9f988b79SJean-Baptiste Boric #define FORMAT_INVALID		0x00200
54*9f988b79SJean-Baptiste Boric #define FORMAT_READONLY		0x00400
55*9f988b79SJean-Baptiste Boric #define FORMAT_FLAGBITS \
56*9f988b79SJean-Baptiste Boric     "\10\1WRITEONCE\2SEQUENTIAL\3REWRITABLE\4SPARABLE\5META\6LOW" \
57*9f988b79SJean-Baptiste Boric     "\7VAT\10WORM\11TRACK512\12INVALID\13READONLY"
58*9f988b79SJean-Baptiste Boric 
59*9f988b79SJean-Baptiste Boric 
60*9f988b79SJean-Baptiste Boric /* structure space */
61*9f988b79SJean-Baptiste Boric #define UDF_ANCHORS		4	/* 256, 512, N-256, N */
62*9f988b79SJean-Baptiste Boric #define UDF_PARTITIONS		4	/* overkill */
63*9f988b79SJean-Baptiste Boric #define UDF_PMAPS		4	/* overkill */
64*9f988b79SJean-Baptiste Boric 
65*9f988b79SJean-Baptiste Boric /* misc constants */
66*9f988b79SJean-Baptiste Boric #define UDF_MAX_NAMELEN		255			/* as per SPEC */
67*9f988b79SJean-Baptiste Boric 
68*9f988b79SJean-Baptiste Boric /* translation constants */
69*9f988b79SJean-Baptiste Boric #define UDF_VTOP_RAWPART UDF_PMAPS	/* [0..UDF_PMAPS> are normal     */
70*9f988b79SJean-Baptiste Boric 
71*9f988b79SJean-Baptiste Boric /* virtual to physical mapping types */
72*9f988b79SJean-Baptiste Boric #define UDF_VTOP_TYPE_RAW            0
73*9f988b79SJean-Baptiste Boric #define UDF_VTOP_TYPE_UNKNOWN        0
74*9f988b79SJean-Baptiste Boric #define UDF_VTOP_TYPE_PHYS           1
75*9f988b79SJean-Baptiste Boric #define UDF_VTOP_TYPE_VIRT           2
76*9f988b79SJean-Baptiste Boric #define UDF_VTOP_TYPE_SPARABLE       3
77*9f988b79SJean-Baptiste Boric #define UDF_VTOP_TYPE_META           4
78*9f988b79SJean-Baptiste Boric 
79*9f988b79SJean-Baptiste Boric #define UDF_TRANS_ZERO		((uint64_t) -1)
80*9f988b79SJean-Baptiste Boric #define UDF_TRANS_UNMAPPED	((uint64_t) -2)
81*9f988b79SJean-Baptiste Boric #define UDF_TRANS_INTERN	((uint64_t) -3)
82*9f988b79SJean-Baptiste Boric #define UDF_MAX_SECTOR		((uint64_t) -10)	/* high water mark */
83*9f988b79SJean-Baptiste Boric 
84*9f988b79SJean-Baptiste Boric /* handys */
85*9f988b79SJean-Baptiste Boric #define UDF_ROUNDUP(val, gran) \
86*9f988b79SJean-Baptiste Boric 	((uint64_t) (gran) * (((uint64_t)(val) + (gran)-1) / (gran)))
87*9f988b79SJean-Baptiste Boric 
88*9f988b79SJean-Baptiste Boric #define UDF_ROUNDDOWN(val, gran) \
89*9f988b79SJean-Baptiste Boric 	((uint64_t) (gran) * (((uint64_t)(val)) / (gran)))
90*9f988b79SJean-Baptiste Boric 
91*9f988b79SJean-Baptiste Boric 
92*9f988b79SJean-Baptiste Boric /* disc offsets for various structures and their sizes */
93*9f988b79SJean-Baptiste Boric struct udf_disclayout {
94*9f988b79SJean-Baptiste Boric 	uint32_t wrtrack_skew;
95*9f988b79SJean-Baptiste Boric 
96*9f988b79SJean-Baptiste Boric 	uint32_t iso9660_vrs;
97*9f988b79SJean-Baptiste Boric 	uint32_t anchors[UDF_ANCHORS];
98*9f988b79SJean-Baptiste Boric 	uint32_t vds_size, vds1, vds2;
99*9f988b79SJean-Baptiste Boric 	uint32_t lvis_size, lvis;
100*9f988b79SJean-Baptiste Boric 
101*9f988b79SJean-Baptiste Boric 	uint32_t first_lba, last_lba;
102*9f988b79SJean-Baptiste Boric 	uint32_t sector_size;
103*9f988b79SJean-Baptiste Boric 	uint32_t blockingnr, align_blockingnr, sparable_blockingnr;
104*9f988b79SJean-Baptiste Boric 	uint32_t meta_blockingnr, meta_alignment;
105*9f988b79SJean-Baptiste Boric 
106*9f988b79SJean-Baptiste Boric 	/* sparables */
107*9f988b79SJean-Baptiste Boric 	uint32_t sparable_blocks;
108*9f988b79SJean-Baptiste Boric 	uint32_t sparable_area, sparable_area_size;
109*9f988b79SJean-Baptiste Boric 	uint32_t sparing_table_dscr_lbas;
110*9f988b79SJean-Baptiste Boric 	uint32_t spt_1, spt_2;
111*9f988b79SJean-Baptiste Boric 
112*9f988b79SJean-Baptiste Boric 	/* bitmaps */
113*9f988b79SJean-Baptiste Boric 	uint32_t alloc_bitmap_dscr_size;
114*9f988b79SJean-Baptiste Boric 	uint32_t unalloc_space, freed_space;
115*9f988b79SJean-Baptiste Boric 
116*9f988b79SJean-Baptiste Boric 	uint32_t meta_bitmap_dscr_size;
117*9f988b79SJean-Baptiste Boric 	uint32_t meta_bitmap_space;
118*9f988b79SJean-Baptiste Boric 
119*9f988b79SJean-Baptiste Boric 	/* metadata partition */
120*9f988b79SJean-Baptiste Boric 	uint32_t meta_file, meta_mirror, meta_bitmap;
121*9f988b79SJean-Baptiste Boric 	uint32_t meta_part_start_lba, meta_part_size_lba;
122*9f988b79SJean-Baptiste Boric 
123*9f988b79SJean-Baptiste Boric 	/* main partition */
124*9f988b79SJean-Baptiste Boric 	uint32_t part_start_lba, part_size_lba;
125*9f988b79SJean-Baptiste Boric 
126*9f988b79SJean-Baptiste Boric 	uint32_t fsd, rootdir, vat;
127*9f988b79SJean-Baptiste Boric 
128*9f988b79SJean-Baptiste Boric };
129*9f988b79SJean-Baptiste Boric 
130*9f988b79SJean-Baptiste Boric 
131*9f988b79SJean-Baptiste Boric /* all info about discs and descriptors building */
132*9f988b79SJean-Baptiste Boric struct udf_create_context {
133*9f988b79SJean-Baptiste Boric 	/* descriptors */
134*9f988b79SJean-Baptiste Boric 	int	 dscrver;	/* 2 or 3	*/
135*9f988b79SJean-Baptiste Boric 	int	 min_udf;	/* hex		*/
136*9f988b79SJean-Baptiste Boric 	int	 max_udf;	/* hex		*/
137*9f988b79SJean-Baptiste Boric 	int	 serialnum;	/* format serialno */
138*9f988b79SJean-Baptiste Boric 
139*9f988b79SJean-Baptiste Boric 	int	 gmtoff;	/* in minutes	*/
140*9f988b79SJean-Baptiste Boric 
141*9f988b79SJean-Baptiste Boric 	/* XXX to layout? */
142*9f988b79SJean-Baptiste Boric 	uint32_t	 sector_size;
143*9f988b79SJean-Baptiste Boric 
144*9f988b79SJean-Baptiste Boric 	/* identification */
145*9f988b79SJean-Baptiste Boric 	char	*logvol_name;
146*9f988b79SJean-Baptiste Boric 	char	*primary_name;
147*9f988b79SJean-Baptiste Boric 	char	*volset_name;
148*9f988b79SJean-Baptiste Boric 	char	*fileset_name;
149*9f988b79SJean-Baptiste Boric 
150*9f988b79SJean-Baptiste Boric 	char const *app_name;
151*9f988b79SJean-Baptiste Boric 	char const *impl_name;
152*9f988b79SJean-Baptiste Boric 	int	 app_version_main;
153*9f988b79SJean-Baptiste Boric 	int	 app_version_sub;
154*9f988b79SJean-Baptiste Boric 
155*9f988b79SJean-Baptiste Boric 	/* building */
156*9f988b79SJean-Baptiste Boric 	int	 vds_seq;	/* for building functions  */
157*9f988b79SJean-Baptiste Boric 	int	 unique_id;	/* only first few are used */
158*9f988b79SJean-Baptiste Boric 
159*9f988b79SJean-Baptiste Boric 	/* constructed structures */
160*9f988b79SJean-Baptiste Boric 	struct anchor_vdp	*anchors[UDF_ANCHORS];	/* anchors to VDS    */
161*9f988b79SJean-Baptiste Boric 	struct pri_vol_desc	*primary_vol;		/* identification    */
162*9f988b79SJean-Baptiste Boric 	struct logvol_desc	*logical_vol;		/* main mapping v->p */
163*9f988b79SJean-Baptiste Boric 	struct unalloc_sp_desc	*unallocated;		/* free UDF space    */
164*9f988b79SJean-Baptiste Boric 	struct impvol_desc	*implementation;	/* likely reduntant  */
165*9f988b79SJean-Baptiste Boric 	struct logvol_int_desc	*logvol_integrity;	/* current integrity */
166*9f988b79SJean-Baptiste Boric 	struct part_desc	*partitions[UDF_PARTITIONS]; /* partitions   */
167*9f988b79SJean-Baptiste Boric 
168*9f988b79SJean-Baptiste Boric 	/* XXX to layout? */
169*9f988b79SJean-Baptiste Boric 	int	data_part;
170*9f988b79SJean-Baptiste Boric 	int	metadata_part;
171*9f988b79SJean-Baptiste Boric 
172*9f988b79SJean-Baptiste Boric 	/* block numbers as offset in partition */
173*9f988b79SJean-Baptiste Boric 	uint32_t metadata_alloc_pos;
174*9f988b79SJean-Baptiste Boric 	uint32_t data_alloc_pos;
175*9f988b79SJean-Baptiste Boric 
176*9f988b79SJean-Baptiste Boric 	/* derived; points *into* other structures */
177*9f988b79SJean-Baptiste Boric 	struct udf_logvol_info	*logvol_info;		/* inside integrity  */
178*9f988b79SJean-Baptiste Boric 
179*9f988b79SJean-Baptiste Boric 	/* fileset and root directories */
180*9f988b79SJean-Baptiste Boric 	struct fileset_desc	*fileset_desc;		/* normally one      */
181*9f988b79SJean-Baptiste Boric 
182*9f988b79SJean-Baptiste Boric 	/* logical to physical translations */
183*9f988b79SJean-Baptiste Boric 	int 			 vtop[UDF_PMAPS+1];	/* vpartnr trans     */
184*9f988b79SJean-Baptiste Boric 	int			 vtop_tp[UDF_PMAPS+1];	/* type of trans     */
185*9f988b79SJean-Baptiste Boric 	uint64_t		 vtop_offset[UDF_PMAPS+1]; /* offset in lb   */
186*9f988b79SJean-Baptiste Boric 
187*9f988b79SJean-Baptiste Boric 	/* sparable */
188*9f988b79SJean-Baptiste Boric 	struct udf_sparing_table*sparing_table;		/* replacements      */
189*9f988b79SJean-Baptiste Boric 
190*9f988b79SJean-Baptiste Boric 	/* VAT file */
191*9f988b79SJean-Baptiste Boric 	uint32_t		 vat_size;		/* length */
192*9f988b79SJean-Baptiste Boric 	uint32_t		 vat_allocated;		/* allocated length */
193*9f988b79SJean-Baptiste Boric 	uint32_t		 vat_start;		/* offset 1st entry */
194*9f988b79SJean-Baptiste Boric 	uint8_t			*vat_contents;		/* the VAT */
195*9f988b79SJean-Baptiste Boric 
196*9f988b79SJean-Baptiste Boric 	/* meta data partition */
197*9f988b79SJean-Baptiste Boric 	struct extfile_entry	*meta_file;
198*9f988b79SJean-Baptiste Boric 	struct extfile_entry	*meta_mirror;
199*9f988b79SJean-Baptiste Boric 	struct extfile_entry	*meta_bitmap;
200*9f988b79SJean-Baptiste Boric 
201*9f988b79SJean-Baptiste Boric 	/* lvint */
202*9f988b79SJean-Baptiste Boric 	int	 num_files;
203*9f988b79SJean-Baptiste Boric 	int	 num_directories;
204*9f988b79SJean-Baptiste Boric 	uint32_t part_size[UDF_PARTITIONS];
205*9f988b79SJean-Baptiste Boric 	uint32_t part_free[UDF_PARTITIONS];
206*9f988b79SJean-Baptiste Boric 
207*9f988b79SJean-Baptiste Boric 	struct space_bitmap_desc*part_unalloc_bits[UDF_PARTITIONS];
208*9f988b79SJean-Baptiste Boric 	struct space_bitmap_desc*part_freed_bits  [UDF_PARTITIONS];
209*9f988b79SJean-Baptiste Boric };
210*9f988b79SJean-Baptiste Boric 
211*9f988b79SJean-Baptiste Boric 
212*9f988b79SJean-Baptiste Boric /* globals */
213*9f988b79SJean-Baptiste Boric 
214*9f988b79SJean-Baptiste Boric extern struct udf_create_context context;
215*9f988b79SJean-Baptiste Boric extern struct udf_disclayout     layout;
216*9f988b79SJean-Baptiste Boric 
217*9f988b79SJean-Baptiste Boric /* prototypes */
218*9f988b79SJean-Baptiste Boric void udf_init_create_context(void);
219*9f988b79SJean-Baptiste Boric int a_udf_version(const char *s, const char *id_type);
220*9f988b79SJean-Baptiste Boric 
221*9f988b79SJean-Baptiste Boric int udf_calculate_disc_layout(int format_flags, int min_udf,
222*9f988b79SJean-Baptiste Boric 	uint32_t wrtrack_skew,
223*9f988b79SJean-Baptiste Boric 	uint32_t first_lba, uint32_t last_lba,
224*9f988b79SJean-Baptiste Boric 	uint32_t sector_size, uint32_t blockingnr,
225*9f988b79SJean-Baptiste Boric 	uint32_t sparable_blocks,
226*9f988b79SJean-Baptiste Boric 	float meta_fract);
227*9f988b79SJean-Baptiste Boric 
228*9f988b79SJean-Baptiste Boric void udf_osta_charset(struct charspec *charspec);
229*9f988b79SJean-Baptiste Boric void udf_encode_osta_id(char *osta_id, uint16_t len, char *text);
230*9f988b79SJean-Baptiste Boric 
231*9f988b79SJean-Baptiste Boric void udf_set_regid(struct regid *regid, char const *name);
232*9f988b79SJean-Baptiste Boric void udf_add_domain_regid(struct regid *regid);
233*9f988b79SJean-Baptiste Boric void udf_add_udf_regid(struct regid *regid);
234*9f988b79SJean-Baptiste Boric void udf_add_impl_regid(struct regid *regid);
235*9f988b79SJean-Baptiste Boric void udf_add_app_regid(struct regid *regid);
236*9f988b79SJean-Baptiste Boric 
237*9f988b79SJean-Baptiste Boric int  udf_validate_tag_sum(union dscrptr *dscr);
238*9f988b79SJean-Baptiste Boric int  udf_validate_tag_and_crc_sums(union dscrptr *dscr);
239*9f988b79SJean-Baptiste Boric 
240*9f988b79SJean-Baptiste Boric void udf_set_timestamp_now(struct timestamp *timestamp);
241*9f988b79SJean-Baptiste Boric 
242*9f988b79SJean-Baptiste Boric void udf_inittag(struct desc_tag *tag, int tagid, uint32_t loc);
243*9f988b79SJean-Baptiste Boric int udf_create_anchor(int num);
244*9f988b79SJean-Baptiste Boric 
245*9f988b79SJean-Baptiste Boric void udf_create_terminator(union dscrptr *dscr, uint32_t loc);
246*9f988b79SJean-Baptiste Boric int udf_create_primaryd(void);
247*9f988b79SJean-Baptiste Boric int udf_create_partitiond(int part_num, int part_accesstype);
248*9f988b79SJean-Baptiste Boric int udf_create_unalloc_spaced(void);
249*9f988b79SJean-Baptiste Boric int udf_create_sparing_tabled(void);
250*9f988b79SJean-Baptiste Boric int udf_create_space_bitmap(uint32_t dscr_size, uint32_t part_size_lba,
251*9f988b79SJean-Baptiste Boric 	struct space_bitmap_desc **sbdp);
252*9f988b79SJean-Baptiste Boric int udf_create_logical_dscr(int format_flags);
253*9f988b79SJean-Baptiste Boric int udf_create_impvold(char *field1, char *field2, char *field3);
254*9f988b79SJean-Baptiste Boric int udf_create_fsd(void);
255*9f988b79SJean-Baptiste Boric int udf_create_lvintd(int type);
256*9f988b79SJean-Baptiste Boric void udf_update_lvintd(int type);
257*9f988b79SJean-Baptiste Boric 
258*9f988b79SJean-Baptiste Boric int udf_register_bad_block(uint32_t location);
259*9f988b79SJean-Baptiste Boric void udf_mark_allocated(uint32_t start_lb, int partnr, uint32_t blocks);
260*9f988b79SJean-Baptiste Boric 
261*9f988b79SJean-Baptiste Boric int udf_create_new_fe(struct file_entry **fep, int file_type,
262*9f988b79SJean-Baptiste Boric 	struct stat *st);
263*9f988b79SJean-Baptiste Boric int udf_create_new_efe(struct extfile_entry **efep, int file_type,
264*9f988b79SJean-Baptiste Boric 	struct stat *st);
265*9f988b79SJean-Baptiste Boric 
266*9f988b79SJean-Baptiste Boric int udf_encode_symlink(uint8_t **pathbufp, uint32_t *pathlenp, char *target);
267*9f988b79SJean-Baptiste Boric 
268*9f988b79SJean-Baptiste Boric void udf_advance_uniqueid(void);
269*9f988b79SJean-Baptiste Boric int udf_fidsize(struct fileid_desc *fid);
270*9f988b79SJean-Baptiste Boric void udf_create_fid(uint32_t diroff, struct fileid_desc *fid,
271*9f988b79SJean-Baptiste Boric 	char *name, int namelen, struct long_ad *ref);
272*9f988b79SJean-Baptiste Boric int udf_create_parentfid(struct fileid_desc *fid, struct long_ad *parent);
273*9f988b79SJean-Baptiste Boric 
274*9f988b79SJean-Baptiste Boric int udf_create_meta_files(void);
275*9f988b79SJean-Baptiste Boric int udf_create_new_rootdir(union dscrptr **dscr);
276*9f988b79SJean-Baptiste Boric 
277*9f988b79SJean-Baptiste Boric int udf_create_VAT(union dscrptr **vat_dscr);
278*9f988b79SJean-Baptiste Boric void udf_prepend_VAT_file(void);
279*9f988b79SJean-Baptiste Boric void udf_vat_update(uint32_t virt, uint32_t phys);
280*9f988b79SJean-Baptiste Boric int udf_append_VAT_file(void);
281*9f988b79SJean-Baptiste Boric 
282*9f988b79SJean-Baptiste Boric #endif /* _FS_UDF_UDF_CREATE_H_ */
283*9f988b79SJean-Baptiste Boric 
284