This commit was manufactured by cvs2svn to create tag 'FreeBSD-release/1.0'.
[unix-history] / sys / pcfs / pcfsmount.h
CommitLineData
15637ed4
RG
1/*
2 * Written by Paul Popelka (paulp@uts.amdahl.com)
3 *
4 * You can do anything you want with this software,
5 * just don't say you wrote it,
6 * and don't remove this notice.
7 *
8 * This software is provided "as is".
9 *
10 * The author supplies this software to be publicly
11 * redistributed on the understanding that the author
12 * is not responsible for the correct functioning of
13 * this software in any circumstances and is not liable
14 * for any damages caused by this software.
15 *
16 * October 1992
17 *
78ed81a3 18 * $Id$
15637ed4
RG
19 */
20
21/*
22 * Layout of the mount control block for a msdos
23 * file system.
24 */
25struct pcfsmount {
26 struct mount *pm_mountp; /* vfs mount struct for this fs */
27 dev_t pm_dev; /* block special device mounted */
28 struct vnode *pm_devvp; /* vnode for block device mntd */
29 struct bpb50 pm_bpb; /* BIOS parameter blk for this fs */
30 u_long pm_fatblk; /* block # of first FAT */
31 u_long pm_rootdirblk; /* block # of root directory */
32 u_long pm_rootdirsize; /* size in blocks (not clusters) */
33 u_long pm_firstcluster; /* block number of first cluster */
34 u_long pm_nmbrofclusters; /* # of clusters in filesystem */
35 u_long pm_maxcluster; /* maximum cluster number */
36 u_long pm_freeclustercount; /* number of free clusters */
37 u_long pm_lookhere; /* start free cluster search here */
38 u_long pm_bnshift; /* shift file offset right this
39 * amount to get a block number */
40 u_long pm_brbomask; /* and a file offset with this
41 * mask to get block rel offset */
42 u_long pm_cnshift; /* shift file offset right this
43 * amount to get a cluster number */
44 u_long pm_crbomask; /* and a file offset with this
45 * mask to get cluster rel offset */
46 u_long pm_bpcluster; /* bytes per cluster */
47 u_long pm_depclust; /* directory entries per cluster */
48 u_long pm_fmod; /* ~0 if fs is modified, this can
49 * rollover to 0 */
50 u_long pm_fatblocksize; /* size of fat blocks in bytes */
51 u_long pm_fatblocksec; /* size of fat blocks in sectors */
52 u_long pm_fatsize; /* size of fat in bytes */
53 u_char *pm_inusemap; /* ptr to bitmap of in-use clusters */
54 char pm_ronly; /* read only if non-zero */
55 char pm_waitonfat; /* wait for writes of the fat to complt,
56 * when 0 use bdwrite, else use bwrite */
57};
58/*
59 * How to compute pm_cnshift and pm_crbomask.
60 *
61 * pm_crbomask = (pm_SectPerClust * pm_BytesPerSect) - 1
62 * if (bytesperclust == 0) return EBADBLKSZ;
63 * bit = 1;
64 * for (i = 0; i < 32; i++) {
65 * if (bit & bytesperclust) {
66 * if (bit ^ bytesperclust) return EBADBLKSZ;
67 * pm_cnshift = i;
68 * break;
69 * }
70 * bit <<= 1;
71 * }
72 */
73
74/*
75 * Shorthand for fields in the bpb contained in
76 * the pcfsmount structure.
77 */
78#define pm_BytesPerSec pm_bpb.bpbBytesPerSec
79#define pm_SectPerClust pm_bpb.bpbSecPerClust
80#define pm_ResSectors pm_bpb.bpbResSectors
81#define pm_FATs pm_bpb.bpbFATs
82#define pm_RootDirEnts pm_bpb.bpbRootDirEnts
83#define pm_Sectors pm_bpb.bpbSectors
84#define pm_Media pm_bpb.bpbMedia
85#define pm_FATsecs pm_bpb.bpbFATsecs
86#define pm_SecPerTrack pm_bpb.bpbSecPerTrack
87#define pm_Heads pm_bpb.bpbHeads
88#define pm_HiddenSects pm_bpb.bpbHiddenSecs
89#define pm_HugeSectors pm_bpb.bpbHugeSectors
90
91/*
92 * Map a cluster number into a filesystem relative
93 * block number.
94 */
95#define cntobn(pmp, cn) \
96 ((((cn)-CLUST_FIRST) * (pmp)->pm_SectPerClust) + (pmp)->pm_firstcluster)
97
98/*
99 * Map a filesystem relative block number back into
100 * a cluster number.
101 */
102#define bntocn(pmp, bn) \
103 ((((bn) - pmp->pm_firstcluster)/ (pmp)->pm_SectPerClust) + CLUST_FIRST)
104
105/*
106 * Calculate block number for directory entry in root dir, offset dirofs
107 */
108#define roottobn(pmp, dirofs) \
109 (((dirofs) / (pmp)->pm_depclust) * (pmp)->pm_SectPerClust \
110 + (pmp)->pm_rootdirblk)
111
112/*
113 * Calculate block number for directory entry at cluster dirclu, offset dirofs
114 */
115#define detobn(pmp, dirclu, dirofs) \
116 ((dirclu) == PCFSROOT \
117 ? roottobn((pmp), (dirofs)) \
118 : cntobn((pmp), (dirclu)))
119
120/*
121 * Convert pointer to buffer -> pointer to direntry
122 */
123#define bptoep(pmp, bp, dirofs) \
124 ((struct direntry *)((bp)->b_un.b_addr) \
125 + (dirofs) % (pmp)->pm_depclust)
126
127
128/*
129 * Prototypes for PCFS virtual filesystem operations
130 */
131int pcfs_mount __P((struct mount *mp, char *path, caddr_t data,
132 struct nameidata *ndp, struct proc *p));
133int pcfs_start __P((struct mount *mp, int flags, struct proc *p));
134int pcfs_unmount __P((struct mount *mp, int mntflags, struct proc *p));
135int pcfs_root __P((struct mount *mp, struct vnode **vpp));
136int pcfs_quotactl __P((struct mount *mp, int cmds, int uid, /* should be uid_t */
137 caddr_t arg, struct proc *p));
138int pcfs_statfs __P((struct mount *mp, struct statfs *sbp, struct proc *p));
139int pcfs_sync __P((struct mount *mp, int waitfor));
140int pcfs_fhtovp __P((struct mount *mp, struct fid *fhp, struct vnode **vpp));
141int pcfs_vptofh __P((struct vnode *vp, struct fid *fhp));
142int pcfs_init __P(());