vfs.h revision 7c478bd95313f5f23a4c958a745db2134aa03244
/*
* 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*/