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
|
/*
* 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 1988 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
#pragma ident "%Z%%M% %I% %E% SMI"
/*
* File system identifier. Should be unique (at least per machine).
*/
#ifndef _sys_vfs_h
#define _sys_vfs_h
typedef struct {
long val[2]; /* file system id type */
} fsid_t;
/*
* File identifier. Should be unique per filesystem on a single machine.
*/
#define MAXFIDSZ 16
#define freefid(fidp) \
kmem_free((caddr_t)(fidp), sizeof (struct fid) - MAXFIDSZ + (fidp)->fid_len)
struct fid {
u_short fid_len; /* length of data in bytes */
char fid_data[MAXFIDSZ]; /* data (variable length) */
};
/*
* 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 singly linked list.
* If vfs_stats is non-NULL statistics are gathered, see vfs_stat.h
*/
struct vfs {
struct vfs *vfs_next; /* next vfs in vfs list */
struct vfsops *vfs_op; /* operations on vfs */
struct vnode *vfs_vnodecovered; /* vnode we mounted on */
int vfs_flag; /* flags */
int vfs_bsize; /* native block size */
fsid_t vfs_fsid; /* file system id */
caddr_t vfs_stats; /* filesystem statistics */
caddr_t vfs_data; /* private data */
};
/*
* vfs flags.
* VFS_MLOCK lock the vfs so that name lookup cannot proceed past the vfs.
* This keeps the subtree stable during mounts and unmounts.
*/
#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 /* turn off set-uid on exec */
#define VFS_GRPID 0x10 /* Old BSD group-id on create */
#define VFS_NOSUB 0x20 /* No mounts allowed beneath this fs */
#define VFS_REMOUNT 0x40 /* modify mount otions only */
#define VFS_MULTI 0x80 /* Do multi-component lookup on files */
/*
* Operations supported on virtual file system.
*/
struct vfsops {
int (*vfs_mount)(); /* mount file system */
int (*vfs_unmount)(); /* unmount file system */
int (*vfs_root)(); /* get root vnode */
int (*vfs_statfs)(); /* get fs 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 */
};
#define VFS_MOUNT(VFSP, PATH, DATA) \
(*(VFSP)->vfs_op->vfs_mount)(VFSP, PATH, DATA)
#define VFS_UNMOUNT(VFSP) (*(VFSP)->vfs_op->vfs_unmount)(VFSP)
#define VFS_ROOT(VFSP, VPP) (*(VFSP)->vfs_op->vfs_root)(VFSP,VPP)
#define VFS_STATFS(VFSP, SBP) (*(VFSP)->vfs_op->vfs_statfs)(VFSP,SBP)
#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, VPP, NM) \
(*(VFSP)->vfs_op->vfs_mountroot)(VFSP, VPP, NM)
#define VFS_SWAPVP(VFSP, VPP, NM) (*(VFSP)->vfs_op->vfs_swapvp)(VFSP, VPP, NM)
/*
* file system statistics
*/
struct statfs {
long f_type; /* type of info, zero for now */
long f_bsize; /* fundamental file system block size */
long f_blocks; /* total blocks in file system */
long f_bfree; /* free block 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[7]; /* spare for later */
};
#ifdef KERNEL
/*
* Filesystem type switch table
*/
struct vfssw {
char *vsw_name; /* type name string */
struct vfsops *vsw_ops; /* filesystem operations vector */
};
/*
* public operations
*/
extern void vfs_mountroot(); /* mount the root */
extern int 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 struct vfs *getvfs(); /* return vfs given fsid */
extern struct vfssw *getfstype(); /* find default filesystem type */
extern int vfs_getmajor(); /* get major device # for an fs type */
extern void vfs_putmajor(); /* free major device # for an fs type */
extern int vfs_getnum(); /* get device # for an fs type */
extern void vfs_putnum(); /* release device # for an fs type */
#define VFS_INIT(VFSP, OP, DATA) { \
(VFSP)->vfs_next = (struct vfs *)0; \
(VFSP)->vfs_op = (OP); \
(VFSP)->vfs_flag = 0; \
(VFSP)->vfs_stats = NULL; \
(VFSP)->vfs_data = (DATA); \
}
/*
* globals
*/
extern struct vfs *rootvfs; /* ptr to root vfs structure */
extern struct vfssw vfssw[]; /* table of filesystem types */
extern struct vfssw *vfsNVFS; /* vfs switch table end marker */
#endif
#endif /*!_sys_vfs_h*/
|