00001 /* 00002 * Copyright (c) 2000, 2001, 2002, 2003, 2004, 2005, 2008, 2009 00003 * The President and Fellows of Harvard College. 00004 * 00005 * Redistribution and use in source and binary forms, with or without 00006 * modification, are permitted provided that the following conditions 00007 * are met: 00008 * 1. Redistributions of source code must retain the above copyright 00009 * notice, this list of conditions and the following disclaimer. 00010 * 2. Redistributions in binary form must reproduce the above copyright 00011 * notice, this list of conditions and the following disclaimer in the 00012 * documentation and/or other materials provided with the distribution. 00013 * 3. Neither the name of the University nor the names of its contributors 00014 * may be used to endorse or promote products derived from this software 00015 * without specific prior written permission. 00016 * 00017 * THIS SOFTWARE IS PROVIDED BY THE UNIVERSITY AND CONTRIBUTORS ``AS IS'' AND 00018 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 00019 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 00020 * ARE DISCLAIMED. IN NO EVENT SHALL THE UNIVERSITY OR CONTRIBUTORS BE LIABLE 00021 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 00022 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 00023 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 00024 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 00025 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 00026 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 00027 * SUCH DAMAGE. 00028 */ 00029 00030 #ifndef _FS_H_ 00031 #define _FS_H_ 00032 00033 00034 /* 00035 * Abstract filesystem. (Or device accessible as a file.) 00036 * 00037 * Operations: 00038 * 00039 * fs_sync - Flush all dirty buffers to disk. 00040 * fs_getvolname - Return volume name of filesystem. 00041 * fs_getroot - Return root vnode of filesystem. 00042 * fs_unmount - Attempt unmount of filesystem. 00043 * 00044 * fs_getvolname may return NULL on filesystem types that don't 00045 * support the concept of a volume name. The string returned is 00046 * assumed to point into the filesystem's private storage and live 00047 * until unmount time. 00048 * 00049 * If the volume name changes on the fly, there is no way at present 00050 * to make sure such changes don't cause name conflicts. So it probably 00051 * should be considered fixed. 00052 * 00053 * fs_getroot should increment the refcount of the vnode returned. 00054 * It should not ever return NULL. 00055 * 00056 * If fs_unmount returns an error, the filesystem stays mounted, and 00057 * consequently the struct fs instance should remain valid. On success, 00058 * however, the filesystem object and all storage associated with the 00059 * filesystem should have been discarded/released. 00060 * 00061 * fs_data is a pointer to filesystem-specific data. 00062 */ 00063 00064 struct fs { 00065 int (*fs_sync)(struct fs *); 00066 const char *(*fs_getvolname)(struct fs *); 00067 struct vnode *(*fs_getroot)(struct fs *); 00068 int (*fs_unmount)(struct fs *); 00069 00070 void *fs_data; 00071 }; 00072 00073 /* 00074 * Macros to shorten the calling sequences. 00075 */ 00076 #define FSOP_SYNC(fs) ((fs)->fs_sync(fs)) 00077 #define FSOP_GETVOLNAME(fs) ((fs)->fs_getvolname(fs)) 00078 #define FSOP_GETROOT(fs) ((fs)->fs_getroot(fs)) 00079 #define FSOP_UNMOUNT(fs) ((fs)->fs_unmount(fs)) 00080 00081 00082 #endif /* _FS_H_ */