|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1999 Apple Computer, Inc. All rights reserved. ! 3: * ! 4: * @APPLE_LICENSE_HEADER_START@ ! 5: * ! 6: * Portions Copyright (c) 1999 Apple Computer, Inc. All Rights ! 7: * Reserved. This file contains Original Code and/or Modifications of ! 8: * Original Code as defined in and that are subject to the Apple Public ! 9: * Source License Version 1.1 (the "License"). You may not use this file ! 10: * except in compliance with the License. Please obtain a copy of the ! 11: * License at http://www.apple.com/publicsource and read it before using ! 12: * this file. ! 13: * ! 14: * The Original Code and all software distributed under the License are ! 15: * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER ! 16: * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, ! 17: * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, ! 18: * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the ! 19: * License for the specific language governing rights and limitations ! 20: * under the License. ! 21: * ! 22: * @APPLE_LICENSE_HEADER_END@ ! 23: */ ! 24: ! 25: /* @(#)hfs.h 3.0 ! 26: * ! 27: * (c) 1997-1999 Apple Computer, Inc. All Rights Reserved ! 28: * (c) 1990, 1992 NeXT Computer, Inc. All Rights Reserved ! 29: * ! 30: * hfs.h -- constants, structures, function declarations. etc. ! 31: * for Macintosh file system vfs. ! 32: * ! 33: * HISTORY ! 34: * 13-Jan-1999 Don Brady Add ATTR_CMN_SCRIPT to HFS_ATTR_CMN_LOOKUPMASK (radar #2296613). ! 35: * 20-Nov-1998 Don Brady Remove UFSToHFSStr and HFSToUFSStr prototypes (obsolete). ! 36: * Move filename entry from FCB to hfsfilemeta, hfsdirentry ! 37: * names are now 255 byte long. ! 38: * 10-Nov-1998 Pat Dirks Added MAXLOGBLOCKSIZE and MAXLOGBLOCKSIZEBLOCKS and RELEASE_BUFFER flag. ! 39: * Added hfsLogicalBlockTableEntry and h_logicalblocktable field in struct hfsnode. ! 40: * 4-Sep-1998 Pat Dirks Added hfs_log_block_size to hfsmount struct [again] and BestBlockSizeFit routine. ! 41: * 31-aug-1998 Don Brady Add UL to MAC_GMT_FACTOR constant. ! 42: * 04-jun-1998 Don Brady Add hfsMoveRename prototype to replace hfsMove and hfsRename. ! 43: * Add VRELE and VPUT macros to catch bad ref counts. ! 44: * 28-May-1998 Pat Dirks Move internal 'struct searchinfo' def'n here from attr.h ! 45: * 03-may-1998 Brent Knight Add gTimeZone. ! 46: * 23-apr-1998 Don Brady Add File type and creator for symbolic links. ! 47: * 22-apr-1998 Don Brady Removed kMetaFile. ! 48: * 21-apr-1998 Don Brady Add to_bsd_time and to_hfs_time prototypes. ! 49: * 20-apr-1998 Don Brady Remove course-grained hfs metadata locking. ! 50: * 15-apr-1998 Don Brady Add hasOverflowExtents and hfs_metafilelocking prototypes. Add kSysFile constant. ! 51: * 14-apr-1998 Deric Horn Added searchinfo_t, definition of search criteria used by searchfs. ! 52: * 9-apr-1998 Don Brady Added hfs_flushMDB and hfs_flushvolumeheader prototypes. ! 53: * 8-apr-1998 Don Brady Add MAKE_VREFNUM macro. ! 54: * 26-mar-1998 Don Brady Removed CloseBTreeFile and OpenBtreeFile prototypes. ! 55: * ! 56: * 12-nov-1997 scott ! 57: * Added changes for HFSPlus ! 58: */ ! 59: ! 60: #ifndef __HFS__ ! 61: #define __HFS__ ! 62: ! 63: #include <sys/types.h> ! 64: #include <sys/ucred.h> /* mount.h needs this */ ! 65: #include <sys/mount.h> ! 66: #include <sys/malloc.h> ! 67: #include <mach/machine/vm_types.h> ! 68: #include <sys/vnode.h> ! 69: #include <sys/namei.h> ! 70: #include <sys/attr.h> ! 71: #include <sys/syslimits.h> ! 72: #include <mach/vm_param.h> /* For PAGE_SIZE */ ! 73: #include <sys/dir.h> /* For MAXNAMLEN */ ! 74: ! 75: #include <libkern/libkern.h> ! 76: #include <kern/queue.h> ! 77: #include <kern/kalloc.h> ! 78: #include <mach/machine/simple_lock.h> ! 79: #include <mach/mach_types.h> ! 80: ! 81: #ifndef __FILEMGRINTERNAL__ ! 82: #include "hfscommon/headers/FileMgrInternal.h" ! 83: #endif ! 84: ! 85: #ifndef __BTREESINTERNAL__ ! 86: #include "hfscommon/headers/BTreesInternal.h" ! 87: #endif ! 88: ! 89: #if KERNEL_PRIVATE ! 90: #include <kern/thread.h> ! 91: #define GET_CURRENT_THREAD current_thread() ! 92: #else ! 93: extern thread_t current_thread_EXTERNAL(); ! 94: #define GET_CURRENT_THREAD current_thread_EXTERNAL(); ! 95: #endif ! 96: ! 97: #if KERNEL_PRIVATE ! 98: #define CURRENT_PROC current_proc() ! 99: #else ! 100: extern struct proc * current_proc_EXTERNAL(); ! 101: #define CURRENT_PROC current_proc_EXTERNAL() ! 102: #endif ! 103: ! 104: struct uio; // This is more effective than #include <sys/uio.h> in case KERNEL is undefined... ! 105: struct hfslockf; // For advisory locking ! 106: ! 107: /* ! 108: * Just reported via MIG interface. ! 109: */ ! 110: #define VERSION_STRING "hfs-1 (1-nov-97)" ! 111: ! 112: /* ! 113: * fork strings. ! 114: */ ! 115: #define kDataForkNameStr "data" ! 116: #define kRsrcForkNameStr "rsrc" ! 117: ! 118: /* ! 119: * Set to force READ_ONLY. ! 120: */ ! 121: #define FORCE_READONLY 0 ! 122: ! 123: enum { kMDBSize = 512 }; /* Size of I/O transfer to read entire MDB */ ! 124: ! 125: enum { kMasterDirectoryBlock = 2 }; /* MDB offset on disk in 512-byte blocks */ ! 126: enum { kMDBOffset = kMasterDirectoryBlock * 512 }; /* MDB offset on disk in bytes */ ! 127: ! 128: enum { ! 129: kUnknownID = 0, ! 130: kRootParID = 1, ! 131: kRootDirID = 2 ! 132: }; ! 133: ! 134: enum { ! 135: kDirCmplx = 1, ! 136: kDataFork = 2, ! 137: kRsrcFork = 3, ! 138: kSysFile = 4 ! 139: }; ! 140: ! 141: ! 142: /* ! 143: * File type and creator for symbolic links ! 144: */ ! 145: enum { ! 146: kSymLinkFileType = 0x736C6E6B, /* 'slnk' */ ! 147: kSymLinkCreator = 0x72686170 /* 'rhap' */ ! 148: }; ! 149: ! 150: ! 151: #define MAXLOGBLOCKSIZE PAGE_SIZE ! 152: #define MAXLOGBLOCKSIZEBLOCKS (MAXLOGBLOCKSIZE/512) ! 153: /* NOTE: Special support will be needed for LOGBLOCKMAPENTRIES > kHFSPlusExtentDensity (=8) */ ! 154: #define LOGBLOCKMAPENTRIES 8 ! 155: ! 156: #define BUFFERPTRLISTSIZE 25 ! 157: ! 158: extern Ptr gBufferAddress[BUFFERPTRLISTSIZE]; ! 159: extern struct buf *gBufferHeaderPtr[BUFFERPTRLISTSIZE]; ! 160: extern int gBufferListIndex; ! 161: extern simple_lock_data_t gBufferPtrListLock; ! 162: ! 163: extern struct timezone gTimeZone; ! 164: ! 165: /* Flag values for bexpand: */ ! 166: #define RELEASE_BUFFER 0x00000001 ! 167: ! 168: ! 169: /* ! 170: * NOTE: The code relies on being able to cast an ExtendedVCB* to a vfsVCB* in order ! 171: * to gain access to the mount point pointer from a pointer ! 172: * to an ExtendedVCB. DO NOT INSERT OTHER FIELDS BEFORE THE vcb FIELD!! ! 173: * ! 174: * vcbFlags, vcbLsMod, vcbFilCnt, vcbDirCnt, vcbNxtCNID, etc ! 175: * are locked by the hfs_lock simple lock. ! 176: */ ! 177: typedef struct vfsVCB { ! 178: ExtendedVCB vcb_vcb; ! 179: struct hfsmount *vcb_hfsmp; /* Pointer to hfsmount structure */ ! 180: } vfsVCB_t; ! 181: ! 182: typedef struct hfsmount { ! 183: u_char hfs_mountpoint[MAXPATHLEN+1]; ! 184: u_long hfs_mount_flags; ! 185: Boolean hfs_fs_clean; /* Whether contents have been flushed in clean state */ ! 186: Boolean hfs_fs_ronly; /* Whether this was mounted as read-initially */ ! 187: ! 188: /* Physical Description */ ! 189: u_long hfs_phys_block_count; /* Num of PHYSICAL blocks of volume */ ! 190: u_long hfs_phys_block_size; /* Always a multiple of 512 */ ! 191: ! 192: /* Access to VFS and devices */ ! 193: struct mount *hfs_mp; /* filesystem vfs structure */ ! 194: struct vnode *hfs_devvp; /* block device mounted vnode */ ! 195: dev_t hfs_raw_dev; /* device mounted */ ! 196: struct hfsnode *hfs_rootDirectory; ! 197: unsigned long hfs_log_block_size; /* Size of buffer cache buffer for I/O */ ! 198: ! 199: /* Default values for HFS standard and non-init access */ ! 200: uid_t hfs_uid; /* uid to set as owner of the files */ ! 201: gid_t hfs_gid; /* gid to set as owner of the files */ ! 202: mode_t hfs_dir_mask; /* mask to and with directory protection bits */ ! 203: mode_t hfs_file_mask; /* mask to and with file protection bits */ ! 204: u_long hfs_encoding; /* Defualt encoding for non hfs+ volumes */ ! 205: ! 206: /* HFS Specific */ ! 207: struct vfsVCB hfs_vcb; ! 208: } hfsmount_t; ! 209: ! 210: ! 211: /***************************************************************************** ! 212: * ! 213: * hfsnode structure ! 214: * ! 215: * ! 216: * m_closeable is an indication of whether the file can be closed at ! 217: * any time. This flag is implemented to help indicate whether ! 218: * its OK to close a file which is being deleted or renamed onto ! 219: * and also as a consistency check because we don't actually close the ! 220: * file in hfs_close, but rather wait for hfs_inactive. This flag ! 221: * is set TRUE when the vnode is created, and only set FALSE by ! 222: * hfs_open. ! 223: * ! 224: * m_valid is used to indicate when a vnode no longer references a ! 225: * file etc. It is set to 0 when an active vnode is removed ! 226: * or a file is renamed onto an active vnode. ! 227: * ! 228: * To uniquely identify an entity for the HFS file system, we need ! 229: * the volume descriptor, the parent directory id, and the name. ! 230: * ! 231: *****************************************************************************/ ! 232: ! 233: #define MAXHFSVNODELEN 31 ! 234: typedef u_char FileNameStr[MAXHFSVNODELEN+1]; ! 235: ! 236: /* ! 237: * NOTE: The code relies on being able to cast an FCB* to a vfsFCB* in order ! 238: * to gain access to the extended FCB and the vnode pointer from a pointer ! 239: * to an HFS FCB. DO NOT INSERT OTHER FIELDS BEFORE THE fcb FIELD!! ! 240: */ ! 241: typedef struct vfsFCB { ! 242: FCB fcb_fcb; /* File Control Block */ ! 243: ExtendedFCB fcb_extFCB; ! 244: struct vnode *fcb_vp; /* pointer to start of container vnode */ ! 245: } vfsFCB; ! 246: ! 247: ! 248: typedef struct hfsfilemeta { ! 249: struct lock__bsd__ h_fmetalock; /* file meta lock. */ ! 250: struct vnode *h_fork; /* vnode for first fork. */ ! 251: u_int16_t h_usecount; /* Amount of users accessing this record XXX SER Should be deprecated*/ ! 252: u_int32_t h_logBlockSize; /* Size of a block for reading/writing */ ! 253: u_int16_t h_physBlkPerLogBlk; /* Amount of phys sectory per logical block */ ! 254: u_int16_t h_mode; /* IFMT, permissions; see below. */ ! 255: u_int32_t h_pflags; /* Permission flags (NODUMP, IMMUTABLE, APPEND etc.) */ ! 256: u_int32_t h_uid; /* File owner. */ ! 257: u_int32_t h_gid; /* File group. */ ! 258: dev_t h_rdev; /* Special device info for this node */ ! 259: u_int32_t h_nodeflags; /* flags, see below */ ! 260: u_int32_t h_crtime; /* UNIX-format creation date in secs. */ ! 261: u_int32_t h_atime; /* UNIX-format access date in secs. */ ! 262: u_int32_t h_mtime; /* UNIX-format mod date in seconds */ ! 263: u_int32_t h_ctime; /* UNIX-format status change date */ ! 264: u_int32_t h_butime; /* UNIX-format last backup date in secs. */ ! 265: u_long h_hint; /* Catalog hint for use on Close */ ! 266: u_long h_dirID; /* Parent Directory ID */ ! 267: u_short h_namelen; /* Length of name string */ ! 268: char * h_namePtr; /* Points the name of the file */ ! 269: FileNameStr h_fileName; /* CName of file */ ! 270: } hfsfilemeta; ! 271: ! 272: ! 273: struct hfsLogicalBlockTableEntry { ! 274: u_long logicalBlockCount; ! 275: off_t extentLength; ! 276: }; ! 277: ! 278: ! 279: typedef struct hfsnode { ! 280: LIST_ENTRY(hfsnode) h_hash; /* links on valid and free lists */ ! 281: struct lock__bsd__ h_lock; /* node lock. */ ! 282: struct hfslockf *h_lockf; /* Head of byte-level lock list. */ ! 283: struct vnode *h_vp; /* vnode associated with this inode. */ ! 284: struct vnode *h_devvp; /* vnode for block I/O. */ ! 285: struct vnode *h_relative; /* vnode for complex parent, or to default fork */ ! 286: struct vnode *h_sibling; /* vnode for sibling, if is a fork. */ ! 287: dev_t h_dev; /* Device associated with the inode. */ ! 288: u_long h_nodeID; /* specific id of this node */ ! 289: UInt8 h_type; /* Type of info: dir, cmplx, data, rsrc */ ! 290: off_t h_size; /* Total physical size of object */ ! 291: struct hfsLogicalBlockTableEntry h_logicalblocktable[LOGBLOCKMAPENTRIES]; ! 292: off_t h_optimizedblocksizelimit; /* End of range covered by h_logicalblocktable */ ! 293: daddr_t h_uniformblocksizestart; /* First LBN in fixed-size log. block range */ ! 294: int32_t h_lastfsync; /* Last time that this was fsynced (used for meta data) */ ! 295: vfsFCB *h_xfcb; /* Ptr to fcb data, if this is a fork */ ! 296: hfsfilemeta *h_meta; /* Ptr to complex (or file meta) data */ ! 297: u_int32_t h_valid; /* is the vnode reference valid */ ! 298: } hfsnode_t; ! 299: typedef struct hfsnode *hfsnodeptr; ! 300: ! 301: ! 302: /* ! 303: * Macros for quick access to fields buried in the fcb inside an hfs node: ! 304: */ ! 305: #define H_FILEID(HP) ((HP)->h_nodeID) ! 306: #define H_FORKTYPE(HP) ((HP)->h_type) ! 307: #define H_DIRID(HP) ((HP)->h_meta->h_dirID) ! 308: #define H_NAME(HP) ((HP)->h_meta->h_namePtr) ! 309: #define H_HINT(HP) ((HP)->h_meta->h_hint) ! 310: ! 311: /* These flags are kept in flags. */ ! 312: #define IN_ACCESS 0x0001 /* Access time update request. */ ! 313: #define IN_CHANGE 0x0002 /* Change time update request. */ ! 314: #define IN_UPDATE 0x0004 /* Modification time update request. */ ! 315: #define IN_MODIFIED 0x0008 /* Node has been modified. */ ! 316: #define IN_RENAME 0x0010 /* Node is being renamed. */ ! 317: #define IN_SHLOCK 0x0020 /* File has shared lock. */ ! 318: #define IN_EXLOCK 0x0040 /* File has exclusive lock. */ ! 319: #define IN_UNSETACCESS 0x0200 /* File has unset access. */ ! 320: #define IN_LONGNAME 0x0400 /* File has unset access. */ ! 321: ! 322: /* File permissions.stored in mode */ ! 323: #define IEXEC 0000100 /* Executable. */ ! 324: #define IWRITE 0000200 /* Writeable. */ ! 325: #define IREAD 0000400 /* Readable. */ ! 326: #define ISVTX 0001000 /* Sticky bit. */ ! 327: #define ISGID 0002000 /* Set-gid. */ ! 328: #define ISUID 0004000 /* Set-uid. */ ! 329: ! 330: /* File types. */ ! 331: #define IFMT 0170000 /* Mask of file type. */ ! 332: #define IFIFO 0010000 /* Named pipe (fifo). */ ! 333: #define IFCHR 0020000 /* Character device. */ ! 334: #define IFDIR 0040000 /* Directory file. */ ! 335: #define IFBLK 0060000 /* Block device. */ ! 336: #define IFREG 0100000 /* Regular file. */ ! 337: #define IFLNK 0120000 /* Symbolic link. */ ! 338: #define IFSOCK 0140000 /* UNIX domain socket. */ ! 339: #define IFWHT 0160000 /* Whiteout. */ ! 340: ! 341: /* Value to make sure vnode is real and defined */ ! 342: #define HFS_VNODE_MAGIC 0x4846532b /* 'HFS+' */ ! 343: ! 344: ! 345: /* ! 346: * Write check macro ! 347: */ ! 348: #define WRITE_CK(VNODE, FUNC_NAME) { \ ! 349: if ((VNODE)->v_mount->mnt_flag & MNT_RDONLY) { \ ! 350: DBG_ERR(("%s: ATTEMPT TO WRITE A READONLY VOLUME\n", \ ! 351: FUNC_NAME)); \ ! 352: return(EROFS); \ ! 353: } \ ! 354: } ! 355: ! 356: ! 357: /* ! 358: * hfsmount locking and unlocking. ! 359: * ! 360: * mvl_lock_flags ! 361: */ ! 362: #define MVL_LOCKED 0x00000001 /* debug only */ ! 363: ! 364: #if DIAGNOSTIC ! 365: #define MVL_LOCK(mvip) { \ ! 366: (simple_lock(&(mvip)->mvl_lock)); \ ! 367: (mvip)->mvl_flags |= MVL_LOCKED; \ ! 368: } ! 369: ! 370: #define MVL_UNLOCK(mvip) { \ ! 371: if(((mvip)->mvl_flags & MVL_LOCKED) == 0) { \ ! 372: panic("MVL_UNLOCK - hfsnode not locked"); \ ! 373: } \ ! 374: (simple_unlock(&(mvip)->mvl_lock)); \ ! 375: (mvip)->mvl_flags &= ~MVL_LOCKED; \ ! 376: } ! 377: #else /* DIAGNOSTIC */ ! 378: #define MVL_LOCK(mvip) (simple_lock(&(mvip)->mvl_lock)) ! 379: #define MVL_UNLOCK(mvip) (simple_unlock(&(mvip)->mvl_lock)) ! 380: #endif /* DIAGNOSTIC */ ! 381: ! 382: ! 383: /* structure to hold a directory entry, patterned after struct dirent */ ! 384: typedef struct hfsdirentry { ! 385: u_int32_t fileno; /* unique file number */ ! 386: u_int16_t reclen; /* length of this structure */ ! 387: u_int8_t type; /* dirent file type */ ! 388: u_int8_t namelen; /* len of filename */ ! 389: char name[NAME_MAX+1]; /* filename */ ! 390: } hfsdirentry; ! 391: ! 392: /* structure to hold a catalog record information */ ! 393: /* Of everything you wanted to know about a catalog entry, file and directory */ ! 394: typedef struct hfsCatalogInfo { ! 395: CatalogNodeData nodeData; ! 396: FSSpec spec; /* filename */ ! 397: UInt32 hint; ! 398: } hfsCatalogInfo; ! 399: ! 400: // structure definition of the searchfs system trap for the search criterea. ! 401: struct directoryInfoSpec ! 402: { ! 403: u_long numFiles; ! 404: }; ! 405: ! 406: struct fileInfoSpec ! 407: { ! 408: off_t dataLogicalLength; ! 409: off_t dataPhysicalLength; ! 410: off_t resourceLogicalLength; ! 411: off_t resourcePhysicalLength; ! 412: }; ! 413: ! 414: struct searchinfospec ! 415: { ! 416: u_char name[512]; ! 417: u_long nameLength; ! 418: char attributes; // see IM:Files 2-100 ! 419: u_long parentDirID; ! 420: struct timespec creationDate; ! 421: struct timespec modificationDate; ! 422: struct timespec lastBackupDate; ! 423: u_long finderInfo[8]; ! 424: struct fileInfoSpec f; ! 425: struct directoryInfoSpec d; ! 426: }; ! 427: typedef struct searchinfospec searchinfospec_t; ! 428: ! 429: #define HFSTIMES(hp, t1, t2) { \ ! 430: if ((hp)->h_meta->h_nodeflags & (IN_ACCESS | IN_CHANGE | IN_UPDATE)) { \ ! 431: (hp)->h_meta->h_nodeflags |= IN_MODIFIED; \ ! 432: if ((hp)->h_meta->h_nodeflags & IN_ACCESS) { \ ! 433: (hp)->h_meta->h_atime = (t1)->tv_sec; \ ! 434: }; \ ! 435: if ((hp)->h_meta->h_nodeflags & IN_UPDATE) { \ ! 436: (hp)->h_meta->h_mtime = (t2)->tv_sec; \ ! 437: } \ ! 438: if ((hp)->h_meta->h_nodeflags & IN_CHANGE) { \ ! 439: (hp)->h_meta->h_ctime = time.tv_sec; \ ! 440: }; \ ! 441: (hp)->h_meta->h_nodeflags &= ~(IN_ACCESS | IN_CHANGE | IN_UPDATE); \ ! 442: } \ ! 443: } ! 444: ! 445: /* ! 446: * Various ways to acquire a VNode pointer: ! 447: */ ! 448: #define HTOV(HP) ((HP)->h_vp) ! 449: #define FCBTOV(FCB) (((vfsFCB *)(FCB))->fcb_vp) ! 450: ! 451: /* ! 452: * Various ways to acquire an HFS Node pointer: ! 453: */ ! 454: #define VTOH(VP) ((struct hfsnode *)((VP)->v_data)) ! 455: #define FCBTOH(FCB) ((struct hfsnode *)(((vfsFCB *)(FCB))->fcb_vp->v_data)) ! 456: ! 457: /* ! 458: * Various ways to acquire an FCB pointer: ! 459: */ ! 460: #define VTOFCB(VP) (&(((struct hfsnode *)((VP)->v_data))->h_xfcb->fcb_fcb)) ! 461: #define HTOFCB(HP) (&(HP)->h_xfcb->fcb_fcb) ! 462: ! 463: /* ! 464: * Various ways to acquire a VFS mount point pointer: ! 465: */ ! 466: #define VTOVFS(VP) ((VP)->v_mount) ! 467: #define HTOVFS(HP) ((HP)->h_vp->v_mount) ! 468: #define FCBTOVFS(FCB) (((vfsFCB *)(FCB))->fcb_vp->v_mount) ! 469: #define HFSTOVFS(HFSMP) ((HFSMP)->hfs_mp) ! 470: #define VCBTOVFS(VCB) (((struct vfsVCB *)(VCB))->vcb_hfsmp->hfs_mp) ! 471: ! 472: /* ! 473: * Various ways to acquire an HFS mount point pointer: ! 474: */ ! 475: #define VTOHFS(VP) ((struct hfsmount *)((VP)->v_mount->mnt_data)) ! 476: #define HTOHFS(HP) ((struct hfsmount *)(HP)->h_vp->v_mount->mnt_data) ! 477: #define FCBTOHFS(FCB) ((struct hfsmount *)(((vfsFCB *)(FCB))->fcb_vp->v_mount->mnt_data)) ! 478: #define VFSTOHFS(MP) ((struct hfsmount *)(MP)->mnt_data) ! 479: #define VCBTOHFS(VCB) (((struct vfsVCB *)(VCB))->vcb_hfsmp) ! 480: ! 481: /* ! 482: * Various ways to acquire a VCB pointer: ! 483: */ ! 484: #define VTOVCB(VP) (&(((struct hfsmount *)((VP)->v_mount->mnt_data))->hfs_vcb.vcb_vcb)) ! 485: #define HTOVCB(HP) (&(((struct hfsmount *)((HP)->h_vp->v_mount->mnt_data))->hfs_vcb.vcb_vcb)) ! 486: #define FCBTOVCB(FCB) (&(((struct hfsmount *)(((vfsFCB *)(FCB))->fcb_vp->v_mount->mnt_data))->hfs_vcb.vcb_vcb)) ! 487: #define VFSTOVCB(MP) (&(((struct hfsmount *)(MP)->mnt_data)->hfs_vcb.vcb_vcb)) ! 488: #define HFSTOVCB(HFSMP) (&(HFSMP)->hfs_vcb.vcb_vcb) ! 489: ! 490: /* ! 491: * Lock for HFS file metadata ! 492: */ ! 493: #define HFSFILEMETA_LOCK_EXCLUSIVE(HP, P) \ ! 494: lockmgr(&(HP)->h_meta->h_fmetalock, LK_EXCLUSIVE, (simple_lock_t) 0, P) ! 495: ! 496: #define HFSFILEMETA_LOCK_SHARED(HP, P) \ ! 497: lockmgr(&(HP)->h_meta->h_fmetalock, LK_SHARED, (simple_lock_t) 0, P) ! 498: ! 499: #define HFSFILEMETA_UNLOCK(HP, P) \ ! 500: lockmgr(&(HP)->h_meta->h_fmetalock, LK_RELEASE, (simple_lock_t) 0, P) ! 501: ! 502: #define E_NONE 0 ! 503: #define kHFSBlockSize 512 ! 504: #define kHFSBlockShift 9 /* 2^9 = 512 */ ! 505: ! 506: #define IOBLKNOFORBLK(STARTINGBLOCK, BLOCKSIZEINBYTES) ((daddr_t)((STARTINGBLOCK) / ((BLOCKSIZEINBYTES) >> 9))) ! 507: #define IOBLKCNTFORBLK(STARTINGBLOCK, BYTESTOTRANSFER, BLOCKSIZEINBYTES) \ ! 508: ((int)(IOBLKNOFORBYTE(((STARTINGBLOCK) * 512) + (BYTESTOTRANSFER) - 1, (BLOCKSIZEINBYTES)) - \ ! 509: IOBLKNOFORBLK((STARTINGBLOCK), (BLOCKSIZEINBYTES)) + 1)) ! 510: #define IOBYTECCNTFORBLK(STARTINGBLOCK, BYTESTOTRANSFER, BLOCKSIZEINBYTES) \ ! 511: (IOBLKCNTFORBLK((STARTINGBLOCK),(BYTESTOTRANSFER),(BLOCKSIZEINBYTES)) * (BLOCKSIZEINBYTES)) ! 512: #define IOBYTEOFFSETFORBLK(STARTINGBLOCK, BLOCKSIZEINBYTES) \ ! 513: (((STARTINGBLOCK) * 512) - \ ! 514: (IOBLKNOFORBLK((STARTINGBLOCK), (BLOCKSIZEINBYTES)) * (BLOCKSIZEINBYTES))) ! 515: ! 516: #define IOBLKNOFORBYTE(STARTINGBYTE, BLOCKSIZEINBYTES) ((daddr_t)((STARTINGBYTE) / (BLOCKSIZEINBYTES))) ! 517: #define IOBLKCNTFORBYTE(STARTINGBYTE, BYTESTOTRANSFER, BLOCKSIZEINBYTES) \ ! 518: ((int)(IOBLKNOFORBYTE((STARTINGBYTE) + (BYTESTOTRANSFER) - 1, (BLOCKSIZEINBYTES)) - \ ! 519: IOBLKNOFORBYTE((STARTINGBYTE), (BLOCKSIZEINBYTES)) + 1)) ! 520: #define IOBYTECNTFORBYTE(STARTINGBYTE, BYTESTOTRANSFER, BLOCKSIZEINBYTES) \ ! 521: (IOBLKCNTFORBYTE((STARTINGBYTE),(BYTESTOTRANSFER),(BLOCKSIZEINBYTES)) * (BLOCKSIZEINBYTES)) ! 522: #define IOBYTEOFFSETFORBYTE(STARTINGBYTE, BLOCKSIZEINBYTES) ((STARTINGBYTE) - (IOBLKNOFORBYTE((STARTINGBYTE), (BLOCKSIZEINBYTES)) * (BLOCKSIZEINBYTES))) ! 523: ! 524: #define MAKE_VREFNUM(x) ((int32_t)((x) & 0xffff)) ! 525: /* ! 526: * This is the straight GMT conversion constant: ! 527: * 00:00:00 January 1, 1970 - 00:00:00 January 1, 1904 ! 528: * (3600 * 24 * ((365 * (1970 - 1904)) + (((1970 - 1904) / 4) + 1))) ! 529: */ ! 530: #define MAC_GMT_FACTOR 2082844800UL ! 531: ! 532: #define HFS_ATTR_CMN_LOOKUPMASK (ATTR_CMN_SCRIPT | ATTR_CMN_FNDRINFO | ATTR_CMN_NAMEDATTRCOUNT | ATTR_CMN_NAMEDATTRLIST) ! 533: #define HFS_ATTR_DIR_LOOKUPMASK (ATTR_DIR_LINKCOUNT | ATTR_DIR_ENTRYCOUNT) ! 534: #define HFS_ATTR_FILE_LOOKUPMASK (ATTR_FILE_LINKCOUNT | ATTR_FILE_TOTALSIZE | ATTR_FILE_ALLOCSIZE | \ ! 535: ATTR_FILE_DATALENGTH | ATTR_FILE_DATAALLOCSIZE | ATTR_FILE_DATAEXTENTS | \ ! 536: ATTR_FILE_RSRCLENGTH | ATTR_FILE_RSRCALLOCSIZE | ATTR_FILE_RSRCEXTENTS) ! 537: ! 538: #define VPUT(vp) if (((vp)->v_usecount > 0) && (*((volatile int *)(&(vp)->v_interlock))==0)) vput((vp)); else panic("hfs: vput bad ref cnt (%d)!", (vp)->v_usecount) ! 539: #define VRELE(vp) if (((vp)->v_usecount > 0) && (*((volatile int *)(&(vp)->v_interlock))==0)) vrele((vp)); else panic("hfs: vrele bad ref cnt (%d)!", (vp)->v_usecount) ! 540: ! 541: u_int32_t to_bsd_time(u_int32_t hfs_time); ! 542: u_int32_t to_hfs_time(u_int32_t bsd_time); ! 543: ! 544: struct vnode *hfs_vhashget(dev_t dev, UInt32 dirID, UInt8 forkType); ! 545: void hfs_vhashins(struct hfsnode *hp); ! 546: void hfs_vhashinslocked(struct hfsnode *hp); ! 547: void hfs_vhashrem(struct hfsnode *hp); ! 548: ! 549: short hfs_flushfiles(struct mount *mp, unsigned short flags); ! 550: short hfs_flushMDB(struct hfsmount *hfsmp, int waitfor); ! 551: short hfs_flushvolumeheader(struct hfsmount *hfsmp, int waitfor); ! 552: ! 553: short hfsLookup (ExtendedVCB *vcb, UInt32 dirID, char *name, short len, UInt32 hint, hfsCatalogInfo *catInfo); ! 554: short hfsMoveRename (ExtendedVCB *vcb, UInt32 oldDirID, char *oldName, UInt32 newDirID, char *newName, UInt32 *hint); ! 555: short hfsCreate (ExtendedVCB *vcb, UInt32 dirID, char *name, int mode); ! 556: short hfsCreateFileID (ExtendedVCB *vcb, UInt32 parentDirID, StringPtr name, UInt32 catalogHint, UInt32 *fileIDPtr); ! 557: short hfsGet (ExtendedVCB *vcb, hfsCatalogInfo *catInfo, UInt8 forkType, struct vnode *dvp, struct vnode **vpp); ! 558: short hfsDelete (ExtendedVCB *vcb, UInt32 parentDirID, StringPtr name, short isfile, UInt32 catalogHint); ! 559: short hfsUnmount(struct hfsmount *hfsmp, struct proc *p); ! 560: ! 561: extern int hfs_metafilelocking(struct hfsmount *hfsmp, u_long fileID, u_int flags, struct proc *p); ! 562: extern int hasOverflowExtents(struct hfsnode *hp); ! 563: ! 564: short MacToVFSError(OSErr err); ! 565: void MapFileOffset(struct hfsnode *hp, off_t filePosition, daddr_t *logBlockNumber, long *blockSize, long *blockOffset); ! 566: long LogicalBlockSize(struct hfsnode *hp, daddr_t logicalBlockNumber); ! 567: void UpdateBlockMappingTable(struct hfsnode *hp); ! 568: void CopyVNodeToCatalogNode (struct vnode *vp, struct CatalogNodeData *nodeData); ! 569: void CopyCatalogToHFSNode(struct hfsCatalogInfo *catalogInfo, struct hfsnode *hp); ! 570: int bexpand(struct buf *bp, int newsize, struct buf **nbpp, long flags); ! 571: ! 572: short make_dir_entry(struct FCB **fileptr, char *name, UInt32 fileID); ! 573: ! 574: int AttributeBlockSize(struct attrlist *attrlist); ! 575: void PackCommonAttributeBlock(struct attrlist *alist, ! 576: struct vnode *vp, ! 577: struct hfsCatalogInfo *catInfo, ! 578: void **attrbufptrptr, ! 579: void **varbufptrptr); ! 580: void PackVolAttributeBlock(struct attrlist *alist, ! 581: struct vnode *vp, ! 582: struct hfsCatalogInfo *catInfo, ! 583: void **attrbufptrptr, ! 584: void **varbufptrptr); ! 585: void PackFileDirAttributeBlock(struct attrlist *alist, ! 586: struct vnode *vp, ! 587: struct hfsCatalogInfo *catInfo, ! 588: void **attrbufptrptr, ! 589: void **varbufptrptr); ! 590: void PackForkAttributeBlock(struct attrlist *alist, ! 591: struct vnode *vp, ! 592: struct hfsCatalogInfo *catInfo, ! 593: void **attrbufptrptr, ! 594: void **varbufptrptr); ! 595: void PackAttributeBlock(struct attrlist *alist, ! 596: struct vnode *vp, ! 597: struct hfsCatalogInfo *catInfo, ! 598: void **attrbufptrptr, ! 599: void **varbufptrptr); ! 600: void PackCatalogInfoAttributeBlock (struct attrlist *alist, ! 601: struct vnode * root_vp, ! 602: struct hfsCatalogInfo *catInfo, ! 603: void **attrbufptrptr, ! 604: void **varbufptrptr); ! 605: void UnpackCommonAttributeBlock(struct attrlist *alist, ! 606: struct vnode *vp, ! 607: struct hfsCatalogInfo *catInfo, ! 608: void **attrbufptrptr, ! 609: void **varbufptrptr); ! 610: void UnpackAttributeBlock(struct attrlist *alist, ! 611: struct vnode *vp, ! 612: struct hfsCatalogInfo *catInfo, ! 613: void **attrbufptrptr, ! 614: void **varbufptrptr); ! 615: unsigned long BestBlockSizeFit(unsigned long allocationBlockSize, ! 616: unsigned long blockSizeLimit, ! 617: unsigned long baseMultiple); ! 618: ! 619: OSErr hfs_MountHFSVolume(struct hfsmount *hfsmp, HFSMasterDirectoryBlock *mdb, struct proc *p); ! 620: OSErr hfs_MountHFSPlusVolume(struct hfsmount *hfsmp, HFSPlusVolumeHeader *vhp, u_long embBlkOffset, struct proc *p); ! 621: OSStatus GetInitializedVNode(struct hfsmount *hfsmp, struct vnode **tmpvnode ); ! 622: ! 623: /* B-tree I/O callbacks (in hfs_btreio.c) */ ! 624: extern OSStatus GetBTreeBlock(FileReference fileRefNum, UInt32 blockNum, GetBlockOptions options, BlockDescriptor *block); ! 625: extern OSStatus ReleaseBTreeBlock(FileReference fileRefNum, BlockDescPtr blockPtr, ReleaseBlockOptions options); ! 626: extern OSStatus SetBTreeBlockSize(FileReference fileRefNum, ByteCount blockSize, ItemCount minBlockCount); ! 627: extern OSStatus ExtendBTreeFile(FileReference fileRefNum, FSSize minEOF, FSSize maxEOF); ! 628: ! 629: #endif /* __HFS__ */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.