-
Notifications
You must be signed in to change notification settings - Fork 24
/
mount.h
331 lines (298 loc) · 11.4 KB
/
mount.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
/*
* Copyright (c) 1989 The Regents of the University of California.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the University of
* California, Berkeley and its contributors.
* 4. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* from: @(#)mount.h 7.22 (Berkeley) 6/3/91
* $Id: mount.h,v 1.26.2.2 1994/04/14 04:06:40 cgd Exp $
*/
#ifndef _SYS_MOUNT_H_
#define _SYS_MOUNT_H_
typedef quad fsid_t; /* file system id type */
/*
* File identifier.
* These are unique per filesystem on a single machine.
*/
#define MAXFIDSZ 16
struct fid {
u_short fid_len; /* length of data in bytes */
u_short fid_reserved; /* force longword alignment */
char fid_data[MAXFIDSZ]; /* data (variable length) */
};
/*
* file system statistics
*/
#define MFSNAMELEN 15 /* length of fs type name, not inc. null */
#define MNAMELEN 90 /* length of buffer for returned name */
struct statfs {
short f_type; /* type of filesystem (unused; zero) */
short f_flags; /* copy of mount flags */
long f_fsize; /* fundamental file system block size */
long f_bsize; /* optimal transfer block size */
long f_blocks; /* total data blocks in file system */
long f_bfree; /* free blocks in fs */
long f_bavail; /* free blocks avail to non-superuser */
long f_files; /* total file nodes in file system */
long f_ffree; /* free file nodes in fs */
fsid_t f_fsid; /* file system id */
long f_spare[5]; /* spare for later */
char f_fstypename[MFSNAMELEN+1]; /* fs type name (inc. null) */
char f_mntonname[MNAMELEN]; /* directory on which mounted */
char f_mntfromname[MNAMELEN];/* mounted filesystem */
};
/*
* File system types.
*/
#define MOUNT_EXPORT ((char *)0) /* use this for exporting (mountd) */
#define MOUNT_UFS "ufs" /* UNIX "Fast" Filesystem */
#define MOUNT_NFS "nfs" /* Network Filesystem */
#define MOUNT_MFS "mfs" /* Memory Filesystem */
#define MOUNT_MSDOS "msdos" /* MSDOS Filesystem */
#define MOUNT_ISOFS "isofs" /* iso9660 cdrom */
#define MOUNT_FDESC "fdesc" /* /dev/fd filesystem */
#define MOUNT_KERNFS "kernfs" /* kernel variable filesystem */
/* XXX SLOT 8 IS CURRENTLY EMPTY */
/* XXX SLOT 9 IS CURRENTLY EMPTY */
#define MOUNT_PROCFS "procfs" /* proc filesystem */
#define MOUNT_LOFS "lofs" /* loopback filesystem */
#define MOUNT_PORTAL "portal" /* portal filesystem */
/*
* Structure per mounted file system.
* Each mounted file system has an array of
* operations and an instance record.
* The file systems are put on a doubly linked list.
*/
struct mount {
struct mount *mnt_next; /* next in mount list */
struct mount *mnt_prev; /* prev in mount list */
struct vfsops *mnt_op; /* operations on fs */
struct vnode *mnt_vnodecovered; /* vnode we mounted on */
struct vnode *mnt_mounth; /* list of vnodes this mount */
int mnt_flag; /* flags */
uid_t mnt_exroot; /* exported mapping for uid 0 */
struct statfs mnt_stat; /* cache of filesystem stats */
qaddr_t mnt_data; /* private data */
};
/*
* Mount flags.
*/
#define MNT_RDONLY 0x00000001 /* read only filesystem */
#define MNT_SYNCHRONOUS 0x00000002 /* file system written synchronously */
#define MNT_NOEXEC 0x00000004 /* can't exec from filesystem */
#define MNT_NOSUID 0x00000008 /* don't honor setuid bits on fs */
#define MNT_NODEV 0x00000010 /* don't interpret special files */
#define MNT_UNION 0x00000020 /* union with underlying filesystem */
#define MNT_NOCREATE 0x00000040 /* don't allow filename creation */
/*
* exported mount flags.
*/
#define MNT_EXPORTED 0x00000100 /* file system is exported */
#define MNT_EXRDONLY 0x00000200 /* exported read only */
/*
* Flags set by internal operations.
*/
#define MNT_LOCAL 0x00001000 /* filesystem is stored locally */
#define MNT_QUOTA 0x00002000 /* quotas are enabled on filesystem */
#define MNT_USER 0x00008000 /* mounted by a user */
/*
* Mask of flags that are visible to statfs()
*/
#define MNT_VISFLAGMASK 0x0000ffff
/*
* filesystem control flags.
*
* MNT_MLOCK lock the mount entry so that name lookup cannot proceed
* past the mount point. This keeps the subtree stable during mounts
* and unmounts.
*/
#define MNT_UPDATE 0x00010000 /* not a real mount, just an update */
#define MNT_MLOCK 0x00100000 /* lock so that subtree is stable */
#define MNT_MWAIT 0x00200000 /* someone is waiting for lock */
#define MNT_MPBUSY 0x00400000 /* scan of mount point in progress */
#define MNT_MPWANT 0x00800000 /* waiting for mount point */
#define MNT_UNMOUNT 0x01000000 /* unmount in progress */
/*
* Operations supported on mounted file system.
*/
#ifdef KERNEL
#ifdef __STDC__
struct nameidata;
#endif
struct vfsops {
char *vfs_name;
int (*vfs_mount) __P((struct mount *mp, char *path, caddr_t data,
struct nameidata *ndp, struct proc *p));
int (*vfs_start) __P((struct mount *mp, int flags,
struct proc *p));
int (*vfs_unmount) __P((struct mount *mp, int mntflags,
struct proc *p));
int (*vfs_root) __P((struct mount *mp, struct vnode **vpp));
/* int uid, should be uid_t */
int (*vfs_quotactl) __P((struct mount *mp, int cmds, uid_t uid,
caddr_t arg, struct proc *p));
int (*vfs_statfs) __P((struct mount *mp, struct statfs *sbp,
struct proc *p));
int (*vfs_sync) __P((struct mount *mp, int waitfor));
int (*vfs_fhtovp) __P((struct mount *mp, struct fid *fhp,
struct vnode **vpp));
int (*vfs_vptofh) __P((struct vnode *vp, struct fid *fhp));
int (*vfs_init) __P(());
};
#define VFS_MOUNT(MP, PATH, DATA, NDP, P) \
(*(MP)->mnt_op->vfs_mount)(MP, PATH, DATA, NDP, P)
#define VFS_START(MP, FLAGS, P) (*(MP)->mnt_op->vfs_start)(MP, FLAGS, P)
#define VFS_UNMOUNT(MP, FORCE, P) (*(MP)->mnt_op->vfs_unmount)(MP, FORCE, P)
#define VFS_ROOT(MP, VPP) (*(MP)->mnt_op->vfs_root)(MP, VPP)
#define VFS_QUOTACTL(MP,C,U,A,P) (*(MP)->mnt_op->vfs_quotactl)(MP, C, U, A, P)
#define VFS_STATFS(MP, SBP, P) (*(MP)->mnt_op->vfs_statfs)(MP, SBP, P)
#define VFS_SYNC(MP, WAITFOR) (*(MP)->mnt_op->vfs_sync)(MP, WAITFOR)
#define VFS_FHTOVP(MP, FIDP, VPP) (*(MP)->mnt_op->vfs_fhtovp)(MP, FIDP, VPP)
#define VFS_VPTOFH(VP, FIDP) (*(VP)->v_mount->mnt_op->vfs_vptofh)(VP, FIDP)
#endif /* KERNEL */
/*
* Flags for various system call interfaces.
*
* forcibly flags for vfs_umount().
* waitfor flags to vfs_sync() and getfsstat()
*/
#define MNT_FORCE 1
#define MNT_NOFORCE 2
#define MNT_WAIT 1
#define MNT_NOWAIT 2
/*
* Generic file handle
*/
struct fhandle {
fsid_t fh_fsid; /* File system id of mount point */
struct fid fh_fid; /* Id of file */
};
typedef struct fhandle fhandle_t;
/*
* Arguments to export mount
*/
struct export_args {
uid_t exroot; /* mapping for root uid */
};
/*
* Arguments to mount UFS
*/
struct ufs_args {
char *fspec; /* block special device to mount */
};
/*
* Arguments to mount MFS
*/
struct mfs_args {
char *name; /* name to export for statfs */
caddr_t base; /* base address of file system in memory */
u_long size; /* size of file system */
};
/*
* File Handle (32 bytes for version 2), variable up to 1024 for version 3
*/
union nfsv2fh {
fhandle_t fh_generic;
u_char fh_bytes[32];
};
typedef union nfsv2fh nfsv2fh_t;
/*
* Arguments to mount NFS
*/
struct nfs_args {
struct sockaddr *addr; /* file server address */
int sotype; /* Socket type */
int proto; /* and Protocol */
nfsv2fh_t *fh; /* File handle to be mounted */
int flags; /* flags */
int wsize; /* write size in bytes */
int rsize; /* read size in bytes */
int timeo; /* initial timeout in .1 secs */
int retrans; /* times to retry send */
char *hostname; /* server's name */
};
/*
* NFS mount option flags
*/
#define NFSMNT_SOFT 0x0001 /* soft mount (hard is default) */
#define NFSMNT_WSIZE 0x0002 /* set write size */
#define NFSMNT_RSIZE 0x0004 /* set read size */
#define NFSMNT_TIMEO 0x0008 /* set initial timeout */
#define NFSMNT_RETRANS 0x0010 /* set number of request retrys */
#define NFSMNT_HOSTNAME 0x0020 /* set hostname for error printf */
#define NFSMNT_INT 0x0040 /* allow interrupts on hard mount */
#define NFSMNT_NOCONN 0x0080 /* Don't Connect the socket */
#define NFSMNT_SCKLOCK 0x0100 /* Lock socket against others */
#define NFSMNT_WANTSCK 0x0200 /* Want a socket lock */
#define NFSMNT_SPONGY 0x0400 /* spongy mount (soft for stat and lookup) */
#define NFSMNT_COMPRESS 0x0800 /* Compress nfs rpc xdr */
#define NFSMNT_LOCKBITS (NFSMNT_SCKLOCK | NFSMNT_WANTSCK)
/*
* Arguments to mount ISO 9660 filesystems.
*/
struct iso_args {
char *fspec; /* block special holding the fs to mount */
int flags; /* mounting flags, see below */
};
#define ISOFSMNT_NORRIP 0x00000001 /* disable Rock Ridge Ext.*/
#define ISOFSMNT_GENS 0x00000002 /* enable usage of generation numbers */
#define ISOFSMNT_EXTATT 0x00000004 /* enable usage of extended attributes */
/*
* Arguments to mount MSDOS filesystems.
*/
struct msdosfs_args {
char *fspec; /* blocks special holding the fs to mount */
uid_t uid; /* uid that owns msdosfs files */
gid_t gid; /* gid that owns msdosfs files */
mode_t mask; /* mask to be applied for msdosfs perms */
};
#ifdef KERNEL
/*
* exported vnode operations
*/
void vfs_remove __P((struct mount *mp)); /* remove a vfs from mount list */
int vfs_lock __P((struct mount *mp)); /* lock a vfs */
void vfs_unlock __P((struct mount *mp)); /* unlock a vfs */
struct mount *getvfs __P((fsid_t *fsid)); /* return vfs given fsid */
struct mount *rootfs; /* ptr to root mount structure */
extern struct vfsops *vfssw[]; /* mount filesystem type table */
extern int nvfssw; /* number of vfssw entries */
#else /* KERNEL */
#include <sys/cdefs.h>
__BEGIN_DECLS
int fstatfs __P((int, struct statfs *));
int getfh __P((const char *, fhandle_t *));
int getfsstat __P((struct statfs *, long, int));
int getmntinfo __P((struct statfs **, int));
int mount __P((char *, const char *, int, void *));
int statfs __P((const char *, struct statfs *));
int unmount __P((const char *, int));
__END_DECLS
#endif /* KERNEL */
#endif /* !_SYS_MOUNT_H_ */