123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196 |
- /*
- * Copyright (c) 2000, 2001, 2002, 2003, 2004, 2005, 2008, 2009
- * The President and Fellows of Harvard College.
- *
- * 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. 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 UNIVERSITY 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 UNIVERSITY 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.
- */
- #ifndef _VFS_H_
- #define _VFS_H_
- #include <array.h>
- /*
- * Virtual File System layer functions.
- *
- * The VFS layer translates operations on abstract on-disk files or
- * pathnames to operations on specific files on specific filesystems.
- */
- struct uio; /* kernel or userspace I/O buffer (uio.h) */
- struct device; /* abstract structure for a device (dev.h) */
- struct fs; /* abstract structure for a filesystem (fs.h) */
- struct vnode; /* abstract structure for an on-disk file (vnode.h) */
- /*
- * VFS layer low-level operations.
- * See vnode.h for direct operations on vnodes.
- * See fs.h for direct operations on filesystems/devices.
- *
- * vfs_setcurdir - change current directory of current thread by vnode
- * vfs_clearcurdir - change current directory of current thread to "none"
- * vfs_getcurdir - retrieve vnode of current directory of current thread
- * vfs_sync - force all dirty buffers to disk
- * vfs_getroot - get root vnode for the filesystem named DEVNAME
- * vfs_getdevname - get mounted device name for the filesystem passed in
- */
- int vfs_setcurdir(struct vnode *dir);
- int vfs_clearcurdir(void);
- int vfs_getcurdir(struct vnode **retdir);
- int vfs_sync(void);
- int vfs_getroot(const char *devname, struct vnode **result);
- const char *vfs_getdevname(struct fs *fs);
- /*
- * VFS layer mid-level operations.
- *
- * vfs_lookup - Like VOP_LOOKUP, but takes a full device:path name,
- * or a name relative to the current directory, and
- * goes to the correct filesystem.
- * vfs_lookparent - Likewise, for VOP_LOOKPARENT.
- *
- * Both of these may destroy the path passed in.
- */
- int vfs_lookup(char *path, struct vnode **result);
- int vfs_lookparent(char *path, struct vnode **result,
- char *buf, size_t buflen);
- /*
- * VFS layer high-level operations on pathnames
- * Because namei may destroy pathnames, these all may too.
- *
- * vfs_open - Open or create a file. FLAGS/MODE per the syscall.
- * vfs_readlink - Read contents of a symlink into a uio.
- * vfs_symlink - Create a symlink PATH containing contents CONTENTS.
- * vfs_mkdir - Create a directory. MODE per the syscall.
- * vfs_link - Create a hard link to a file.
- * vfs_remove - Delete a file.
- * vfs_rmdir - Delete a directory.
- * vfs_rename - rename a file.
- *
- * vfs_chdir - Change current directory of current thread by name.
- * vfs_getcwd - Retrieve name of current directory of current thread.
- *
- * vfs_close - Close a vnode opened with vfs_open. Does not fail.
- * (See vfspath.c for a discussion of why.)
- */
- int vfs_open(char *path, int openflags, mode_t mode, struct vnode **ret);
- void vfs_close(struct vnode *vn);
- int vfs_readlink(char *path, struct uio *data);
- int vfs_symlink(const char *contents, char *path);
- int vfs_mkdir(char *path, mode_t mode);
- int vfs_link(char *oldpath, char *newpath);
- int vfs_remove(char *path);
- int vfs_rmdir(char *path);
- int vfs_rename(char *oldpath, char *newpath);
- int vfs_chdir(char *path);
- int vfs_getcwd(struct uio *buf);
- /*
- * Misc
- *
- * vfs_bootstrap - Call during system initialization to allocate
- * structures.
- *
- * vfs_setbootfs - Set the filesystem that paths beginning with a
- * slash are sent to. If not set, these paths fail
- * with ENOENT. The argument should be the device
- * name or volume name for the filesystem (such as
- * "lhd0:") but need not have the trailing colon.
- *
- * vfs_clearbootfs - Clear the bootfs filesystem. This should be
- * done during shutdown so that the filesystem in
- * question can be unmounted.
- *
- * vfs_adddev - Add a device to the VFS named device list. If
- * MOUNTABLE is zero, the device will be accessible
- * as "DEVNAME:". If the mountable flag is set, the
- * device will be accessible as "DEVNAMEraw:" and
- * mountable under the name "DEVNAME". Thus, the
- * console, added with MOUNTABLE not set, would be
- * accessed by pathname as "con:", and lhd0, added
- * with mountable set, would be accessed by
- * pathname as "lhd0raw:" and mounted by passing
- * "lhd0" to vfs_mount.
- *
- * vfs_addfs - Add a hardwired filesystem to the VFS named device
- * list. It will be accessible as "devname:". This is
- * intended for filesystem-devices like emufs, and
- * gizmos like Linux procfs or BSD kernfs, not for
- * mounting filesystems on disk devices.
- *
- * vfs_mount - Attempt to mount a filesystem on a device. The
- * device named by DEVNAME will be looked up and
- * passed, along with DATA, to the supplied function
- * MOUNTFUNC, which should create a struct fs and
- * return it in RESULT.
- *
- * vfs_unmount - Unmount the filesystem presently mounted on the
- * specified device.
- *
- * vfs_unmountall - Unmount all mounted filesystems.
- */
- void vfs_bootstrap(void);
- int vfs_setbootfs(const char *fsname);
- void vfs_clearbootfs(void);
- int vfs_adddev(const char *devname, struct device *dev, int mountable);
- int vfs_addfs(const char *devname, struct fs *fs);
- int vfs_mount(const char *devname, void *data,
- int (*mountfunc)(void *data,
- struct device *dev,
- struct fs **result));
- int vfs_unmount(const char *devname);
- int vfs_unmountall(void);
- /*
- * Array of vnodes.
- */
- #ifndef VFSINLINE
- #define VFSINLINE INLINE
- #endif
- DECLARRAY(vnode);
- DEFARRAY(vnode, VFSINLINE);
- /*
- * Global one-big-lock for all filesystem operations.
- * You must remove this for the filesystem assignment.
- */
- void vfs_biglock_acquire(void);
- void vfs_biglock_release(void);
- bool vfs_biglock_do_i_hold(void);
- #endif /* _VFS_H_ */
|