4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License, Version 1.0 only
6 * (the "License"). You may not use this file except in compliance
9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10 * or http://www.opensolaris.org/os/licensing.
11 * See the License for the specific language governing permissions
12 * and limitations under the License.
14 * When distributing Covered Code, include this CDDL HEADER in each
15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16 * If applicable, add the following below this CDDL HEADER, with the
17 * fields enclosed by brackets "[]" replaced with your own identifying
18 * information: Portions Copyright [yyyy] [name of copyright owner]
23 * Copyright 1998 Sun Microsystems, Inc. All rights reserved.
24 * Use is subject to license terms.
27 /* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
28 /* All Rights Reserved */
31 * University Copyright- Copyright (c) 1982, 1986, 1988
32 * The Regents of the University of California
35 * University Acknowledgment- Portions of this document are derived from
36 * software developed by the University of California, Berkeley, and its
43 #pragma ident "%Z%%M% %I% %E% SMI"
45 #include <sys/types.h>
47 #include <sys/vnode.h>
48 #include <sys/statvfs.h>
55 * Data associated with mounted file systems.
59 * File system identifier. Should be unique (at least per machine).
62 int val
[2]; /* file system id type */
66 * File identifier. Should be unique per filesystem on a single
67 * machine. This is typically called by a stateless file server
68 * in order to generate "file handles".
71 #define freefid(fidp) \
72 kmem_free((caddr_t)(fidp), sizeof (struct fid) - MAXFIDSZ + (fidp)->fid_len)
75 ushort_t fid_len
; /* length of data in bytes */
76 char fid_data
[MAXFIDSZ
]; /* data (variable length) */
80 * Structure per mounted file system. Each mounted file system has
81 * an array of operations and an instance record. The file systems
82 * are kept on a singly linked list headed by "rootvfs" and terminated
86 struct vfs
*vfs_next
; /* next VFS in VFS list */
87 struct vfsops
*vfs_op
; /* operations on VFS */
88 struct vnode
*vfs_vnodecovered
; /* vnode mounted on */
89 ulong_t vfs_flag
; /* flags */
90 ulong_t vfs_bsize
; /* native block size */
91 int vfs_fstype
; /* file system type index */
92 fsid_t vfs_fsid
; /* file system id */
93 caddr_t vfs_data
; /* private data */
94 l_dev_t vfs_dev
; /* device of mounted VFS */
95 ulong_t vfs_bcount
; /* I/O count (accounting) */
96 ushort_t vfs_nsubmounts
; /* immediate sub-mount count */
102 #define VFS_RDONLY 0x01 /* read-only vfs */
103 #define VFS_MLOCK 0x02 /* lock vfs so that subtree is stable */
104 #define VFS_MWAIT 0x04 /* someone is waiting for lock */
105 #define VFS_NOSUID 0x08 /* setuid disallowed */
106 #define VFS_REMOUNT 0x10 /* modify mount options only */
107 #define VFS_NOTRUNC 0x20 /* does not truncate long file names */
110 * Argument structure for mount(2).
122 * Reasons for calling the vfs_mountroot() operation.
125 enum whymountroot
{ ROOT_INIT
, ROOT_REMOUNT
, ROOT_UNMOUNT
};
126 typedef enum whymountroot whymountroot_t
;
129 * Operations supported on virtual file system.
131 typedef struct vfsops
{
132 #if defined(__STDC__)
133 int (*vfs_mount
)(struct vfs
*, struct vnode
*, struct mounta
*,
135 int (*vfs_unmount
)(struct vfs
*, struct cred
*);
136 int (*vfs_root
)(struct vfs
*, struct vnode
**);
137 int (*vfs_statvfs
)(struct vfs
*, struct statvfs64
*);
138 int (*vfs_sync
)(struct vfs
*, short, struct cred
*);
139 int (*vfs_vget
)(struct vfs
*, struct vnode
**, struct fid
*);
140 int (*vfs_mountroot
)(struct vfs
*, enum whymountroot
);
141 int (*vfs_swapvp
)(struct vfs
*, struct vnode
**, char *);
142 int (*vfs_filler
[4])(void);
144 int (*vfs_mount
)(); /* mount file system */
145 int (*vfs_unmount
)(); /* unmount file system */
146 int (*vfs_root
)(); /* get root vnode */
147 int (*vfs_statvfs
)(); /* get file system statistics */
148 int (*vfs_sync
)(); /* flush fs buffers */
149 int (*vfs_vget
)(); /* get vnode from fid */
150 int (*vfs_mountroot
)(); /* mount the root filesystem */
151 int (*vfs_swapvp
)(); /* return vnode for swap */
152 int (*vfs_filler
[4])(); /* for future expansion */
156 #define VFS_MOUNT(vfsp, mvp, uap, cr) \
157 (*(vfsp)->vfs_op->vfs_mount)(vfsp, mvp, uap, cr)
158 #define VFS_UNMOUNT(vfsp, cr) (*(vfsp)->vfs_op->vfs_unmount)(vfsp, cr)
159 #define VFS_ROOT(vfsp, vpp) (*(vfsp)->vfs_op->vfs_root)(vfsp, vpp)
160 #define VFS_STATVFS(vfsp, sp) (*(vfsp)->vfs_op->vfs_statvfs)(vfsp, sp)
161 #define VFS_SYNC(vfsp) (*(vfsp)->vfs_op->vfs_sync)(vfsp)
162 #define VFS_VGET(vfsp, vpp, fidp) \
163 (*(vfsp)->vfs_op->vfs_vget)(vfsp, vpp, fidp)
164 #define VFS_MOUNTROOT(vfsp, init) \
165 (*(vfsp)->vfs_op->vfs_mountroot)(vfsp, init)
166 #define VFS_SWAPVP(vfsp, vpp, nm) \
167 (*(vfsp)->vfs_op->vfs_swapvp)(vfsp, vpp, nm)
170 * Filesystem type switch table.
172 typedef struct vfssw
{
173 char *vsw_name
; /* type name string */
174 #if defined(__STDC__)
175 int (*vsw_init
)(struct vfssw
*, int);
177 int (*vsw_init
)(); /* init routine */
179 struct vfsops
*vsw_vfsops
; /* filesystem operations vector */
180 int vsw_flag
; /* flags */
186 #if defined(__STDC__)
187 void vfs_mountroot(void);
188 void vfs_add(vnode_t
*, struct vfs
*, int);
189 void vfs_remove(struct vfs
*);
190 int vfs_lock(struct vfs
*);
191 void vfs_unlock(struct vfs
*);
192 struct vfs
*getvfs(fsid_t
*);
193 struct vfs
*vfs_devsearch(dev_t
);
194 struct vfssw
*vfs_getvfssw(char *);
195 u_int
vf_to_stf(u_int
);
197 extern void vfs_mountroot(); /* mount the root */
198 extern void vfs_add(); /* add a new vfs to mounted vfs list */
199 extern void vfs_remove(); /* remove a vfs from mounted vfs list */
200 extern int vfs_lock(); /* lock a vfs */
201 extern void vfs_unlock(); /* unlock a vfs */
202 extern vfs_t
*getvfs(); /* return vfs given fsid */
203 extern vfs_t
*vfs_devsearch(); /* find vfs given device */
204 extern vfssw_t
*vfs_getvfssw(); /* find vfssw ptr given fstype name */
205 extern ulong_t
vf_to_stf(); /* map VFS flags to statfs flags */
208 #define VFS_INIT(vfsp, op, data) { \
209 (vfsp)->vfs_next = (struct vfs *)0; \
210 (vfsp)->vfs_op = (op); \
211 (vfsp)->vfs_flag = 0; \
212 (vfsp)->vfs_data = (data); \
213 (vfsp)->vfs_nsubmounts = 0; \
219 extern struct vfs
*rootvfs
; /* ptr to root vfs structure */
220 extern struct vfssw vfssw
[]; /* table of filesystem types */
221 extern char rootfstype
[]; /* name of root fstype */
222 extern int nfstype
; /* # of elements in vfssw array */
225 * file system statistics, from SunOS 4.1
227 #if _FILE_OFFSET_BITS == 32
229 int f_type
; /* type of info, zero for now */
230 int f_bsize
; /* fundamental file system block size */
231 int f_blocks
; /* total blocks in file system */
232 int f_bfree
; /* free blocks in fs */
233 int f_bavail
; /* free blocks avail to non-superuser */
234 int f_files
; /* total file nodes in file system */
235 int f_ffree
; /* free files nodes in fs */
236 fsid_t f_fsid
; /* file system id */
237 int f_spare
[7]; /* spare for later */
239 #elif _FILE_OFFSET_BITS == 64
241 long f_type
; /* type of info, zero for now */
242 ulong_t f_bsize
; /* fundamental file system block size */
243 fsblkcnt_t f_blocks
; /* total blocks in file system */
244 fsblkcnt_t f_bfree
; /* free blocks in fs */
245 fsblkcnt_t f_bavail
; /* free blocks avail to non-superuser */
246 fsfilcnt_t f_files
; /* total file nodes in file system */
247 fsfilcnt_t f_ffree
; /* free files nodes in fs */
248 fsid_t f_fsid
; /* file system id */
249 int f_spare
[7]; /* spare for later */
252 #if defined(_LARGEFILE64_SOURCE)
254 long f_type
; /* type of info, zero for now */
256 ulong_t f_bsize
; /* fundamental file system block size */
257 fsblkcnt_t f_blocks
; /* total blocks in file system */
258 fsblkcnt_t f_bfree
; /* free blocks in fs */
259 fsblkcnt_t f_bavail
; /* free blocks avail to non-superuser */
260 fsfilcnt_t f_files
; /* total file nodes in file system */
261 fsfilcnt_t f_ffree
; /* free files nodes in fs */
262 fsid_t f_fsid
; /* file system id */
263 int f_spare
[7]; /* spare for later */
271 #endif /* _SYS_VFS_H */