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