xref: /illumos-gate/usr/src/uts/common/sys/fs/udf_inode.h (revision 7800901e60d340b6af88e94a2149805dcfcaaf56)
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 (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 /*
22  * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
23  * Use is subject to license terms.
24  */
25 
26 /*	Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T	*/
27 /*	All Rights Reserved */
28 
29 #ifndef	_SYS_FS_UDF_INODE_H
30 #define	_SYS_FS_UDF_INODE_H
31 
32 #pragma ident	"%Z%%M%	%I%	%E% SMI"
33 
34 #include <sys/note.h>
35 
36 #ifdef	__cplusplus
37 extern "C" {
38 #endif
39 
40 #define	SUN_IMPL_ID	"*SUN SOLARIS UDF"
41 #define	SUN_IMPL_ID_LEN	16
42 #define	SUN_OS_CLASS	4
43 #define	SUN_OS_ID	2
44 
45 /*
46  * Size of each cluster
47  * and bits to be shifted
48  */
49 #define	CLSTR_SIZE	8
50 #define	CLSTR_MASK	7
51 
52 
53 /*
54  * enums
55  */
56 enum de_op { DE_CREATE, DE_MKDIR, DE_LINK, DE_RENAME };	/* direnter ops */
57 enum dr_op { DR_REMOVE, DR_RMDIR, DR_RENAME };		/* dirremove ops */
58 
59 /*
60  * The following macros optimize certain frequently calculated
61  * quantities by using shifts and masks in place of divisions
62  * modulos and multiplications.
63  */
64 
65 #define	blkoff(udfvfsp, loc)	/* calculates (loc % udfcfs->udf_lbsize) */ \
66 		((loc) & (udfvfsp)->udf_lbmask)
67 
68 #define	lblkno(udf_vfsp, loc)	\
69 	((int32_t)((loc) / (udf_vfsp)->udf_lbsize))
70 
71 #define	fsbtodb(udf, blk)	\
72 	((blk) << udf->udf_l2d_shift)
73 
74 
75 struct udf_fid {
76 	uint16_t	udfid_len;	/* Length of data */
77 	uint16_t	udfid_prn;	/* the partition number of icb */
78 	uint32_t	udfid_icb_lbn;	/* file entry block no */
79 	uint32_t	udfid_uinq_lo;	/* uniq id to validate the vnode */
80 };
81 
82 
83 
84 
85 #define	MAXNAMLEN	255
86 
87 
88 
89 
90 struct ud_part {
91 	uint16_t	udp_flags;	/* See below */
92 	uint16_t	udp_number;	/* partition Number */
93 	uint32_t	udp_seqno;	/* to find the prevailaing desc */
94 	uint32_t	udp_access;	/* access type */
95 	uint32_t	udp_start;	/* Starting block no of partition */
96 	uint32_t	udp_length;	/* Lenght of the partition */
97 	uint32_t	udp_unall_loc;	/* unall space tbl or bitmap loc */
98 	uint32_t	udp_unall_len;	/* unall space tbl or bitmap length */
99 	uint32_t	udp_freed_loc;	/* freed space tbl or bitmap loc */
100 	uint32_t	udp_freed_len;	/* freed space tbl or bitmap length */
101 					/* From part desc */
102 
103 	uint32_t	udp_nfree;	/* No of free blocks in the partition */
104 	uint32_t	udp_nblocks;	/* Total no of blks in the partition */
105 					/* From lvid */
106 	uint32_t	udp_last_alloc;	/* Last allocated space in bitmap */
107 
108 	int32_t		udp_cache_count;	/* Cache is used for metadata */
109 	daddr_t		udp_cache[CLSTR_SIZE];
110 };
111 
112 /*
113  * udp_flags
114  */
115 #define	UDP_BITMAPS	0x00
116 #define	UDP_SPACETBLS	0x01
117 
118 /*
119  * udp_access
120  */
121 #define	UDP_MT_RO	0x0001		/* ROM */
122 #define	UDP_MT_WO	0x0002		/* WORM */
123 #define	UDP_MT_RW	0x0003		/* RW */
124 #define	UDP_MT_OW	0x0004		/* OW */
125 
126 
127 
128 #define	MAX_SPM		4
129 
130 struct ud_map {
131 	uint32_t	udm_flags;	/* Flags */
132 	uint16_t	udm_vsn;	/* Volume Sequence Number */
133 	uint16_t	udm_pn;		/* Partition Number */
134 	uint32_t	udm_vat_icb;	/* VAT ICB location */
135 	uint32_t	udm_nent;	/* Number of vat entries */
136 	uint32_t	*udm_count;	/* Number of entrues in each table */
137 	struct buf	**udm_bp;	/* VAT translation tables */
138 	uint32_t	**udm_addr;
139 
140 
141 	int32_t		udm_plen;
142 	int32_t		udm_nspm;
143 	uint32_t	udm_spsz;
144 	uint32_t	udm_loc[MAX_SPM];
145 	struct buf	*udm_sbp[MAX_SPM];
146 	caddr_t		udm_spaddr[MAX_SPM];
147 };
148 
149 /*
150  * udm_flags
151  */
152 #define	UDM_MAP_NORM	0x00
153 #define	UDM_MAP_VPM	0x01
154 #define	UDM_MAP_SPM	0x02
155 
156 struct udf_vfs {
157 	struct vfs	*udf_vfs;	/* Back link */
158 	struct udf_vfs	*udf_next;	/* Chain of udf file-system's */
159 	struct udf_vfs	*udf_wnext;	/* work list link */
160 
161 	struct buf	*udf_vds;	/* most of the superblock */
162 	struct buf	*udf_iseq;	/* Integrity of the fs */
163 	struct vnode	*udf_root;	/* Root vnode */
164 	struct vnode	*udf_devvp;	/* Block device vnode */
165 
166 	char		*udf_fsmnt;	/* Path name of directory mouted on */
167 	uint32_t	udf_flags;	/* Flags */
168 	uint32_t	udf_mtype;	/* Media type */
169 
170 	int32_t		udf_rdclustsz;	/* read cluster size */
171 	int32_t		udf_wrclustsz;	/* write cluster size */
172 
173 	uint64_t	udf_maxfsize;	/* Max file size allowed in this fs */
174 	int32_t		udf_maxfbits;	/* No of bit's for max file size */
175 
176 	char		udf_volid[32];	/* volume identifier */
177 					/* from pvd */
178 	uint16_t	udf_tsno;	/* Taken from pvd and */
179 					/* used in making tags */
180 
181 	int32_t		udf_lbsize;	/* Block size */
182 					/* from lvd */
183 	int32_t		udf_lbmask;	/* udf_lbsize - 1 */
184 	int32_t		udf_l2b_shift;	/* lbsize to bytes */
185 	int32_t		udf_l2d_shift;	/* right shift's to */
186 					/* make lbsize to DEV_BSIZE */
187 
188 	int32_t		udf_npart;	/* No. of partition's in the volume */
189 					/* restricted to 1 till udf 1.50 */
190 	struct ud_part	*udf_parts;	/* pointer to array of partitions */
191 					/* from part desc's */
192 
193 	int32_t		udf_nmaps;
194 	struct ud_map	*udf_maps;
195 
196 	int32_t		udf_fragmented;	/* File System fragmented */
197 	int32_t		udf_mark_bad;	/* force fsck at next mount */
198 
199 	/*
200 	 * sum of udp_nfree and udp_nblocks
201 	 * from the array udf_parts[0] to udf_parts[udf_nparts - 1]
202 	 */
203 	uint32_t	udf_freeblks;	/* Total udf_lbsize Free Blocks */
204 	uint32_t	udf_totalblks;	/* Total number of Blocks */
205 				/* udf_parts[0].udp_nfree == udf_freespace */
206 				/* till udf 1.50 (DVD-R?) */
207 	uint64_t	udf_maxuniq;	/* Maximum unique ID on the fs */
208 	uint32_t	udf_nfiles;	/* No of files */
209 	uint32_t	udf_ndirs;	/* No of directories */
210 	uint32_t	udf_miread;	/* minimum read revision */
211 	uint32_t	udf_miwrite;	/* minimum write revision */
212 	uint32_t	udf_mawrite;	/* maximum read revision */
213 					/* from lvid */
214 
215 	time_t		udf_time;	/* Last time super block is written */
216 	uint32_t	udf_mod;	/* file system was modified */
217 	uint32_t	udf_clean;	/* state of the file system */
218 	kmutex_t	udf_lock;	/* protects contents */
219 
220 	kmutex_t	udf_rename_lck;	/* lock for udf_rename */
221 
222 	/*
223 	 * Have them cached here for fast access
224 	 */
225 	struct pri_vol_desc	*udf_pvd;
226 	struct log_vol_desc	*udf_lvd;
227 	struct log_vol_int_desc *udf_lvid;
228 
229 	uint32_t		udf_mvds_loc;
230 	uint32_t		udf_mvds_len;
231 
232 	uint32_t		udf_rvds_loc;
233 	uint32_t		udf_rvds_len;
234 
235 	uint32_t		udf_iseq_loc;
236 	uint32_t		udf_iseq_len;
237 
238 	uint16_t		udf_fsd_prn;
239 	uint32_t		udf_fsd_loc;
240 	uint32_t		udf_fsd_len;
241 
242 	uint16_t		udf_ricb_prn;
243 	uint32_t		udf_ricb_loc;
244 	uint32_t		udf_ricb_len;
245 	daddr_t			udf_root_blkno;
246 };
247 
248 
249 #ifndef	__lint
250 _NOTE(MUTEX_PROTECTS_DATA(udf_vfs::udf_lock,
251 		udf_vfs::udf_fragmented))
252 _NOTE(MUTEX_PROTECTS_DATA(udf_vfs::udf_lock,
253 		udf_vfs::udf_freeblks udf_vfs::udf_totalblks))
254 _NOTE(MUTEX_PROTECTS_DATA(udf_vfs::udf_lock,
255 		udf_vfs::udf_maxuniq udf_vfs::udf_nfiles
256 		udf_vfs::udf_ndirs))
257 _NOTE(MUTEX_PROTECTS_DATA(udf_vfs::udf_lock,
258 		udf_vfs::udf_time
259 		udf_vfs::udf_mod udf_vfs::udf_clean))
260 
261 _NOTE(READ_ONLY_DATA(udf_vfs::udf_nmaps udf_vfs::udf_maps))
262 
263 _NOTE(READ_ONLY_DATA(udf_vfs::udf_mtype
264 		udf_vfs::udf_rdclustsz
265 		udf_vfs::udf_wrclustsz
266 		udf_vfs::udf_maxfsize
267 		udf_vfs::udf_maxfbits
268 		udf_vfs::udf_lbsize
269 		udf_vfs::udf_l2b_shift
270 		udf_vfs::udf_lbmask
271 		udf_vfs::udf_l2d_shift))
272 
273 _NOTE(READ_ONLY_DATA(udf_vfs::udf_pvd
274 		udf_vfs::udf_lvd
275 		udf_vfs::udf_lvid))
276 
277 _NOTE(READ_ONLY_DATA(udf_vfs::udf_mvds_loc
278 		udf_vfs::udf_mvds_len
279 		udf_vfs::udf_iseq_loc
280 		udf_vfs::udf_iseq_len
281 		udf_vfs::udf_fsd_prn
282 		udf_vfs::udf_fsd_loc
283 		udf_vfs::udf_fsd_len
284 		udf_vfs::udf_ricb_prn
285 		udf_vfs::udf_ricb_loc
286 		udf_vfs::udf_ricb_len
287 		udf_vfs::udf_root_blkno))
288 
289 _NOTE(READ_ONLY_DATA(ud_part::udp_flags
290 		ud_part::udp_number
291 		ud_part::udp_seqno
292 		ud_part::udp_access
293 		ud_part::udp_start
294 		ud_part::udp_length
295 		ud_part::udp_unall_loc
296 		ud_part::udp_unall_len
297 		ud_part::udp_freed_loc
298 		ud_part::udp_freed_len
299 		ud_part::udp_nblocks))
300 
301 _NOTE(MUTEX_PROTECTS_DATA(udf_vfs::udf_lock,
302 		ud_part::udp_nfree
303 		ud_part::udp_last_alloc
304 		ud_part::udp_cache_count
305 		ud_part::udp_cache))
306 #endif
307 
308 /*
309  * udf_mtype
310  */
311 #define	UDF_MT_RO	UDP_MT_RO		/* ROM */
312 #define	UDF_MT_WO	UDP_MT_OW		/* WORM */
313 #define	UDF_MT_RW	UDP_MT_RW		/* RW */
314 #define	UDF_MT_OW	UDP_MT_OW		/* OW */
315 
316 /*
317  * udf_flags
318  */
319 #define	UDF_FL_RDONLY	0x0001		/* file system is read only */
320 #define	UDF_FL_RW	0x0002		/* file system is read write */
321 
322 /*
323  * udf_clean
324  */
325 #define	UDF_DIRTY	0x00
326 #define	UDF_CLEAN	0x01
327 
328 
329 #define	RD_CLUSTSZ(ip)		((ip)->i_udf->udf_rdclustsz)
330 #define	WR_CLUSTSZ(ip)		((ip)->i_udf->udf_wrclustsz)
331 
332 /*
333  * Size can be a 64-bit value and therefore we sign extend fs_bmask
334  * to a 64-bit value too so that the higher 32 bits are masked
335  * properly. Note that the type of fs_bmask has to be signed. Otherwise
336  * compiler will set the higher 32 bits as zero and we don't want
337  * this to happen.
338  */
339 
340 #ifdef	UNDEF
341 #define	blkroundup(fs, size)	/* calculates roundup(size, fs->fs_bsize) */ \
342 	(((size) + (fs)->udf_lbsize - 1) & (offset_t)(fs)->udf_lbmask)
343 #endif
344 
345 #define	blkroundup(fs, size)	/* calculates roundup(size, fs->fs_bsize) */ \
346 	(((size) + (fs)->udf_lbmask) & (offset_t)(~(fs)->udf_lbmask))
347 
348 #define	blksize(fs)	(fs->udf_lbsize)
349 
350 
351 /*
352  * Convert between inode pointers and vnode pointers
353  */
354 #define	VTOI(VP)	((struct ud_inode *)(VP)->v_data)
355 #define	ITOV(IP)	((IP)->i_vnode)
356 #define	i_vfs		i_vnode->v_vfsp
357 
358 struct icb_ext {
359 	uint16_t	ib_flags;
360 
361 	/* Direct Entry will go here */
362 	uint16_t	ib_prn;		/* partition reference number */
363 	uint32_t	ib_block;	/* block offset into partition */
364 	uint64_t	ib_offset;	/* offset into the file bytes */
365 	int32_t		ib_count;	/* No of bytes in current ext */
366 	uint32_t	ib_marker1;	/* 0xAAAAAAAA */
367 	uint32_t	ib_marker2;	/* 0xBBBBBBBB */
368 };
369 
370 
371 /* ib_flags */
372 #define	IB_UN_REC	0x1		/* The entry is not allocated */
373 #define	IB_UN_RE_AL	0x2		/* The entry is not recorded */
374 					/* and not unallocated */
375 #define	IB_CON		0x3		/* Continuation entry */
376 
377 #define	IB_MASK		0x3
378 
379 #define	IB_ALLOCATED(flags)	\
380 	(((flags) & IB_MASK) != IB_UN_RE_AL)
381 
382 #define	EXT_PER_MALLOC	8
383 
384 
385 struct ud_inode {
386 	struct ud_inode	*i_forw;
387 	struct ud_inode	*i_back;
388 	struct ud_inode	*i_freef;
389 	struct ud_inode	*i_freeb;
390 
391 	struct vnode	*i_vnode;	/* vnode associated with this inode */
392 	struct vnode	*i_devvp;	/* vnode for block I/O */
393 	struct udf_vfs	*i_udf;		/* incore fs associated with inode */
394 	krwlock_t	i_rwlock;	/* serializes write/setattr requests */
395 	krwlock_t	i_contents;	/* protects (most of) inode contents */
396 	dev_t		i_dev;		/* device where inode resides */
397 	u_offset_t	i_diroff;	/* last loc for fast name lookup */
398 
399 	daddr_t		i_icb_lbano;	/* Loc of file icb on disk */
400 	uint16_t	i_icb_prn;	/* partition reference number */
401 	kcondvar_t	i_wrcv;		/* sleep/wakeup for write throttle */
402 	uint32_t	i_flag;
403 	uint32_t	i_icb_block;
404 
405 	int16_t		i_astrat;	/* ICB strategy */
406 	int16_t		i_desc_type;	/* Allocation desc type */
407 	int32_t		i_ext_count;	/* Number of extents allocated */
408 	int32_t		i_ext_used;	/* Number of extents used */
409 	struct icb_ext	*i_ext;		/* array of extents */
410 
411 	kmutex_t	i_con_lock;
412 	struct icb_ext	*i_con;
413 	int32_t		i_con_count;
414 	int32_t		i_con_used;
415 	int32_t		i_con_read;
416 
417 	uint32_t	i_cur_max_ext;
418 	vtype_t		i_type;		/* File type */
419 	uint16_t	i_char;		/* File characteristics */
420 	uint16_t	i_perm;		/* File permissions */
421 
422 	uid_t		i_uid;		/* File owner's uid */
423 	gid_t		i_gid;		/* File owner's gid */
424 	uint32_t	i_nlink;	/* number of links to file */
425 	uint32_t	i_maxent;	/* Max entries that are recorded */
426 	u_offset_t	i_size;		/* File size in bytes */
427 	uint64_t	i_lbr;		/* Logical blocks recorded */
428 	uint64_t	i_uniqid;	/* from the file entry */
429 
430 	timespec32_t	i_atime;
431 	timespec32_t	i_mtime;
432 	timespec32_t	i_ctime;
433 
434 	size_t		i_delaylen;	/* delayed writes, units=bytes */
435 	offset_t	i_delayoff;	/* where we started delaying */
436 	offset_t	i_nextrio;	/* where to start the next clust */
437 	uint64_t	i_writes;	/* remaining bytes in write q */
438 	kmutex_t	i_tlock;	/* protects time fields, i_flag */
439 	major_t		i_major;
440 	minor_t		i_minor;
441 
442 	uint32_t	i_marker1;	/* 0xAAAAAAAA */
443 	uint32_t	i_seq;		/* sequence number attribute */
444 	offset_t	i_nextr;	/* next byte read offset (read-ahead) */
445 	long		i_mapcnt;	/* number of mappings of pages */
446 	int		*i_map;		/* block list for the file */
447 	dev_t		i_rdev;		/* INCORE rdev from */
448 	uint32_t	i_marker2;	/* 0xBBBBBBBB */
449 	uint32_t	i_data_off;	/* Data offset into embedded file */
450 	uint32_t	i_max_emb;
451 	uint32_t	i_marker3;
452 };
453 
454 
455 #ifndef	__lint
456 _NOTE(RWLOCK_PROTECTS_DATA(ud_inode::i_contents, ud_inode::i_astrat))
457 _NOTE(RWLOCK_PROTECTS_DATA(ud_inode::i_contents, ud_inode::i_desc_type))
458 _NOTE(RWLOCK_PROTECTS_DATA(ud_inode::i_contents, ud_inode::i_ext_count))
459 _NOTE(RWLOCK_PROTECTS_DATA(ud_inode::i_contents, ud_inode::i_ext_used))
460 _NOTE(RWLOCK_PROTECTS_DATA(ud_inode::i_contents, ud_inode::i_ext))
461 
462 _NOTE(RWLOCK_PROTECTS_DATA(ud_inode::i_contents, ud_inode::i_type))
463 _NOTE(RWLOCK_PROTECTS_DATA(ud_inode::i_contents, ud_inode::i_char))
464 _NOTE(RWLOCK_PROTECTS_DATA(ud_inode::i_contents, ud_inode::i_perm))
465 
466 _NOTE(RWLOCK_PROTECTS_DATA(ud_inode::i_contents, ud_inode::i_uid))
467 _NOTE(RWLOCK_PROTECTS_DATA(ud_inode::i_contents, ud_inode::i_gid))
468 _NOTE(RWLOCK_PROTECTS_DATA(ud_inode::i_contents, ud_inode::i_nlink))
469 _NOTE(RWLOCK_PROTECTS_DATA(ud_inode::i_contents, ud_inode::i_size))
470 _NOTE(RWLOCK_PROTECTS_DATA(ud_inode::i_contents, ud_inode::i_lbr))
471 _NOTE(RWLOCK_PROTECTS_DATA(ud_inode::i_contents, ud_inode::i_uniqid))
472 _NOTE(RWLOCK_PROTECTS_DATA(ud_inode::i_contents, ud_inode::i_major))
473 _NOTE(RWLOCK_PROTECTS_DATA(ud_inode::i_contents, ud_inode::i_minor))
474 
475 _NOTE(MUTEX_PROTECTS_DATA(ud_inode::i_tlock, ud_inode::i_atime))
476 _NOTE(MUTEX_PROTECTS_DATA(ud_inode::i_tlock, ud_inode::i_mtime))
477 _NOTE(MUTEX_PROTECTS_DATA(ud_inode::i_tlock, ud_inode::i_ctime))
478 _NOTE(MUTEX_PROTECTS_DATA(ud_inode::i_tlock, ud_inode::i_delayoff))
479 _NOTE(MUTEX_PROTECTS_DATA(ud_inode::i_tlock, ud_inode::i_delaylen))
480 _NOTE(MUTEX_PROTECTS_DATA(ud_inode::i_tlock, ud_inode::i_nextrio))
481 _NOTE(MUTEX_PROTECTS_DATA(ud_inode::i_tlock, ud_inode::i_writes))
482 _NOTE(MUTEX_PROTECTS_DATA(ud_inode::i_tlock, ud_inode::i_flag))
483 
484 _NOTE(RWLOCK_PROTECTS_DATA(ud_inode::i_contents,
485 		icb_ext::ib_flags icb_ext::ib_prn
486 		icb_ext::ib_block
487 		icb_ext::ib_count icb_ext::ib_offset))
488 #endif
489 
490 
491 /* i_flag */
492 #define	IUPD		0x0001		/* file has been modified */
493 #define	IACC		0x0002		/* inode access time to be updated */
494 #define	IMOD		0x0004		/* inode has been modified */
495 #define	ICHG		0x0008		/* inode has been changed */
496 #define	INOACC		0x0010		/* no access time update in getpage */
497 #define	IMODTIME	0x0020		/* mod time already set */
498 #define	IREF		0x0040		/* inode is being referenced */
499 #define	ISYNC		0x0080		/* do all allocation synchronously */
500 #define	IMODACC		0x0200		/* only access time changed; */
501 #define	IATTCHG		0x0400		/* only size/blocks have changed */
502 #define	IBDWRITE	0x0800		/* the inode has been scheduled for */
503 					/* write operation asynchrously */
504 
505 /*
506  * i_char
507  * Do not change used by MANDLOCK macro in vnode.h
508  */
509 #define	ISUID		VSUID		/* set user id on execution */
510 #define	ISGID		VSGID		/* set group id on execution */
511 #define	ISVTX		VSVTX		/* save swapped text even after use */
512 /*
513  * Setuid	--S---------
514  * Setgid	-G----------
515  * SaveTXT	T-----------
516  */
517 
518 /* i_perm */
519 #define	IEXEC		0x0400		/* read, write, execute permissions */
520 #define	IWRITE		0x0800
521 #define	IREAD		0x1000
522 #define	IATTR		0x2000
523 #define	IDELE		0x4000
524 
525 #define	UP_MASK		0x1CE7
526 #define	VA2UD_PERM(perm)	\
527 	(((perm) & 0x7) | (((perm) & 0x38) << 2) | (((perm) & 0x1C0) << 4))
528 #define	UD2VA_PERM(perm)	\
529 	(((perm) & 0x7) | (((perm) & 0xE0) >> 2) | (((perm) & 0x1C00) >> 4))
530 
531 /*
532  * Permissions
533  * Other	-----------DARWX
534  * Group	------DARWX-----
535  * Owner	-DARWX----------
536  */
537 #define	UD_DPERM2UPERM(dperm)	((((dperm) >> 4) & 0x1C0) |	\
538 					(((dperm) >> 2) & 0x38) |	\
539 					((dperm) & 0x7))
540 #define	UD_UPERM2DPERM(uperm)	((((uperm) & 0x1C0) << 4) |	\
541 					(((uperm) & 0x38) << 2) |	\
542 					((uperm) & 0x7))
543 
544 
545 /* specify how the inode info is written in ud_syncip() */
546 #define	I_SYNC	1	/* wait for the inode written to disk */
547 #define	I_DSYNC	2	/* wait for the inode written to disk */
548 			/* only if IATTCHG is set */
549 #define	I_ASYNC	0	/* don't wait for the inode written */
550 
551 
552 #define	UD_HASH_SZ	512
553 
554 #if ((UD_HASH_SZ & (UD_HASH_SZ - 1)) == 0)
555 #define	UD_INOHASH(dev, bno)	(hash2ints((int)dev, (int)bno) & UD_HASH_SZ - 1)
556 #else
557 #define	UD_INOHASH(dev, bno)	(hash2ints((int)dev, (int)bno) % UD_HASH_SZ)
558 #endif
559 
560 union ihead {
561 	union	ihead		*ih_head[2];
562 	struct	ud_inode	*ih_chain[2];
563 };
564 
565 
566 #define	IMARK(ip) ud_imark(ip)
567 #define	ITIMES_NOLOCK(ip) ud_itimes_nolock(ip)
568 
569 #define	ITIMES(ip) { \
570 	mutex_enter(&(ip)->i_tlock); \
571 	ITIMES_NOLOCK(ip); \
572 	mutex_exit(&(ip)->i_tlock); \
573 }
574 
575 #define	ESAME	(-1)		/* trying to rename linked files (special) */
576 
577 #define	UDF_HOLE	(daddr32_t)-1	/* value used when no block allocated */
578 
579 
580 extern int32_t ud_trace;
581 #define	ud_printf(xyz)	\
582 		if (ud_trace) {	\
583 			cmn_err(CE_NOTE, xyz);	\
584 		}
585 
586 #ifndef	__lint
587 _NOTE(SCHEME_PROTECTS_DATA("Unshared data",
588 		buf
589 		dirent64
590 		fid
591 		flock64
592 		statvfs64
593 		timespec32
594 		udf_fid
595 		uio
596 		vattr
597 		vfs
598 		vnode))
599 
600 _NOTE(SCHEME_PROTECTS_DATA("Unshared data",
601 		file_entry
602 		file_id
603 		icb_tag
604 		indirect_entry
605 		log_vol_int_desc
606 		long_ad
607 		lvid_iu
608 		regid
609 		short_ad
610 		tag
611 		tstamp))
612 
613 _NOTE(LOCK_ORDER(ud_inode::i_rwlock
614 		ud_inode::i_contents
615 		ud_inode::i_tlock))
616 #endif
617 
618 /*
619  * udf_vfsops.c
620  */
621 void		ud_update_superblock(struct vfs *);
622 
623 
624 /*
625  * udf_vnops.c
626  */
627 int32_t		ud_rdwri(enum uio_rw, int32_t, struct ud_inode *, caddr_t,
628 			int32_t, offset_t, enum uio_seg, int32_t *,
629 			struct cred *cr);
630 int32_t		ud_putapage(struct vnode *, page_t *, u_offset_t *,
631 			size_t *, int32_t, struct cred *);
632 
633 
634 /*
635  * udf_inode.c
636  */
637 int32_t		ud_iget(struct vfs *, uint16_t, uint32_t,
638 			struct ud_inode **, struct buf *, struct cred *);
639 void		ud_iinactive(struct ud_inode *, struct cred *);
640 void		ud_iupdat(struct ud_inode *, int32_t);
641 int32_t		ud_itrunc(struct ud_inode *, u_offset_t, int32_t,
642 			struct cred *);
643 int32_t		ud_iaccess(struct ud_inode *, int32_t, struct cred *);
644 int32_t		ud_iflush(struct vfs *);
645 void		ud_imark(struct ud_inode *);
646 void		ud_itimes_nolock(struct ud_inode *);
647 void		ud_delcache(struct ud_inode *);
648 void		ud_idrop(struct ud_inode *);
649 void		ud_init_inodes(void);
650 
651 
652 /*
653  * udf_alloc.c
654  */
655 int32_t		ud_alloc_space(struct vfs *, uint16_t, uint32_t,
656 			uint32_t, uint32_t *, uint32_t *, int32_t, int32_t);
657 void		ud_free_space(struct vfs *, uint16_t, uint32_t, uint32_t);
658 int32_t		ud_ialloc(struct ud_inode *, struct ud_inode **,
659 			struct vattr *, struct cred *);
660 void		ud_ifree(struct ud_inode *, vtype_t);
661 int32_t		ud_freesp(struct vnode *, struct flock64 *, int32_t,
662 			struct cred *);
663 int32_t		ud_alloc_from_cache(struct udf_vfs *, struct ud_part *,
664 			uint32_t *);
665 int32_t		ud_release_cache(struct udf_vfs *);
666 
667 
668 /*
669  * udf_subr.c
670  */
671 void		ud_vfs_add(struct udf_vfs *);
672 void		ud_vfs_remove(struct udf_vfs *);
673 daddr_t		ud_xlate_to_daddr(struct udf_vfs *, uint16_t,
674 			uint32_t, int32_t, uint32_t *);
675 int32_t		ud_ip_off2bno(struct ud_inode *, uint32_t, uint32_t *);
676 void		ud_dtime2utime(struct timespec32 *, struct tstamp const *);
677 void		ud_utime2dtime(struct timespec32 const *, struct tstamp *);
678 int32_t		ud_syncip(struct ud_inode *, int32_t, int32_t);
679 void		ud_update(int32_t);
680 int32_t		ud_fbwrite(struct fbuf *, struct ud_inode *);
681 void		ud_sbwrite(struct udf_vfs *);
682 int32_t		ud_sync_indir(struct ud_inode *);
683 void		ud_update_regid(struct regid *);
684 int32_t		ud_read_icb_till_off(struct ud_inode *, u_offset_t);
685 void		ud_make_tag(struct udf_vfs *, struct tag *,
686 			uint16_t, uint32_t, uint16_t);
687 int32_t		ud_make_dev_spec_ear(struct dev_spec_ear *, major_t, minor_t);
688 int32_t		ud_make_ftimes_ear(struct ftimes_ear *,
689 			int32_t, struct timespec32 *);
690 int32_t		ud_get_next_fid(struct ud_inode *, struct fbuf **, uint32_t,
691 			struct file_id **, uint8_t **, uint8_t *);
692 int32_t		ud_verify_tag_and_desc(struct tag *, uint16_t, uint32_t,
693 		int32_t, int32_t);
694 uint16_t	ud_crc(uint8_t *, int32_t);
695 int32_t		ud_compressunicode(int32_t, int32_t, uint16_t *, uint8_t *);
696 uint32_t	ud_check_te_unrec(struct udf_vfs *, caddr_t, uint32_t);
697 int32_t		ud_compress(int32_t, int32_t *, uint8_t *, uint8_t *);
698 int32_t		ud_uncompress(int32_t, int32_t *, uint8_t *, uint8_t *);
699 struct buf	*ud_bread(dev_t, daddr_t, long);
700 int		ud_sticky_remove_access(struct ud_inode *, struct ud_inode *,
701 			struct cred *);
702 
703 
704 /*
705  * udf_dir.c
706  */
707 int32_t		ud_dirlook(struct ud_inode *,
708 			char *, struct ud_inode **, struct cred *, int32_t);
709 int32_t		ud_direnter(struct ud_inode *, char *, enum de_op,
710 			struct ud_inode *, struct ud_inode *, struct vattr *,
711 			struct ud_inode **, struct cred *, caller_context_t *);
712 int32_t		ud_dirremove(struct ud_inode *,
713 			char *, struct ud_inode *, struct vnode *,
714 			enum dr_op, struct cred *, caller_context_t *);
715 
716 
717 /*
718  * udf_bmap.c
719  */
720 int32_t		ud_bmap_has_holes(struct ud_inode *);
721 int32_t		ud_bmap_write(struct ud_inode *, u_offset_t,
722 			int, int32_t, struct cred *);
723 int32_t		ud_bmap_read(struct ud_inode *, u_offset_t,
724 			daddr_t *, int32_t *);
725 void		ud_insert_new_ext(struct ud_inode *,
726 			int32_t, struct icb_ext *);
727 int32_t		ud_alloc_and_make_ext(struct ud_inode *, int32_t);
728 int32_t		ud_create_new_icb(struct ud_inode *);
729 void		ud_append_new_ext(struct ud_inode *, uint16_t,
730 			u_offset_t, uint32_t, uint16_t, uint32_t);
731 
732 
733 #ifdef	__cplusplus
734 }
735 #endif
736 
737 #endif	/* _SYS_FS_UDF_INODE_H */
738