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
|
/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License, Version 1.0 only
* (the "License"). You may not use this file except in compliance
* with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* or http://www.opensolaris.org/os/licensing.
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at usr/src/OPENSOLARIS.LICENSE.
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/
/*
* Copyright 1998 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
/* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
/* All Rights Reserved */
/*
* University Copyright- Copyright (c) 1982, 1986, 1988
* The Regents of the University of California
* All Rights Reserved
*
* University Acknowledgment- Portions of this document are derived from
* software developed by the University of California, Berkeley, and its
* contributors.
*/
#ifndef _SYS_VFS_H
#define _SYS_VFS_H
#pragma ident "%Z%%M% %I% %E% SMI"
#include <sys/types.h>
#include <sys/cred.h>
#include <sys/vnode.h>
#include <sys/statvfs.h>
#ifdef __cplusplus
extern "C" {
#endif
/*
* Data associated with mounted file systems.
*/
/*
* File system identifier. Should be unique (at least per machine).
*/
typedef struct {
int val[2]; /* file system id type */
} fsid_t;
/*
* File identifier. Should be unique per filesystem on a single
* machine. This is typically called by a stateless file server
* in order to generate "file handles".
*/
#define MAXFIDSZ 16
#define freefid(fidp) \
kmem_free((caddr_t)(fidp), sizeof (struct fid) - MAXFIDSZ + (fidp)->fid_len)
typedef struct fid {
ushort_t fid_len; /* length of data in bytes */
char fid_data[MAXFIDSZ]; /* data (variable length) */
} fid_t;
/*
* Structure per mounted file system. Each mounted file system has
* an array of operations and an instance record. The file systems
* are kept on a singly linked list headed by "rootvfs" and terminated
* by NULL.
*/
typedef struct vfs {
struct vfs *vfs_next; /* next VFS in VFS list */
struct vfsops *vfs_op; /* operations on VFS */
struct vnode *vfs_vnodecovered; /* vnode mounted on */
ulong_t vfs_flag; /* flags */
ulong_t vfs_bsize; /* native block size */
int vfs_fstype; /* file system type index */
fsid_t vfs_fsid; /* file system id */
caddr_t vfs_data; /* private data */
l_dev_t vfs_dev; /* device of mounted VFS */
ulong_t vfs_bcount; /* I/O count (accounting) */
ushort_t vfs_nsubmounts; /* immediate sub-mount count */
} vfs_t;
/*
* VFS flags.
*/
#define VFS_RDONLY 0x01 /* read-only vfs */
#define VFS_MLOCK 0x02 /* lock vfs so that subtree is stable */
#define VFS_MWAIT 0x04 /* someone is waiting for lock */
#define VFS_NOSUID 0x08 /* setuid disallowed */
#define VFS_REMOUNT 0x10 /* modify mount options only */
#define VFS_NOTRUNC 0x20 /* does not truncate long file names */
/*
* Argument structure for mount(2).
*/
struct mounta {
char *spec;
char *dir;
int flags;
char *fstype;
char *dataptr;
int datalen;
};
/*
* Reasons for calling the vfs_mountroot() operation.
*/
enum whymountroot { ROOT_INIT, ROOT_REMOUNT, ROOT_UNMOUNT };
typedef enum whymountroot whymountroot_t;
/*
* Operations supported on virtual file system.
*/
typedef struct vfsops {
#if defined(__STDC__)
int (*vfs_mount)(struct vfs *, struct vnode *, struct mounta *,
struct cred *);
int (*vfs_unmount)(struct vfs *, struct cred *);
int (*vfs_root)(struct vfs *, struct vnode **);
int (*vfs_statvfs)(struct vfs *, struct statvfs64 *);
int (*vfs_sync)(struct vfs *, short, struct cred *);
int (*vfs_vget)(struct vfs *, struct vnode **, struct fid *);
int (*vfs_mountroot)(struct vfs *, enum whymountroot);
int (*vfs_swapvp)(struct vfs *, struct vnode **, char *);
int (*vfs_filler[4])(void);
#else
int (*vfs_mount)(); /* mount file system */
int (*vfs_unmount)(); /* unmount file system */
int (*vfs_root)(); /* get root vnode */
int (*vfs_statvfs)(); /* get file system statistics */
int (*vfs_sync)(); /* flush fs buffers */
int (*vfs_vget)(); /* get vnode from fid */
int (*vfs_mountroot)(); /* mount the root filesystem */
int (*vfs_swapvp)(); /* return vnode for swap */
int (*vfs_filler[4])(); /* for future expansion */
#endif
} vfsops_t;
#define VFS_MOUNT(vfsp, mvp, uap, cr) \
(*(vfsp)->vfs_op->vfs_mount)(vfsp, mvp, uap, cr)
#define VFS_UNMOUNT(vfsp, cr) (*(vfsp)->vfs_op->vfs_unmount)(vfsp, cr)
#define VFS_ROOT(vfsp, vpp) (*(vfsp)->vfs_op->vfs_root)(vfsp, vpp)
#define VFS_STATVFS(vfsp, sp) (*(vfsp)->vfs_op->vfs_statvfs)(vfsp, sp)
#define VFS_SYNC(vfsp) (*(vfsp)->vfs_op->vfs_sync)(vfsp)
#define VFS_VGET(vfsp, vpp, fidp) \
(*(vfsp)->vfs_op->vfs_vget)(vfsp, vpp, fidp)
#define VFS_MOUNTROOT(vfsp, init) \
(*(vfsp)->vfs_op->vfs_mountroot)(vfsp, init)
#define VFS_SWAPVP(vfsp, vpp, nm) \
(*(vfsp)->vfs_op->vfs_swapvp)(vfsp, vpp, nm)
/*
* Filesystem type switch table.
*/
typedef struct vfssw {
char *vsw_name; /* type name string */
#if defined(__STDC__)
int (*vsw_init)(struct vfssw *, int);
#else
int (*vsw_init)(); /* init routine */
#endif
struct vfsops *vsw_vfsops; /* filesystem operations vector */
int vsw_flag; /* flags */
} vfssw_t;
/*
* Public operations.
*/
#if defined(__STDC__)
void vfs_mountroot(void);
void vfs_add(vnode_t *, struct vfs *, int);
void vfs_remove(struct vfs *);
int vfs_lock(struct vfs *);
void vfs_unlock(struct vfs *);
struct vfs *getvfs(fsid_t *);
struct vfs *vfs_devsearch(dev_t);
struct vfssw *vfs_getvfssw(char *);
u_int vf_to_stf(u_int);
#else
extern void vfs_mountroot(); /* mount the root */
extern void vfs_add(); /* add a new vfs to mounted vfs list */
extern void vfs_remove(); /* remove a vfs from mounted vfs list */
extern int vfs_lock(); /* lock a vfs */
extern void vfs_unlock(); /* unlock a vfs */
extern vfs_t *getvfs(); /* return vfs given fsid */
extern vfs_t *vfs_devsearch(); /* find vfs given device */
extern vfssw_t *vfs_getvfssw(); /* find vfssw ptr given fstype name */
extern ulong_t vf_to_stf(); /* map VFS flags to statfs flags */
#endif
#define VFS_INIT(vfsp, op, data) { \
(vfsp)->vfs_next = (struct vfs *)0; \
(vfsp)->vfs_op = (op); \
(vfsp)->vfs_flag = 0; \
(vfsp)->vfs_data = (data); \
(vfsp)->vfs_nsubmounts = 0; \
}
/*
* Globals.
*/
extern struct vfs *rootvfs; /* ptr to root vfs structure */
extern struct vfssw vfssw[]; /* table of filesystem types */
extern char rootfstype[]; /* name of root fstype */
extern int nfstype; /* # of elements in vfssw array */
/*
* file system statistics, from SunOS 4.1
*/
#if _FILE_OFFSET_BITS == 32
struct statfs {
int f_type; /* type of info, zero for now */
int f_bsize; /* fundamental file system block size */
int f_blocks; /* total blocks in file system */
int f_bfree; /* free blocks in fs */
int f_bavail; /* free blocks avail to non-superuser */
int f_files; /* total file nodes in file system */
int f_ffree; /* free files nodes in fs */
fsid_t f_fsid; /* file system id */
int f_spare[7]; /* spare for later */
};
#elif _FILE_OFFSET_BITS == 64
struct statfs {
long f_type; /* type of info, zero for now */
ulong_t f_bsize; /* fundamental file system block size */
fsblkcnt_t f_blocks; /* total blocks in file system */
fsblkcnt_t f_bfree; /* free blocks in fs */
fsblkcnt_t f_bavail; /* free blocks avail to non-superuser */
fsfilcnt_t f_files; /* total file nodes in file system */
fsfilcnt_t f_ffree; /* free files nodes in fs */
fsid_t f_fsid; /* file system id */
int f_spare[7]; /* spare for later */
};
#endif
#if defined(_LARGEFILE64_SOURCE)
struct statfs64 {
long f_type; /* type of info, zero for now */
ulong_t f_bsize; /* fundamental file system block size */
fsblkcnt_t f_blocks; /* total blocks in file system */
fsblkcnt_t f_bfree; /* free blocks in fs */
fsblkcnt_t f_bavail; /* free blocks avail to non-superuser */
fsfilcnt_t f_files; /* total file nodes in file system */
fsfilcnt_t f_ffree; /* free files nodes in fs */
fsid_t f_fsid; /* file system id */
int f_spare[7]; /* spare for later */
};
#endif
#ifdef __cplusplus
}
#endif
#endif /* _SYS_VFS_H */
|