Project

General

Profile

Statistics
| Revision:

root / lab4 / .minix-src / include / msdosfs / msdosfsmount.h @ 13

History | View | Annotate | Download (8.82 KB)

1 13 up20180614
/*        $NetBSD: msdosfsmount.h,v 1.20 2014/07/08 09:21:52 hannken Exp $        */
2
3
/*-
4
 * Copyright (C) 1994, 1995, 1997 Wolfgang Solfrank.
5
 * Copyright (C) 1994, 1995, 1997 TooLs GmbH.
6
 * All rights reserved.
7
 * Original code by Paul Popelka (paulp@uts.amdahl.com) (see below).
8
 *
9
 * Redistribution and use in source and binary forms, with or without
10
 * modification, are permitted provided that the following conditions
11
 * are met:
12
 * 1. Redistributions of source code must retain the above copyright
13
 *    notice, this list of conditions and the following disclaimer.
14
 * 2. Redistributions in binary form must reproduce the above copyright
15
 *    notice, this list of conditions and the following disclaimer in the
16
 *    documentation and/or other materials provided with the distribution.
17
 * 3. All advertising materials mentioning features or use of this software
18
 *    must display the following acknowledgement:
19
 *        This product includes software developed by TooLs GmbH.
20
 * 4. The name of TooLs GmbH 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 TOOLS GMBH ``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 TOOLS GMBH BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
27
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
28
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
29
 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
30
 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
31
 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
32
 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33
 */
34
/*
35
 * Written by Paul Popelka (paulp@uts.amdahl.com)
36
 *
37
 * You can do anything you want with this software, just don't say you wrote
38
 * it, and don't remove this notice.
39
 *
40
 * This software is provided "as is".
41
 *
42
 * The author supplies this software to be publicly redistributed on the
43
 * understanding that the author is not responsible for the correct
44
 * functioning of this software in any circumstances and is not liable for
45
 * any damages caused by this software.
46
 *
47
 * October 1992
48
 */
49
50
#ifndef _MSDOSFS_MSDOSFSMOUNT_H_
51
#define _MSDOSFS_MSDOSFSMOUNT_H_
52
53
#ifndef MAKEFS
54
/*
55
 *  Arguments to mount MSDOS filesystems.
56
 */
57
struct msdosfs_args {
58
        char        *fspec;                /* blocks special holding the fs to mount */
59
        struct        export_args30 _pad1; /* compat with old userland tools */
60
        uid_t        uid;                /* uid that owns msdosfs files */
61
        gid_t        gid;                /* gid that owns msdosfs files */
62
        mode_t  mask;                /* mask to be applied for msdosfs perms */
63
        int        flags;                /* see below */
64
65
        /* Following items added after versioning support */
66
        int        version;        /* version of the struct */
67
#define MSDOSFSMNT_VERSION        3
68
        mode_t  dirmask;        /* v2: mask to be applied for msdosfs perms */
69
        int        gmtoff;                /* v3: offset from UTC in seconds */
70
};
71
#endif
72
73
/*
74
 * Msdosfs mount options:
75
 */
76
#define        MSDOSFSMNT_SHORTNAME        1        /* Force old DOS short names only */
77
#define        MSDOSFSMNT_LONGNAME        2        /* Force Win'95 long names */
78
#define        MSDOSFSMNT_NOWIN95        4        /* Completely ignore Win95 entries */
79
#define        MSDOSFSMNT_GEMDOSFS        8        /* This is a GEMDOS-flavour */
80
#define MSDOSFSMNT_VERSIONED        16        /* Struct is versioned */
81
82
/* All flags above: */
83
#define        MSDOSFSMNT_MNTOPT \
84
        (MSDOSFSMNT_SHORTNAME|MSDOSFSMNT_LONGNAME|MSDOSFSMNT_NOWIN95 \
85
         |MSDOSFSMNT_GEMDOSFS|MSDOSFSMNT_VERSIONED)
86
87
#define        MSDOSFSMNT_RONLY        0x80000000        /* mounted read-only        */
88
#define        MSDOSFSMNT_WAITONFAT        0x40000000        /* mounted synchronous        */
89
#define        MSDOSFS_FATMIRROR        0x20000000        /* FAT is mirrored */
90
91
#define MSDOSFSMNT_BITS "\177\20" \
92
    "b\00shortname\0b\01longname\0b\02nowin95\0b\03gemdosfs\0b\04mntversioned\0" \
93
    "b\037ronly\0b\036waitonfat\0b\035fatmirror\0"
94
95
#ifdef _KERNEL
96
#include <sys/mallocvar.h>
97
#ifdef MALLOC_DECLARE
98
MALLOC_DECLARE(M_MSDOSFSMNT);
99
MALLOC_DECLARE(M_MSDOSFSTMP);
100
#endif
101
#endif
102
103
#if defined(_KERNEL) || defined(MAKEFS)
104
/*
105
 * Layout of the mount control block for a MSDOSFS file system.
106
 */
107
struct msdosfsmount {
108
        struct mount *pm_mountp;/* vfs mount struct for this fs */
109
        dev_t pm_dev;                /* block special device mounted */
110
        uid_t pm_uid;                /* uid to set as owner of the files */
111
        gid_t pm_gid;                /* gid to set as owner of the files */
112
        mode_t pm_mask;                /* mask to and with file protection bits
113
                                   for files */
114
        mode_t pm_dirmask;        /* mask to and with file protection bits
115
                                   for directories */
116
        int pm_gmtoff;                /* offset from UTC in seconds */
117
        struct vnode *pm_devvp;        /* vnode for block device mntd */
118
        struct bpb50 pm_bpb;        /* BIOS parameter blk for this fs */
119
        u_long pm_FATsecs;        /* actual number of FAT sectors */
120
        u_long pm_fatblk;        /* sector # of first FAT */
121
        u_long pm_rootdirblk;        /* sector # (cluster # for FAT32) of root directory number */
122
        u_long pm_rootdirsize;        /* size in sectors (not clusters) */
123
        u_long pm_firstcluster;        /* sector number of first cluster */
124
        u_long pm_nmbrofclusters;        /* # of clusters in filesystem */
125
        u_long pm_maxcluster;        /* maximum cluster number */
126
        u_long pm_freeclustercount;        /* number of free clusters */
127
        u_long pm_cnshift;        /* shift file offset right this amount to get a cluster number */
128
        u_long pm_crbomask;        /* and a file offset with this mask to get cluster rel offset */
129
        u_long pm_bnshift;        /* shift file offset right this amount to get a sector number */
130
        u_long pm_bpcluster;        /* bytes per cluster */
131
        u_long pm_fmod;                /* ~0 if fs is modified, this can rollover to 0        */
132
        u_long pm_fatblocksize;        /* size of FAT blocks in bytes */
133
        u_long pm_fatblocksec;        /* size of FAT blocks in sectors */
134
        u_long pm_fatsize;        /* size of FAT in bytes */
135
        u_long pm_fatmask;        /* mask to use for FAT numbers */
136
        u_long pm_fsinfo;        /* fsinfo block number */
137
        u_long pm_nxtfree;        /* next free cluster in fsinfo block */
138
        u_int pm_fatmult;        /* these 2 values are used in FAT */
139
        u_int pm_fatdiv;        /*        offset computation */
140
        u_int pm_curfat;        /* current FAT for FAT32 (0 otherwise) */
141
        u_int *pm_inusemap;        /* ptr to bitmap of in-use clusters */
142
        u_int pm_flags;                /* see below */
143
};
144
/* Byte offset in FAT on filesystem pmp, cluster cn */
145
#define        FATOFS(pmp, cn)        ((cn) * (pmp)->pm_fatmult / (pmp)->pm_fatdiv)
146
147
#define        VFSTOMSDOSFS(mp)        ((struct msdosfsmount *)mp->mnt_data)
148
149
/* Number of bits in one pm_inusemap item: */
150
#define        N_INUSEBITS        (8 * sizeof(u_int))
151
152
/*
153
 * Shorthand for fields in the bpb contained in the msdosfsmount structure.
154
 */
155
#define        pm_BytesPerSec        pm_bpb.bpbBytesPerSec
156
#define        pm_ResSectors        pm_bpb.bpbResSectors
157
#define        pm_FATs                pm_bpb.bpbFATs
158
#define        pm_RootDirEnts        pm_bpb.bpbRootDirEnts
159
#define        pm_Sectors        pm_bpb.bpbSectors
160
#define        pm_Media        pm_bpb.bpbMedia
161
#define        pm_SecPerTrack        pm_bpb.bpbSecPerTrack
162
#define        pm_Heads        pm_bpb.bpbHeads
163
#define        pm_HiddenSects        pm_bpb.bpbHiddenSecs
164
#define        pm_HugeSectors        pm_bpb.bpbHugeSectors
165
166
/*
167
 * Convert pointer to buffer -> pointer to direntry
168
 */
169
#define        bptoep(pmp, bp, dirofs) \
170
        ((struct direntry *)(((char *)(bp)->b_data)        \
171
         + ((dirofs) & (pmp)->pm_crbomask)))
172
173
/*
174
 * Convert sector number to cluster number
175
 */
176
#define        de_bn2cn(pmp, bn) \
177
        ((bn) >> ((pmp)->pm_cnshift - (pmp)->pm_bnshift))
178
179
/*
180
 * Convert cluster number to sector number
181
 */
182
#define        de_cn2bn(pmp, cn) \
183
        ((cn) << ((pmp)->pm_cnshift - (pmp)->pm_bnshift))
184
185
/*
186
 * Convert sector number to kernel block number
187
 */
188
#define de_bn2kb(pmp, bn) \
189
        ((bn) << ((pmp)->pm_bnshift - DEV_BSHIFT))
190
191
/*
192
 * Convert kernel block number to sector number
193
 */
194
#define de_kb2bn(pmp, kb) \
195
        ((kb) >> ((pmp)->pm_bnshift - DEV_BSHIFT))
196
197
/*
198
 * Convert file offset to cluster number
199
 */
200
#define de_cluster(pmp, off) \
201
        ((off) >> (pmp)->pm_cnshift)
202
203
/*
204
 * Clusters required to hold size bytes
205
 */
206
#define        de_clcount(pmp, size) \
207
        (((size) + (pmp)->pm_bpcluster - 1) >> (pmp)->pm_cnshift)
208
209
/*
210
 * Convert file offset to sector number
211
 */
212
#define de_blk(pmp, off) \
213
        (de_cn2bn(pmp, de_cluster((pmp), (off))))
214
215
/*
216
 * Convert cluster number to file offset
217
 */
218
#define        de_cn2off(pmp, cn) \
219
        ((cn) << (pmp)->pm_cnshift)
220
221
/*
222
 * Convert sector number to file offset
223
 */
224
#define        de_bn2off(pmp, bn) \
225
        ((bn) << (pmp)->pm_bnshift)
226
/*
227
 * Map a cluster number into a filesystem relative sector number.
228
 */
229
#define        cntobn(pmp, cn) \
230
        (de_cn2bn((pmp), (cn)-CLUST_FIRST) + (pmp)->pm_firstcluster)
231
232
/*
233
 * Calculate sector number for directory entry in root dir, offset dirofs
234
 */
235
#define        roottobn(pmp, dirofs) \
236
        (de_blk((pmp), (dirofs)) + (pmp)->pm_rootdirblk)
237
238
/*
239
 * Calculate sector number for directory entry at cluster dirclu, offset
240
 * dirofs
241
 */
242
#define        detobn(pmp, dirclu, dirofs) \
243
        ((dirclu) == MSDOSFSROOT \
244
         ? roottobn((pmp), (dirofs)) \
245
         : cntobn((pmp), (dirclu)))
246
247
/*
248
 * Prototypes for MSDOSFS virtual filesystem operations
249
 */
250
void msdosfs_init(void);
251
void msdosfs_reinit(void);
252
void msdosfs_done(void);
253
254
#ifndef MAKEFS
255
VFS_PROTOS(msdosfs);
256
#endif
257
258
#endif /* _KERNEL || MAKEFS */
259
#endif /* _MSDOSFS_MSDOSFSMOUNT_H_ */