diff options
-rw-r--r-- | sys/sys/bufobj.h | 74 | ||||
-rw-r--r-- | sys/sys/vnode.h | 22 |
2 files changed, 89 insertions, 7 deletions
diff --git a/sys/sys/bufobj.h b/sys/sys/bufobj.h new file mode 100644 index 000000000000..b930176fa798 --- /dev/null +++ b/sys/sys/bufobj.h @@ -0,0 +1,74 @@ +/*- + * Copyright (c) 2004 Poul-Henning Kamp + * All rights reserved. + * + * 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. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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. + * + * $FreeBSD$ + */ + +/* + * Architectural notes: + * + * bufobj is a new object which is what buffers hang from in the buffer + * cache. + * + * This used to be vnodes, but we need non-vnode code to be able + * to use the buffer cache as well, specifically geom classes like gbde, + * raid3 and raid5. + * + * All vnodes will contain a bufobj initially, but down the road we may + * want to only allocate bufobjs when they are needed. There could be a + * large number of vnodes in the system which wouldn't need a bufobj during + * their lifetime. + * + * The exact relationship to the vmobject is not determined at this point, + * it may in fact bee that we find them to be two sides of the same object + * once things starts to crystalize. + */ + +#ifndef _SYS_BUFOBJ_H_ +#define _SYS_BUFOBJ_H_ + +#if defined(_KERNEL) || defined(_KVM_VNODE) + +#include <sys/queue.h> + +TAILQ_HEAD(buflists, buf); + +/* A Buffer splay list */ +struct bufv { + struct buflists bv_hd; /* Sorted blocklist */ + struct buf *bv_root; /* Buf splay tree */ + int bv_cnt; /* Number of buffers */ +}; + +struct bufobj { + struct mtx *bo_mtx; /* Mutex which protects "i" things */ + struct bufv bo_clean; /* i Clean buffers */ + struct bufv bo_dirty; /* i Dirty buffers */ +}; + +#endif /* defined(_KERNEL) || defined(_KVM_VNODE) */ +#endif /* _SYS_BUFOBJ_H_ */ + + diff --git a/sys/sys/vnode.h b/sys/sys/vnode.h index 51f05812ab49..f909d0d521f1 100644 --- a/sys/sys/vnode.h +++ b/sys/sys/vnode.h @@ -39,6 +39,7 @@ */ #include <sys/lockmgr.h> +#include <sys/bufobj.h> #include <sys/queue.h> #include <sys/_lock.h> #include <sys/lock.h> @@ -64,7 +65,6 @@ enum vtype { VNON, VREG, VDIR, VBLK, VCHR, VLNK, VSOCK, VFIFO, VBAD }; * Each underlying filesystem allocates its own private area and hangs * it from v_data. If non-null, this area is freed in getnewvnode(). */ -TAILQ_HEAD(buflists, buf); typedef int vop_t(void *); struct namecache; @@ -104,6 +104,8 @@ struct vpollinfo { * locked consistently. This is a work in progress. Requires Giant! */ +#if defined(_KERNEL) || defined(_KVM_VNODE) + struct vnode { struct mtx v_interlock; /* lock for "i" things */ u_long v_iflag; /* i vnode flags (see below) */ @@ -111,12 +113,7 @@ struct vnode { long v_numoutput; /* i writes in progress */ struct thread *v_vxthread; /* i thread owning VXLOCK */ int v_holdcnt; /* i page & buffer references */ - struct buflists v_cleanblkhd; /* i SORTED clean blocklist */ - struct buf *v_cleanblkroot; /* i clean buf splay tree */ - int v_cleanbufcnt; /* i number of clean buffers */ - struct buflists v_dirtyblkhd; /* i SORTED dirty blocklist */ - struct buf *v_dirtyblkroot; /* i dirty buf splay tree */ - int v_dirtybufcnt; /* i number of dirty buffers */ + struct bufobj v_bufobj; /* * Buffer cache object */ u_long v_vflag; /* v vnode flags */ int v_writecount; /* v ref count of writers */ struct vm_object *v_object; /* v Place to store VM object */ @@ -158,12 +155,23 @@ struct vnode { ino_t v_cachedid; /* cached file id */ int v_bsize; /* block size for I/O */ }; + +#endif /* defined(_KERNEL) || defined(_KVM_VNODE) */ + #define v_mountedhere v_un.vu_mountedhere #define v_socket v_un.vu_socket #define v_rdev v_un.vu_spec.vu_cdev #define v_specnext v_un.vu_spec.vu_specnext #define v_fifoinfo v_un.vu_fifoinfo +/* XXX: These are temporary to avoid a source sweep at this time */ +#define v_cleanblkhd v_bufobj.bo_clean.bv_hd +#define v_cleanblkroot v_bufobj.bo_clean.bv_root +#define v_cleanbufcnt v_bufobj.bo_clean.bv_cnt +#define v_dirtyblkhd v_bufobj.bo_dirty.bv_hd +#define v_dirtyblkroot v_bufobj.bo_dirty.bv_root +#define v_dirtybufcnt v_bufobj.bo_dirty.bv_cnt + /* * Userland version of struct vnode, for sysctl. */ |