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