1 /* $NetBSD: udf.h,v 1.4 2006/02/02 21:58:40 christos Exp $ */ 2 3 /* 4 * Copyright (c) 2006 Reinoud Zandijk 5 * All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 1. Redistributions of source code must retain the above copyright 11 * notice, this list of conditions and the following disclaimer. 12 * 2. Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 3. All advertising materials mentioning features or use of this software 16 * must display the following acknowledgement: 17 * This product includes software developed for the 18 * NetBSD Project. See http://www.NetBSD.org/ for 19 * information about NetBSD. 20 * 4. The name of the author may not be used to endorse or promote products 21 * derived from this software without specific prior written permission. 22 * 23 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 24 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 25 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 26 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 27 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 28 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 29 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 30 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 31 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 32 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 33 * 34 */ 35 36 #ifndef _FS_UDF_UDF_H_ 37 #define _FS_UDF_UDF_H_ 38 39 #include <sys/queue.h> 40 #include <sys/uio.h> 41 42 #include "udf_osta.h" 43 #include "ecma167-udf.h" 44 #include <sys/cdio.h> 45 #include <miscfs/genfs/genfs_node.h> 46 47 /* TODO make `udf_verbose' set by sysctl */ 48 /* debug section */ 49 extern int udf_verbose; 50 51 /* initial value of udf_verbose */ 52 #define UDF_DEBUGGING 0x000 53 54 /* debug categories */ 55 #define UDF_DEBUG_VOLUMES 0x001 56 #define UDF_DEBUG_LOCKING 0x002 57 #define UDF_DEBUG_NODE 0x004 58 #define UDF_DEBUG_LOOKUP 0x008 59 #define UDF_DEBUG_READDIR 0x010 60 #define UDF_DEBUG_FIDS 0x020 61 #define UDF_DEBUG_DESCRIPTOR 0x040 62 #define UDF_DEBUG_TRANSLATE 0x080 63 #define UDF_DEBUG_STRATEGY 0x100 64 #define UDF_DEBUG_READ 0x200 65 #define UDF_DEBUG_CALL 0x400 66 #define UDF_DEBUG_NOTIMPL UDF_DEBUG_CALL 67 68 69 #ifdef DEBUG 70 #define DPRINTF(name, arg) { \ 71 if (udf_verbose & UDF_DEBUG_##name) {\ 72 printf arg;\ 73 };\ 74 } 75 #define DPRINTFIF(name, cond, arg) { \ 76 if (udf_verbose & UDF_DEBUG_##name) { \ 77 if (cond) printf arg;\ 78 };\ 79 } 80 #else 81 #define DPRINTF(name, arg) {} 82 #define DPRINTFIF(name, cond, arg) {} 83 #endif 84 85 86 /* constants to identify what kind of identifier we are dealing with */ 87 #define UDF_REGID_DOMAIN 1 88 #define UDF_REGID_UDF 2 89 #define UDF_REGID_IMPLEMENTATION 3 90 #define UDF_REGID_APPLICATION 4 91 #define UDF_REGID_NAME 99 92 93 94 /* DON'T change these: they identify 13thmonkey's UDF implementation */ 95 #define APP_NAME "*NetBSD UDF" 96 #define APP_VERSION_MAIN 1 97 #define APP_VERSION_SUB 0 98 #define IMPL_NAME "*13thMonkey.org" 99 100 101 /* Configuration values */ 102 #define UDF_INODE_HASHBITS 10 103 #define UDF_INODE_HASHSIZE (1<<UDF_INODE_HASHBITS) 104 #define UDF_INODE_HASHMASK (UDF_INODE_HASHSIZE - 1) 105 106 107 /* structure space */ 108 #define UDF_ANCHORS 4 /* 256, 512, N-256, N */ 109 #define UDF_PARTITIONS 4 /* overkill */ 110 #define UDF_PMAPS 4 /* overkill */ 111 112 113 /* constants */ 114 #define UDF_MAX_NAMELEN 255 /* as per SPEC */ 115 #define UDF_TRANS_ZERO ((uint64_t) -1) 116 #define UDF_TRANS_UNMAPPED ((uint64_t) -2) 117 #define UDF_TRANS_INTERN ((uint64_t) -3) 118 #define UDF_MAX_SECTOR ((uint64_t) -10) /* high water mark */ 119 120 121 /* malloc pools */ 122 MALLOC_DECLARE(M_UDFMNT); 123 MALLOC_DECLARE(M_UDFVOLD); 124 MALLOC_DECLARE(M_UDFTEMP); 125 126 struct pool udf_node_pool; 127 128 struct udf_node; 129 130 /* pre cleanup */ 131 struct udf_mount { 132 struct mount *vfs_mountp; 133 struct vnode *devvp; 134 struct mmc_discinfo discinfo; 135 struct udf_args mount_args; 136 137 /* read in structures */ 138 struct anchor_vdp *anchors[UDF_ANCHORS]; /* anchors to VDS */ 139 struct pri_vol_desc *primary_vol; /* identification */ 140 struct logvol_desc *logical_vol; /* main mapping v->p */ 141 struct unalloc_sp_desc *unallocated; /* free UDF space */ 142 struct impvol_desc *implementation; /* likely reduntant */ 143 struct logvol_int_desc *logvol_integrity; /* current integrity */ 144 struct part_desc *partitions[UDF_PARTITIONS]; /* partitions */ 145 146 /* derived; points *into* other structures */ 147 struct udf_logvol_info *logvol_info; /* integrity descr. */ 148 149 /* fileset and root directories */ 150 struct fileset_desc *fileset_desc; /* normally one */ 151 152 /* logical to physical translations */ 153 int vtop[UDF_PMAPS+1]; /* vpartnr trans */ 154 int vtop_tp[UDF_PMAPS+1]; /* type of trans */ 155 156 uint32_t possible_vat_location; /* predicted */ 157 uint32_t vat_table_alloc_length; 158 uint32_t vat_entries; 159 uint32_t vat_offset; /* offset in table */ 160 uint8_t *vat_table; /* read in data */ 161 162 uint32_t sparable_packet_len; 163 struct udf_sparing_table*sparing_table; 164 165 struct udf_node *metafile; 166 struct udf_node *metabitmapfile; 167 struct udf_node *metacopyfile; 168 struct udf_node *metabitmapcopyfile; 169 170 /* disc allocation */ 171 int data_alloc, meta_alloc; /* allocation scheme */ 172 173 struct mmc_trackinfo datatrack; 174 struct mmc_trackinfo metadatatrack; 175 /* TODO free space and usage per partition */ 176 /* ... [UDF_PARTITIONS]; */ 177 178 /* hash table to lookup ino_t -> udf_node */ 179 LIST_HEAD(, udf_node) udf_nodes[UDF_INODE_HASHSIZE]; 180 181 /* allocation pool for udf_node's descriptors */ 182 struct pool desc_pool; 183 184 /* locks */ 185 struct simplelock ihash_slock; 186 struct lock get_node_lock; 187 188 /* lists */ 189 STAILQ_HEAD(, udf_node) dirty_nodes; 190 STAILQ_HEAD(udfmntpts, udf_mount) all_udf_mntpnts; 191 }; 192 193 194 #define UDF_VTOP_RAWPART UDF_PMAPS /* [0..UDF_PMAPS> are normal */ 195 196 /* virtual to physical mapping types */ 197 #define UDF_VTOP_TYPE_RAW 0 198 #define UDF_VTOP_TYPE_UNKNOWN 0 199 #define UDF_VTOP_TYPE_PHYS 1 200 #define UDF_VTOP_TYPE_VIRT 2 201 #define UDF_VTOP_TYPE_SPARABLE 3 202 #define UDF_VTOP_TYPE_META 4 203 204 /* allocation strategies */ 205 #define UDF_ALLOC_SPACEMAP 1 /* spacemaps */ 206 #define UDF_ALLOC_SEQUENTIAL 2 /* linear on NWA */ 207 #define UDF_ALLOC_VAT 3 /* VAT handling */ 208 #define UDF_ALLOC_METABITMAP 4 /* metadata bitmap */ 209 #define UDF_ALLOC_METASEQUENTIAL 5 /* in chunks seq., nodes not seq */ 210 #define UDF_ALLOC_RELAXEDSEQUENTIAL 6 /* only nodes not seq. */ 211 212 /* readdir cookies */ 213 #define UDF_DIRCOOKIE_DOT 1 214 215 216 struct udf_node { 217 struct genfs_node i_gnode; /* has to be first */ 218 struct vnode *vnode; /* vnode associated */ 219 struct udf_mount *ump; 220 221 /* one of `fe' or `efe' can be set, not both (UDF file entry dscr.) */ 222 struct file_entry *fe; 223 struct extfile_entry *efe; 224 225 /* location found and recording location & hints */ 226 struct long_ad loc; /* FID/hash loc. */ 227 struct long_ad next_loc; /* strat 4096 loc */ 228 int needs_indirect; /* has missing indr. */ 229 230 /* TODO support for allocation extents? */ 231 232 /* device number from extended attributes = makedev(min,maj) */ 233 dev_t rdev; 234 235 /* misc */ 236 struct lockf *lockf; /* lock list */ 237 238 /* possibly not needed */ 239 long refcnt; 240 int dirty; 241 int hold; 242 243 struct udf_node *extattr; 244 struct udf_node *streamdir; 245 246 LIST_ENTRY(udf_node) hashchain; /* all udf nodes */ 247 STAILQ_ENTRY(udf_node) dirty_nodes; /* dirty udf nodes */ 248 }; 249 250 #endif /* !_FS_UDF_UDF_H_ */ 251