Home | History | Annotate | Line # | Download | only in udf
udf.h revision 1.27.4.3.4.1
      1  1.27.4.3.4.1      matt /* $NetBSD: udf.h,v 1.27.4.3.4.1 2010/04/21 00:28:14 matt Exp $ */
      2           1.1   reinoud 
      3           1.1   reinoud /*
      4          1.11   reinoud  * Copyright (c) 2006, 2008 Reinoud Zandijk
      5           1.1   reinoud  * All rights reserved.
      6           1.1   reinoud  *
      7           1.1   reinoud  * Redistribution and use in source and binary forms, with or without
      8           1.1   reinoud  * modification, are permitted provided that the following conditions
      9           1.1   reinoud  * are met:
     10           1.1   reinoud  * 1. Redistributions of source code must retain the above copyright
     11           1.1   reinoud  *    notice, this list of conditions and the following disclaimer.
     12           1.1   reinoud  * 2. Redistributions in binary form must reproduce the above copyright
     13           1.1   reinoud  *    notice, this list of conditions and the following disclaimer in the
     14           1.1   reinoud  *    documentation and/or other materials provided with the distribution.
     15           1.1   reinoud  *
     16           1.1   reinoud  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
     17           1.1   reinoud  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
     18           1.1   reinoud  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
     19           1.1   reinoud  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
     20           1.1   reinoud  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
     21           1.1   reinoud  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     22           1.1   reinoud  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     23           1.1   reinoud  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     24           1.1   reinoud  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
     25           1.1   reinoud  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     26           1.1   reinoud  *
     27           1.1   reinoud  */
     28           1.1   reinoud 
     29           1.4  christos #ifndef _FS_UDF_UDF_H_
     30           1.4  christos #define _FS_UDF_UDF_H_
     31           1.1   reinoud 
     32           1.1   reinoud #include <sys/queue.h>
     33  1.27.4.3.4.1      matt #include <sys/rb.h>
     34           1.1   reinoud #include <sys/uio.h>
     35          1.10        ad #include <sys/mutex.h>
     36           1.1   reinoud 
     37           1.1   reinoud #include "udf_osta.h"
     38           1.1   reinoud #include "ecma167-udf.h"
     39           1.1   reinoud #include <sys/cdio.h>
     40          1.11   reinoud #include <sys/bufq.h>
     41          1.11   reinoud #include <sys/disk.h>
     42          1.11   reinoud #include <sys/kthread.h>
     43           1.1   reinoud #include <miscfs/genfs/genfs_node.h>
     44           1.1   reinoud 
     45           1.1   reinoud /* debug section */
     46           1.1   reinoud extern int udf_verbose;
     47           1.1   reinoud 
     48          1.11   reinoud /* undefine UDF_COMPLETE_DELETE to need `purge'; but purge is not implemented */
     49          1.11   reinoud #define UDF_COMPLETE_DELETE
     50           1.1   reinoud 
     51           1.1   reinoud /* debug categories */
     52  1.27.4.3.4.1      matt #define UDF_DEBUG_VOLUMES	0x0000001
     53  1.27.4.3.4.1      matt #define UDF_DEBUG_LOCKING	0x0000002
     54  1.27.4.3.4.1      matt #define UDF_DEBUG_NODE		0x0000004
     55  1.27.4.3.4.1      matt #define UDF_DEBUG_LOOKUP	0x0000008
     56  1.27.4.3.4.1      matt #define UDF_DEBUG_READDIR	0x0000010
     57  1.27.4.3.4.1      matt #define UDF_DEBUG_FIDS		0x0000020
     58  1.27.4.3.4.1      matt #define UDF_DEBUG_DESCRIPTOR	0x0000040
     59  1.27.4.3.4.1      matt #define UDF_DEBUG_TRANSLATE	0x0000080
     60  1.27.4.3.4.1      matt #define UDF_DEBUG_STRATEGY	0x0000100
     61  1.27.4.3.4.1      matt #define UDF_DEBUG_READ		0x0000200
     62  1.27.4.3.4.1      matt #define UDF_DEBUG_WRITE		0x0000400
     63  1.27.4.3.4.1      matt #define UDF_DEBUG_CALL		0x0000800
     64  1.27.4.3.4.1      matt #define UDF_DEBUG_ATTR		0x0001000
     65  1.27.4.3.4.1      matt #define UDF_DEBUG_EXTATTR	0x0002000
     66  1.27.4.3.4.1      matt #define UDF_DEBUG_ALLOC		0x0004000
     67  1.27.4.3.4.1      matt #define UDF_DEBUG_ADWLK		0x0008000
     68  1.27.4.3.4.1      matt #define UDF_DEBUG_DIRHASH	0x0010000
     69  1.27.4.3.4.1      matt #define UDF_DEBUG_NOTIMPL	0x0020000
     70  1.27.4.3.4.1      matt #define UDF_DEBUG_SHEDULE	0x0040000
     71  1.27.4.3.4.1      matt #define UDF_DEBUG_ECCLINE	0x0080000
     72  1.27.4.3.4.1      matt #define UDF_DEBUG_SYNC		0x0100000
     73  1.27.4.3.4.1      matt #define UDF_DEBUG_PARANOIA	0x0200000
     74  1.27.4.3.4.1      matt #define UDF_DEBUG_PARANOIDADWLK	0x0400000
     75  1.27.4.3.4.1      matt #define UDF_DEBUG_NODEDUMP	0x0800000
     76  1.27.4.3.4.1      matt #define UDF_DEBUG_RESERVE	0x1000000
     77          1.11   reinoud 
     78          1.11   reinoud /* initial value of udf_verbose */
     79          1.11   reinoud #define UDF_DEBUGGING		0
     80           1.1   reinoud 
     81           1.8   reinoud #ifdef DEBUG
     82           1.1   reinoud #define DPRINTF(name, arg) { \
     83           1.1   reinoud 		if (udf_verbose & UDF_DEBUG_##name) {\
     84           1.1   reinoud 			printf arg;\
     85           1.1   reinoud 		};\
     86           1.1   reinoud 	}
     87           1.1   reinoud #define DPRINTFIF(name, cond, arg) { \
     88           1.1   reinoud 		if (udf_verbose & UDF_DEBUG_##name) { \
     89           1.1   reinoud 			if (cond) printf arg;\
     90           1.1   reinoud 		};\
     91           1.1   reinoud 	}
     92           1.1   reinoud #else
     93           1.1   reinoud #define DPRINTF(name, arg) {}
     94           1.1   reinoud #define DPRINTFIF(name, cond, arg) {}
     95           1.1   reinoud #endif
     96           1.1   reinoud 
     97           1.1   reinoud 
     98           1.1   reinoud /* constants to identify what kind of identifier we are dealing with */
     99           1.1   reinoud #define UDF_REGID_DOMAIN		 1
    100           1.1   reinoud #define UDF_REGID_UDF			 2
    101           1.1   reinoud #define UDF_REGID_IMPLEMENTATION	 3
    102           1.1   reinoud #define UDF_REGID_APPLICATION		 4
    103           1.1   reinoud #define UDF_REGID_NAME			99
    104           1.1   reinoud 
    105           1.1   reinoud 
    106           1.1   reinoud /* DON'T change these: they identify 13thmonkey's UDF implementation */
    107           1.1   reinoud #define APP_NAME		"*NetBSD UDF"
    108          1.11   reinoud #define APP_VERSION_MAIN	0
    109  1.27.4.3.4.1      matt #define APP_VERSION_SUB		5
    110          1.11   reinoud #define IMPL_NAME		"*NetBSD kernel UDF"
    111           1.1   reinoud 
    112           1.1   reinoud 
    113           1.1   reinoud /* Configuration values */
    114           1.1   reinoud #define UDF_INODE_HASHBITS 	10
    115           1.1   reinoud #define UDF_INODE_HASHSIZE	(1<<UDF_INODE_HASHBITS)
    116           1.1   reinoud #define UDF_INODE_HASHMASK	(UDF_INODE_HASHSIZE - 1)
    117          1.11   reinoud #define UDF_ECCBUF_HASHBITS	10
    118          1.11   reinoud #define UDF_ECCBUF_HASHSIZE	(1<<UDF_ECCBUF_HASHBITS)
    119          1.11   reinoud #define UDF_ECCBUF_HASHMASK	(UDF_ECCBUF_HASHSIZE -1)
    120          1.11   reinoud 
    121      1.27.4.1       snj #define UDF_ECCLINE_MAXFREE	5			/* picked, needs calculation */
    122  1.27.4.3.4.1      matt #define UDF_ECCLINE_MAXBUSY	100			/* picked, needs calculation */
    123          1.11   reinoud 
    124          1.11   reinoud #define UDF_MAX_MAPPINGS	(MAXPHYS/DEV_BSIZE)	/* 128 */
    125          1.11   reinoud #define UDF_VAT_CHUNKSIZE	(64*1024)		/* picked */
    126          1.11   reinoud #define UDF_SYMLINKBUFLEN	(64*1024)		/* picked */
    127           1.1   reinoud 
    128  1.27.4.3.4.1      matt #define UDF_DISC_SLACK		(128)			/* picked, at least 64 kb or 128 */
    129      1.27.4.3       snj #define UDF_ISO_VRS_SIZE	(32*2048)		/* 32 ISO `sectors' */
    130      1.27.4.3       snj 
    131           1.1   reinoud 
    132           1.1   reinoud /* structure space */
    133           1.1   reinoud #define UDF_ANCHORS		4	/* 256, 512, N-256, N */
    134           1.1   reinoud #define UDF_PARTITIONS		4	/* overkill */
    135          1.11   reinoud #define UDF_PMAPS		5	/* overkill */
    136          1.11   reinoud #define UDF_LVDINT_SEGMENTS	100	/* big overkill */
    137          1.11   reinoud #define UDF_LVINT_LOSSAGE	4	/* lose 2 openings */
    138          1.13   reinoud #define UDF_MAX_ALLOC_EXTENTS	50	/* overkill */
    139           1.1   reinoud 
    140           1.1   reinoud 
    141           1.1   reinoud /* constants */
    142           1.1   reinoud #define UDF_MAX_NAMELEN		255			/* as per SPEC */
    143           1.1   reinoud #define UDF_TRANS_ZERO		((uint64_t) -1)
    144           1.1   reinoud #define UDF_TRANS_UNMAPPED	((uint64_t) -2)
    145           1.1   reinoud #define UDF_TRANS_INTERN	((uint64_t) -3)
    146           1.1   reinoud #define UDF_MAX_SECTOR		((uint64_t) -10)	/* high water mark */
    147           1.1   reinoud 
    148           1.1   reinoud 
    149          1.11   reinoud /* RW content hint for allocation and other purposes */
    150      1.27.4.3       snj #define UDF_C_ABSOLUTE		 0	/* blob to write at absolute */
    151          1.24   reinoud #define UDF_C_PROCESSED		 0	/* not relevant */
    152          1.24   reinoud #define UDF_C_USERDATA		 1	/* all but userdata is metadata */
    153          1.24   reinoud #define UDF_C_DSCR		 2	/* update sectornr and CRC */
    154      1.27.4.3       snj #define UDF_C_FLOAT_DSCR	 3	/* update sectornr and CRC; sequential */
    155      1.27.4.3       snj #define UDF_C_NODE		 4	/* file/dir node, update sectornr and CRC */
    156      1.27.4.3       snj #define UDF_C_FIDS		 5	/* update all contained fids */
    157      1.27.4.3       snj #define UDF_C_METADATA_SBM	 6	/* space bitmap, update sectornr and CRC */
    158      1.27.4.3       snj #define UDF_C_EXTATTRS		 7	/* dunno what to do yet */
    159          1.11   reinoud 
    160          1.11   reinoud /* use unused b_freelistindex for our UDF_C_TYPE */
    161          1.11   reinoud #define b_udf_c_type	b_freelistindex
    162          1.11   reinoud 
    163          1.11   reinoud 
    164          1.11   reinoud /* virtual to physical mapping types */
    165          1.11   reinoud #define UDF_VTOP_RAWPART UDF_PMAPS	/* [0..UDF_PMAPS> are normal     */
    166          1.11   reinoud 
    167          1.11   reinoud #define UDF_VTOP_TYPE_RAW            0
    168          1.11   reinoud #define UDF_VTOP_TYPE_UNKNOWN        0
    169          1.11   reinoud #define UDF_VTOP_TYPE_PHYS           1
    170          1.11   reinoud #define UDF_VTOP_TYPE_VIRT           2
    171          1.11   reinoud #define UDF_VTOP_TYPE_SPARABLE       3
    172          1.11   reinoud #define UDF_VTOP_TYPE_META           4
    173          1.11   reinoud 
    174          1.11   reinoud 
    175          1.11   reinoud /* allocation strategies */
    176          1.26   reinoud #define UDF_ALLOC_INVALID            0
    177          1.11   reinoud #define UDF_ALLOC_SEQUENTIAL         1  /* linear on NWA                 */
    178          1.11   reinoud #define UDF_ALLOC_VAT                2  /* VAT handling                  */
    179          1.11   reinoud #define UDF_ALLOC_SPACEMAP           3  /* spacemaps                     */
    180          1.11   reinoud #define UDF_ALLOC_METABITMAP         4  /* metadata bitmap               */
    181          1.11   reinoud #define UDF_ALLOC_METASEQUENTIAL     5  /* in chunks seq., nodes not seq */
    182          1.11   reinoud #define UDF_ALLOC_RELAXEDSEQUENTIAL  6  /* only nodes not seq.           */
    183          1.11   reinoud 
    184          1.11   reinoud 
    185          1.11   reinoud /* logical volume open/close actions */
    186          1.11   reinoud #define UDF_OPEN_SESSION	  0x01  /* if needed writeout VRS + VDS	     */
    187          1.11   reinoud #define UDF_CLOSE_SESSION	  0x02	/* close session after writing VAT   */
    188      1.27.4.3       snj #define UDF_FINALISE_DISC	  0x04	/* close session after writing VAT   */
    189      1.27.4.3       snj #define UDF_WRITE_VAT		  0x08	/* sequential VAT filesystem         */
    190      1.27.4.3       snj #define UDF_WRITE_LVINT		  0x10	/* write out open lvint              */
    191      1.27.4.3       snj #define UDF_WRITE_PART_BITMAPS	  0x20	/* write out partition space bitmaps */
    192      1.27.4.3       snj #define UDF_APPENDONLY_LVINT	  0x40	/* no shifting, only appending       */
    193      1.27.4.3       snj #define UDFLOGVOL_BITS "\20\1OPEN_SESSION\2CLOSE_SESSION\3FINALISE_DISC" \
    194      1.27.4.3       snj 			"\4WRITE_VAT\5WRITE_LVINT\6WRITE_PART_BITMAPS" \
    195      1.27.4.3       snj 			"\7APPENDONLY_LVINT"
    196          1.11   reinoud 
    197          1.11   reinoud /* logical volume error handling actions */
    198          1.11   reinoud #define UDF_UPDATE_TRACKINFO	  0x01	/* update trackinfo and re-shedule   */
    199          1.11   reinoud #define UDF_REMAP_BLOCK		  0x02	/* remap the failing block length    */
    200          1.11   reinoud #define UDFONERROR_BITS "\20\1UPDATE_TRACKINFO\2REMAP_BLOCK"
    201          1.11   reinoud 
    202          1.11   reinoud 
    203          1.11   reinoud /* readdir cookies */
    204          1.11   reinoud #define UDF_DIRCOOKIE_DOT 1
    205          1.11   reinoud 
    206          1.11   reinoud 
    207           1.1   reinoud /* malloc pools */
    208           1.1   reinoud MALLOC_DECLARE(M_UDFMNT);
    209           1.1   reinoud MALLOC_DECLARE(M_UDFVOLD);
    210           1.1   reinoud MALLOC_DECLARE(M_UDFTEMP);
    211           1.1   reinoud 
    212           1.1   reinoud struct pool udf_node_pool;
    213          1.11   reinoud struct udf_node;
    214          1.11   reinoud struct udf_strategy;
    215          1.11   reinoud 
    216          1.11   reinoud 
    217          1.11   reinoud struct udf_lvintq {
    218          1.11   reinoud 	uint32_t		start;
    219          1.11   reinoud 	uint32_t		end;
    220          1.11   reinoud 	uint32_t		pos;
    221          1.11   reinoud 	uint32_t		wpos;
    222          1.11   reinoud };
    223          1.11   reinoud 
    224          1.11   reinoud 
    225          1.11   reinoud struct udf_bitmap {
    226          1.11   reinoud 	uint8_t			*blob;			/* allocated         */
    227          1.11   reinoud 	uint8_t			*bits;			/* bits themselves   */
    228          1.11   reinoud 	uint8_t			*pages;			/* dirty pages       */
    229          1.11   reinoud 	uint32_t		 max_offset;		/* in bits           */
    230          1.11   reinoud 	uint32_t		 data_pos;		/* position in data  */
    231          1.11   reinoud 	uint32_t		 metadata_pos;		/* .. in metadata    */
    232          1.11   reinoud };
    233          1.11   reinoud 
    234          1.11   reinoud 
    235          1.11   reinoud struct udf_strat_args {
    236          1.11   reinoud 	struct udf_mount *ump;
    237          1.11   reinoud 	struct udf_node  *udf_node;
    238          1.11   reinoud 	struct long_ad   *icb;
    239          1.11   reinoud 	union dscrptr    *dscr;
    240          1.11   reinoud 	struct buf       *nestbuf;
    241          1.11   reinoud 	kauth_cred_t	  cred;
    242          1.11   reinoud 	int waitfor;
    243          1.11   reinoud };
    244          1.11   reinoud 
    245          1.11   reinoud struct udf_strategy {
    246          1.11   reinoud 	int  (*create_logvol_dscr)  (struct udf_strat_args *args);
    247          1.11   reinoud 	void (*free_logvol_dscr)    (struct udf_strat_args *args);
    248          1.11   reinoud 	int  (*read_logvol_dscr)    (struct udf_strat_args *args);
    249          1.11   reinoud 	int  (*write_logvol_dscr)   (struct udf_strat_args *args);
    250          1.11   reinoud 	void (*queuebuf)	    (struct udf_strat_args *args);
    251          1.11   reinoud 	void (*discstrat_init)      (struct udf_strat_args *args);
    252          1.11   reinoud 	void (*discstrat_finish)    (struct udf_strat_args *args);
    253          1.11   reinoud };
    254          1.11   reinoud 
    255          1.11   reinoud extern struct udf_strategy udf_strat_bootstrap;
    256          1.11   reinoud extern struct udf_strategy udf_strat_sequential;
    257          1.11   reinoud extern struct udf_strategy udf_strat_direct;
    258          1.11   reinoud extern struct udf_strategy udf_strat_rmw;
    259           1.1   reinoud 
    260           1.1   reinoud 
    261           1.1   reinoud /* pre cleanup */
    262           1.1   reinoud struct udf_mount {
    263           1.1   reinoud 	struct mount		*vfs_mountp;
    264           1.1   reinoud 	struct vnode		*devvp;
    265           1.1   reinoud 	struct mmc_discinfo	 discinfo;
    266           1.1   reinoud 	struct udf_args		 mount_args;
    267           1.1   reinoud 
    268          1.11   reinoud 	/* format descriptors */
    269          1.11   reinoud 	kmutex_t		 logvol_mutex;
    270           1.1   reinoud 	struct anchor_vdp	*anchors[UDF_ANCHORS];	/* anchors to VDS    */
    271           1.1   reinoud 	struct pri_vol_desc	*primary_vol;		/* identification    */
    272           1.1   reinoud 	struct logvol_desc	*logical_vol;		/* main mapping v->p */
    273           1.1   reinoud 	struct unalloc_sp_desc	*unallocated;		/* free UDF space    */
    274           1.1   reinoud 	struct impvol_desc	*implementation;	/* likely reduntant  */
    275           1.1   reinoud 	struct logvol_int_desc	*logvol_integrity;	/* current integrity */
    276           1.1   reinoud 	struct part_desc	*partitions[UDF_PARTITIONS]; /* partitions   */
    277          1.11   reinoud 	/* logvol_info is derived; points *into* other structures */
    278           1.1   reinoud 	struct udf_logvol_info	*logvol_info;		/* integrity descr.  */
    279           1.1   reinoud 
    280           1.1   reinoud 	/* fileset and root directories */
    281           1.1   reinoud 	struct fileset_desc	*fileset_desc;		/* normally one      */
    282           1.1   reinoud 
    283          1.11   reinoud 	/* tracing logvol integrity history */
    284          1.11   reinoud 	struct udf_lvintq	 lvint_trace[UDF_LVDINT_SEGMENTS];
    285          1.11   reinoud 	int			 lvopen;		/* logvol actions    */
    286          1.11   reinoud 	int			 lvclose;		/* logvol actions    */
    287          1.11   reinoud 
    288          1.26   reinoud 	/* logical to physical translations */
    289          1.26   reinoud 	int 			 vtop[UDF_PMAPS+1];	/* vpartnr trans     */
    290          1.26   reinoud 	int			 vtop_tp[UDF_PMAPS+1];	/* type of trans     */
    291          1.26   reinoud 
    292          1.11   reinoud 	/* disc allocation / writing method */
    293          1.26   reinoud 	kmutex_t		 allocate_mutex;
    294          1.19   reinoud 	int			 lvreadwrite;		/* error handling    */
    295          1.26   reinoud 	int			 vtop_alloc[UDF_PMAPS+1]; /* alloc scheme    */
    296          1.11   reinoud 	int			 data_part;
    297          1.26   reinoud 	int			 node_part;
    298          1.26   reinoud 	int			 fids_part;
    299           1.1   reinoud 
    300          1.11   reinoud 	/* sequential track info */
    301          1.11   reinoud 	struct mmc_trackinfo	 data_track;
    302          1.11   reinoud 	struct mmc_trackinfo	 metadata_track;
    303          1.11   reinoud 
    304           1.5   reinoud 	/* VAT */
    305           1.5   reinoud 	uint32_t		 first_possible_vat_location;
    306           1.5   reinoud 	uint32_t		 last_possible_vat_location;
    307           1.1   reinoud 	uint32_t		 vat_entries;
    308           1.1   reinoud 	uint32_t		 vat_offset;		/* offset in table   */
    309          1.11   reinoud 	uint32_t		 vat_last_free_lb;	/* last free lb_num  */
    310          1.11   reinoud 	uint32_t		 vat_table_len;
    311          1.11   reinoud 	uint32_t		 vat_table_alloc_len;
    312          1.11   reinoud 	uint8_t			*vat_table;
    313          1.11   reinoud 	uint8_t			*vat_pages;		/* TODO */
    314          1.11   reinoud 	struct udf_node		*vat_node;		/* system node       */
    315          1.11   reinoud 
    316          1.22   reinoud 	/* space bitmaps for physical partitions */
    317          1.11   reinoud 	struct space_bitmap_desc*part_unalloc_dscr[UDF_PARTITIONS];
    318          1.11   reinoud 	struct space_bitmap_desc*part_freed_dscr  [UDF_PARTITIONS];
    319          1.11   reinoud 	struct udf_bitmap	 part_unalloc_bits[UDF_PARTITIONS];
    320          1.11   reinoud 	struct udf_bitmap	 part_freed_bits  [UDF_PARTITIONS];
    321           1.1   reinoud 
    322           1.5   reinoud 	/* sparable */
    323          1.11   reinoud 	uint32_t		 sparable_packet_size;
    324          1.11   reinoud 	uint32_t		 packet_size;
    325           1.1   reinoud 	struct udf_sparing_table*sparing_table;
    326           1.1   reinoud 
    327           1.5   reinoud 	/* meta */
    328          1.11   reinoud 	struct udf_node 	*metadata_node;		/* system node       */
    329          1.11   reinoud 	struct udf_node 	*metadatamirror_node;	/* system node       */
    330          1.11   reinoud 	struct udf_node 	*metadatabitmap_node;	/* system node       */
    331          1.25   reinoud 	struct space_bitmap_desc*metadata_unalloc_dscr;
    332          1.25   reinoud 	struct udf_bitmap	 metadata_unalloc_bits;
    333           1.1   reinoud 
    334          1.11   reinoud 	/* hash table to lookup icb -> udf_node and sorted list for sync */
    335          1.11   reinoud 	kmutex_t	ihash_lock;
    336          1.11   reinoud 	kmutex_t	get_node_lock;
    337  1.27.4.3.4.1      matt 	struct rb_tree	udf_node_tree;
    338           1.1   reinoud 
    339          1.11   reinoud 	/* syncing */
    340          1.11   reinoud 	int		syncing;			/* are we syncing?   */
    341          1.11   reinoud 	kcondvar_t 	dirtynodes_cv;			/* sleeping on sync  */
    342          1.11   reinoud 
    343          1.11   reinoud 	/* late allocation */
    344  1.27.4.3.4.1      matt 	int32_t			 uncommitted_lbs[UDF_PARTITIONS];
    345          1.11   reinoud 	struct long_ad		*la_node_ad_cpy;		/* issue buf */
    346          1.11   reinoud 	uint64_t		*la_lmapping, *la_pmapping;	/* issue buf */
    347           1.1   reinoud 
    348           1.1   reinoud 	/* lists */
    349           1.1   reinoud 	STAILQ_HEAD(udfmntpts, udf_mount) all_udf_mntpnts;
    350          1.11   reinoud 
    351          1.11   reinoud 	/* device strategy */
    352          1.11   reinoud 	struct udf_strategy	*strategy;
    353          1.11   reinoud 	void			*strategy_private;
    354           1.1   reinoud };
    355           1.1   reinoud 
    356          1.18   reinoud 
    357  1.27.4.3.4.1      matt #define RBTOUDFNODE(node) \
    358  1.27.4.3.4.1      matt 	((node) ? \
    359  1.27.4.3.4.1      matt 	 (void *)((uintptr_t)(node) - offsetof(struct udf_node, rbnode)) \
    360  1.27.4.3.4.1      matt 	 : NULL)
    361  1.27.4.3.4.1      matt 
    362          1.11   reinoud /*
    363          1.11   reinoud  * UDF node describing a file/directory.
    364          1.11   reinoud  *
    365          1.11   reinoud  * BUGALERT claim node_mutex before reading/writing to prevent inconsistencies !
    366          1.11   reinoud  */
    367           1.1   reinoud struct udf_node {
    368           1.1   reinoud 	struct genfs_node	i_gnode;		/* has to be first   */
    369           1.1   reinoud 	struct vnode		*vnode;			/* vnode associated  */
    370           1.1   reinoud 	struct udf_mount	*ump;
    371           1.1   reinoud 
    372          1.11   reinoud 	kmutex_t		 node_mutex;
    373          1.11   reinoud 	kcondvar_t		 node_lock;		/* sleeping lock */
    374          1.11   reinoud 	char const		*lock_fname;
    375          1.11   reinoud 	int			 lock_lineno;
    376          1.11   reinoud 
    377  1.27.4.3.4.1      matt 	/* rb_node for fast lookup and fast sequentual visiting */
    378  1.27.4.3.4.1      matt 	struct rb_node		 rbnode;
    379  1.27.4.3.4.1      matt 
    380           1.1   reinoud 	/* one of `fe' or `efe' can be set, not both (UDF file entry dscr.)  */
    381           1.1   reinoud 	struct file_entry	*fe;
    382           1.1   reinoud 	struct extfile_entry	*efe;
    383          1.11   reinoud 	struct alloc_ext_entry	*ext[UDF_MAX_ALLOC_EXTENTS];
    384          1.11   reinoud 	int			 num_extensions;
    385           1.1   reinoud 
    386          1.11   reinoud 	/* location found, recording location & hints */
    387           1.1   reinoud 	struct long_ad		 loc;			/* FID/hash loc.     */
    388          1.11   reinoud 	struct long_ad		 write_loc;		/* strat 4096 loc    */
    389           1.1   reinoud 	int			 needs_indirect;	/* has missing indr. */
    390          1.11   reinoud 	struct long_ad		 ext_loc[UDF_MAX_ALLOC_EXTENTS];
    391          1.11   reinoud 
    392          1.27   reinoud 	struct dirhash		*dir_hash;
    393           1.1   reinoud 
    394           1.1   reinoud 	/* misc */
    395          1.11   reinoud 	uint32_t		 i_flags;		/* associated flags  */
    396           1.1   reinoud 	struct lockf		*lockf;			/* lock list         */
    397          1.11   reinoud 	uint32_t		 outstanding_bufs;	/* file data         */
    398          1.11   reinoud 	uint32_t		 outstanding_nodedscr;	/* node dscr         */
    399  1.27.4.3.4.1      matt 	int32_t			 uncommitted_lbs;	/* in UBC            */
    400           1.1   reinoud 
    401          1.11   reinoud 	/* references to associated nodes */
    402           1.1   reinoud 	struct udf_node		*extattr;
    403           1.1   reinoud 	struct udf_node		*streamdir;
    404          1.11   reinoud 	struct udf_node		*my_parent;		/* if extended attr. */
    405           1.1   reinoud };
    406           1.1   reinoud 
    407          1.11   reinoud 
    408          1.11   reinoud /* misc. flags stored in i_flags (XXX needs cleaning up) */
    409          1.18   reinoud #define	IN_ACCESS		0x0001	/* Inode access time update request  */
    410          1.18   reinoud #define	IN_CHANGE		0x0002	/* Inode change time update request  */
    411          1.18   reinoud #define	IN_UPDATE		0x0004	/* Inode was written to; update mtime*/
    412          1.18   reinoud #define	IN_MODIFY		0x0008	/* Modification time update request  */
    413          1.18   reinoud #define	IN_MODIFIED		0x0010	/* node has been modified */
    414          1.18   reinoud #define	IN_ACCESSED		0x0020	/* node has been accessed */
    415          1.18   reinoud #define	IN_RENAME		0x0040	/* node is being renamed. XXX ?? */
    416          1.18   reinoud #define	IN_DELETED		0x0080	/* node is unlinked, no FID reference*/
    417          1.18   reinoud #define	IN_LOCKED		0x0100	/* node is locked by condvar */
    418          1.18   reinoud #define	IN_SYNCED		0x0200	/* node is being used by sync */
    419          1.18   reinoud #define	IN_CALLBACK_ULK		0x0400	/* node will be unlocked by callback */
    420          1.18   reinoud #define	IN_NODE_REBUILD		0x0800	/* node is rebuild */
    421          1.11   reinoud 
    422          1.11   reinoud 
    423          1.11   reinoud #define IN_FLAGBITS \
    424          1.11   reinoud 	"\10\1IN_ACCESS\2IN_CHANGE\3IN_UPDATE\4IN_MODIFY\5IN_MODIFIED" \
    425          1.11   reinoud 	"\6IN_ACCESSED\7IN_RENAME\10IN_DELETED\11IN_LOCKED\12IN_SYNCED" \
    426          1.21   reinoud 	"\13IN_CALLBACK_ULK\14IN_NODE_REBUILD"
    427          1.11   reinoud 
    428           1.3   reinoud #endif /* !_FS_UDF_UDF_H_ */
    429