Annotation of sys/msdosfs/msdosfsmount.h, Revision 1.1
1.1 ! nbrk 1: /* $OpenBSD: msdosfsmount.h,v 1.18 2006/12/16 12:44:05 krw Exp $ */
! 2: /* $NetBSD: msdosfsmount.h,v 1.16 1997/10/17 11:24:24 ws Exp $ */
! 3:
! 4: /*-
! 5: * Copyright (C) 1994, 1995, 1997 Wolfgang Solfrank.
! 6: * Copyright (C) 1994, 1995, 1997 TooLs GmbH.
! 7: * All rights reserved.
! 8: * Original code by Paul Popelka (paulp@uts.amdahl.com) (see below).
! 9: *
! 10: * Redistribution and use in source and binary forms, with or without
! 11: * modification, are permitted provided that the following conditions
! 12: * are met:
! 13: * 1. Redistributions of source code must retain the above copyright
! 14: * notice, this list of conditions and the following disclaimer.
! 15: * 2. Redistributions in binary form must reproduce the above copyright
! 16: * notice, this list of conditions and the following disclaimer in the
! 17: * documentation and/or other materials provided with the distribution.
! 18: * 3. All advertising materials mentioning features or use of this software
! 19: * must display the following acknowledgement:
! 20: * This product includes software developed by TooLs GmbH.
! 21: * 4. The name of TooLs GmbH may not be used to endorse or promote products
! 22: * derived from this software without specific prior written permission.
! 23: *
! 24: * THIS SOFTWARE IS PROVIDED BY TOOLS GMBH ``AS IS'' AND ANY EXPRESS OR
! 25: * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
! 26: * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
! 27: * IN NO EVENT SHALL TOOLS GMBH BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
! 28: * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
! 29: * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
! 30: * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
! 31: * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
! 32: * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
! 33: * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
! 34: */
! 35: /*
! 36: * Written by Paul Popelka (paulp@uts.amdahl.com)
! 37: *
! 38: * You can do anything you want with this software, just don't say you wrote
! 39: * it, and don't remove this notice.
! 40: *
! 41: * This software is provided "as is".
! 42: *
! 43: * The author supplies this software to be publicly redistributed on the
! 44: * understanding that the author is not responsible for the correct
! 45: * functioning of this software in any circumstances and is not liable for
! 46: * any damages caused by this software.
! 47: *
! 48: * October 1992
! 49: */
! 50:
! 51: /*
! 52: * Layout of the mount control block for a msdos file system.
! 53: */
! 54: struct msdosfsmount {
! 55: struct mount *pm_mountp;/* vfs mount struct for this fs */
! 56: dev_t pm_dev; /* block special device mounted */
! 57: uid_t pm_uid; /* uid to set as owner of the files */
! 58: gid_t pm_gid; /* gid to set as owner of the files */
! 59: mode_t pm_mask; /* mask to and with file protection bits */
! 60: struct vnode *pm_devvp; /* vnode for block device mntd */
! 61: struct bpb50 pm_bpb; /* BIOS parameter blk for this fs */
! 62: uint32_t pm_BlkPerSec; /* # of DEV_BSIZE blocks in MSDOSFS sector */
! 63: uint32_t pm_FATsecs; /* actual number of fat sectors */
! 64: uint32_t pm_fatblk; /* block # of first FAT */
! 65: uint32_t pm_rootdirblk; /* block # (cluster # for FAT32) of root directory number */
! 66: uint32_t pm_rootdirsize; /* size in blocks (not clusters) */
! 67: uint32_t pm_firstcluster; /* block number of first cluster */
! 68: uint32_t pm_nmbrofclusters; /* # of clusters in filesystem */
! 69: uint32_t pm_maxcluster; /* maximum cluster number */
! 70: uint32_t pm_freeclustercount; /* number of free clusters */
! 71: uint32_t pm_cnshift; /* shift file offset right this amount to get a cluster number */
! 72: uint32_t pm_crbomask; /* and a file offset with this mask to get cluster rel offset */
! 73: uint32_t pm_bnshift; /* shift file offset right this amount to get a block number */
! 74: uint32_t pm_bpcluster; /* bytes per cluster */
! 75: uint32_t pm_fmod; /* ~0 if fs is modified, this can rollover to 0 */
! 76: uint32_t pm_fatblocksize; /* size of fat blocks in bytes */
! 77: uint32_t pm_fatblocksec; /* size of fat blocks in sectors */
! 78: uint32_t pm_fatsize; /* size of fat in bytes */
! 79: uint32_t pm_fatmask; /* mask to use for fat numbers */
! 80: uint32_t pm_fsinfo; /* fsinfo block number */
! 81: uint32_t pm_nxtfree; /* next free cluster in fsinfo block */
! 82: u_int pm_fatmult; /* these 2 values are used in fat */
! 83: u_int pm_fatdiv; /* offset computation */
! 84: u_int pm_curfat; /* current fat for FAT32 (0 otherwise) */
! 85: u_int *pm_inusemap; /* ptr to bitmap of in-use clusters */
! 86: u_int pm_flags; /* see below */
! 87: struct netexport pm_export; /* export information */
! 88: };
! 89: /* Byte offset in FAT on filesystem pmp, cluster cn */
! 90: #define FATOFS(pmp, cn) ((cn) * (pmp)->pm_fatmult / (pmp)->pm_fatdiv)
! 91:
! 92: /*
! 93: * Mount point flags:
! 94: */
! 95: #if 0
! 96: /* Defined in <sys/mount.h> */
! 97: #define MSDOSFSMNT_SHORTNAME 0x01
! 98: #define MSDOSFSMNT_LONGNAME 0x02
! 99: #define MSDOSFSMNT_NOWIN95 0x04
! 100: #define MSDOSFSMNT_ALLOWDIRX 0x10
! 101: #endif
! 102:
! 103: /* All flags above: */
! 104: #define MSDOSFSMNT_MNTOPT \
! 105: (MSDOSFSMNT_SHORTNAME|MSDOSFSMNT_LONGNAME|MSDOSFSMNT_NOWIN95 \
! 106: |MSDOSFSMNT_ALLOWDIRX)
! 107: #define MSDOSFSMNT_RONLY 0x80000000 /* mounted read-only */
! 108: #define MSDOSFSMNT_WAITONFAT 0x40000000 /* mounted synchronous */
! 109: #define MSDOSFS_FATMIRROR 0x20000000 /* FAT is mirrored */
! 110:
! 111: #define VFSTOMSDOSFS(mp) ((struct msdosfsmount *)mp->mnt_data)
! 112:
! 113: /* Number of bits in one pm_inusemap item: */
! 114: #define N_INUSEBITS (8 * sizeof(u_int))
! 115:
! 116: /*
! 117: * Shorthand for fields in the bpb contained in the msdosfsmount structure.
! 118: */
! 119: #define pm_BytesPerSec pm_bpb.bpbBytesPerSec
! 120: #define pm_ResSectors pm_bpb.bpbResSectors
! 121: #define pm_FATs pm_bpb.bpbFATs
! 122: #define pm_RootDirEnts pm_bpb.bpbRootDirEnts
! 123: #define pm_Sectors pm_bpb.bpbSectors
! 124: #define pm_Media pm_bpb.bpbMedia
! 125: #define pm_SecPerTrack pm_bpb.bpbSecPerTrack
! 126: #define pm_Heads pm_bpb.bpbHeads
! 127: #define pm_HiddenSects pm_bpb.bpbHiddenSecs
! 128: #define pm_HugeSectors pm_bpb.bpbHugeSectors
! 129:
! 130: /*
! 131: * Convert pointer to buffer -> pointer to direntry
! 132: */
! 133: #define bptoep(pmp, bp, dirofs) \
! 134: ((struct direntry *)(((bp)->b_data) \
! 135: + ((dirofs) & (pmp)->pm_crbomask)))
! 136:
! 137: /*
! 138: * Convert block number to cluster number
! 139: */
! 140: #define de_bn2cn(pmp, bn) \
! 141: ((bn) >> ((pmp)->pm_cnshift - (pmp)->pm_bnshift))
! 142:
! 143: /*
! 144: * Convert cluster number to block number
! 145: */
! 146: #define de_cn2bn(pmp, cn) \
! 147: ((cn) << ((pmp)->pm_cnshift - (pmp)->pm_bnshift))
! 148:
! 149: /*
! 150: * Convert file offset to cluster number
! 151: */
! 152: #define de_cluster(pmp, off) \
! 153: ((off) >> (pmp)->pm_cnshift)
! 154:
! 155: /*
! 156: * Clusters required to hold size bytes
! 157: */
! 158: #define de_clcount(pmp, size) \
! 159: (((size) + (pmp)->pm_bpcluster - 1) >> (pmp)->pm_cnshift)
! 160:
! 161: /*
! 162: * Convert file offset to block number
! 163: */
! 164: #define de_blk(pmp, off) \
! 165: (de_cn2bn(pmp, de_cluster((pmp), (off))))
! 166:
! 167: /*
! 168: * Convert cluster number to file offset
! 169: */
! 170: #define de_cn2off(pmp, cn) \
! 171: ((cn) << (pmp)->pm_cnshift)
! 172:
! 173: /*
! 174: * Convert block number to file offset
! 175: */
! 176: #define de_bn2off(pmp, bn) \
! 177: ((bn) << (pmp)->pm_bnshift)
! 178: /*
! 179: * Map a cluster number into a filesystem relative block number.
! 180: */
! 181: #define cntobn(pmp, cn) \
! 182: (de_cn2bn((pmp), (cn)-CLUST_FIRST) + (pmp)->pm_firstcluster)
! 183:
! 184: /*
! 185: * Calculate block number for directory entry in root dir, offset dirofs
! 186: */
! 187: #define roottobn(pmp, dirofs) \
! 188: (de_blk((pmp), (dirofs)) + (pmp)->pm_rootdirblk)
! 189:
! 190: /*
! 191: * Calculate block number for directory entry at cluster dirclu, offset
! 192: * dirofs
! 193: */
! 194: #define detobn(pmp, dirclu, dirofs) \
! 195: ((dirclu) == MSDOSFSROOT \
! 196: ? roottobn((pmp), (dirofs)) \
! 197: : cntobn((pmp), (dirclu)))
! 198:
! 199: /* Calculate size of fsinfo block */
! 200: #define fsi_size(pmp) \
! 201: (1024 << ((pmp)->pm_BlkPerSec >> 2))
! 202:
! 203: /*
! 204: * Prototypes for MSDOSFS virtual filesystem operations
! 205: */
! 206: int msdosfs_mount(struct mount *, const char *, void *, struct nameidata *, struct proc *);
! 207: int msdosfs_start(struct mount *, int, struct proc *);
! 208: int msdosfs_unmount(struct mount *, int, struct proc *);
! 209: int msdosfs_root(struct mount *, struct vnode **);
! 210: int msdosfs_quotactl(struct mount *, int, uid_t, caddr_t, struct proc *);
! 211: int msdosfs_statfs(struct mount *, struct statfs *, struct proc *);
! 212: int msdosfs_sync(struct mount *, int, struct ucred *, struct proc *);
! 213: int msdosfs_fhtovp(struct mount *, struct fid *, struct vnode **);
! 214: int msdosfs_vptofh(struct vnode *, struct fid *);
! 215: int msdosfs_init(struct vfsconf *);
CVSweb