PERFORCE change 179301 for review
Gleb Kurtsou
gk at FreeBSD.org
Mon Jun 7 20:09:04 UTC 2010
http://p4web.freebsd.org/@@179301?ac=10
Change 179301 by gk at gk_h1 on 2010/06/07 20:08:30
Import current dircache snapshot.
Affected files ...
.. //depot/projects/soc2010/gk_namecache/sys/fs/tmpfs/tmpfs_subr.c#2 edit
.. //depot/projects/soc2010/gk_namecache/sys/fs/tmpfs/tmpfs_vfsops.c#2 edit
.. //depot/projects/soc2010/gk_namecache/sys/fs/tmpfs/tmpfs_vnops.c#2 edit
.. //depot/projects/soc2010/gk_namecache/sys/kern/vfs_dircache.c#1 add
.. //depot/projects/soc2010/gk_namecache/sys/kern/vfs_subr.c#2 edit
.. //depot/projects/soc2010/gk_namecache/sys/modules/tmpfs/Makefile#2 edit
.. //depot/projects/soc2010/gk_namecache/sys/sys/dircache.h#1 add
.. //depot/projects/soc2010/gk_namecache/sys/sys/mount.h#2 edit
.. //depot/projects/soc2010/gk_namecache/sys/sys/vnode.h#2 edit
Differences ...
==== //depot/projects/soc2010/gk_namecache/sys/fs/tmpfs/tmpfs_subr.c#2 (text+ko) ====
@@ -37,6 +37,7 @@
__FBSDID("$FreeBSD: src/sys/fs/tmpfs/tmpfs_subr.c,v 1.26 2010/01/20 16:56:20 jh Exp $");
#include <sys/param.h>
+#include <sys/dircache.h>
#include <sys/namei.h>
#include <sys/priv.h>
#include <sys/proc.h>
@@ -519,6 +520,8 @@
* insert the new node into the directory, an operation that
* cannot fail. */
tmpfs_dir_attach(dvp, de);
+ dircache_add(dvp, *vpp, cnp, DT_STRONG, node->tn_id,
+ tmpfs_dircookie(de));
out:
@@ -585,7 +588,8 @@
tmpfs_dir_lookup(struct tmpfs_node *node, struct tmpfs_node *f,
struct componentname *cnp)
{
- boolean_t found;
+ struct dircache_cursor curs;
+ boolean_t found, cache;
struct tmpfs_dirent *de;
MPASS(IMPLIES(cnp->cn_namelen == 1, cnp->cn_nameptr[0] != '.'));
@@ -593,17 +597,27 @@
cnp->cn_nameptr[1] == '.')));
TMPFS_VALIDATE_DIR(node);
+
found = 0;
+ cache = dircache_beginupdate(&curs, node->tn_vnode, cnp,
+ DC_OP_IFPARTIAL) == 0;
TAILQ_FOREACH(de, &node->tn_dir.tn_dirhead, td_entries) {
+ if (cache)
+ dircache_update(&curs, DT_STRONG, de->td_name,
+ de->td_namelen, de->td_node->tn_id,
+ tmpfs_dircookie(de));
if (f != NULL && de->td_node != f)
continue;
MPASS(cnp->cn_namelen < 0xffff);
if (de->td_namelen == (uint16_t)cnp->cn_namelen &&
bcmp(de->td_name, cnp->cn_nameptr, de->td_namelen) == 0) {
found = 1;
- break;
+ if (!cache)
+ break;
}
}
+ if (cache)
+ dircache_completeupdate(&curs);
node->tn_status |= TMPFS_NODE_ACCESSED;
return found ? de : NULL;
==== //depot/projects/soc2010/gk_namecache/sys/fs/tmpfs/tmpfs_vfsops.c#2 (text+ko) ====
@@ -44,6 +44,7 @@
__FBSDID("$FreeBSD: src/sys/fs/tmpfs/tmpfs_vfsops.c,v 1.25 2010/01/29 12:09:14 jh Exp $");
#include <sys/param.h>
+#include <sys/dircache.h>
#include <sys/limits.h>
#include <sys/lock.h>
#include <sys/mutex.h>
@@ -253,6 +254,8 @@
vfs_getnewfsid(mp);
vfs_mountedfrom(mp, "tmpfs");
+ dircache_init(mp, root->tn_id);
+
return 0;
}
@@ -321,6 +324,9 @@
MNT_ILOCK(mp);
mp->mnt_flag &= ~MNT_LOCAL;
MNT_IUNLOCK(mp);
+
+ dircache_uninit(mp);
+
return 0;
}
==== //depot/projects/soc2010/gk_namecache/sys/fs/tmpfs/tmpfs_vnops.c#2 (text+ko) ====
@@ -37,6 +37,7 @@
__FBSDID("$FreeBSD: src/sys/fs/tmpfs/tmpfs_vnops.c,v 1.39 2010/05/06 18:43:19 trasz Exp $");
#include <sys/param.h>
+#include <sys/dircache.h>
#include <sys/fcntl.h>
#include <sys/lockf.h>
#include <sys/namei.h>
@@ -183,8 +184,10 @@
/* Store the result of this lookup in the cache. Avoid this if the
* request was for creation, as it does not improve timings on
* emprical tests. */
- if ((cnp->cn_flags & MAKEENTRY) && cnp->cn_nameiop != CREATE)
+ if ((cnp->cn_flags & MAKEENTRY) && cnp->cn_nameiop != CREATE) {
+ dircache_enter(dvp, *vpp, cnp);
cache_enter(dvp, *vpp, cnp);
+ }
out:
/* If there were no errors, *vpp cannot be null and it must be
@@ -838,6 +841,7 @@
/* Remove the entry from the directory; as it is a file, we do not
* have to change the number of hard links of the directory. */
tmpfs_dir_detach(dvp, de);
+ dircache_remove(dvp, vp, v->a_cnp);
/* Free the directory entry we just deleted. Note that the node
* referred by it will not be removed until the vnode is really
@@ -909,6 +913,7 @@
/* Insert the new directory entry into the appropriate directory. */
tmpfs_dir_attach(dvp, de);
+ dircache_add(dvp, vp, cnp, DT_STRONG, node->tn_id, tmpfs_dircookie(de));
/* vp link count has changed, so update node times. */
node->tn_status |= TMPFS_NODE_CHANGED;
@@ -1133,6 +1138,8 @@
tmpfs_free_dirent(VFS_TO_TMPFS(tvp->v_mount), de, TRUE);
}
+ dircache_rename(fdvp, fvp, fcnp, tdvp, tvp, tcnp);
+
error = 0;
out_locked:
@@ -1227,6 +1234,7 @@
/* Detach the directory entry from the directory (dnode). */
tmpfs_dir_detach(dvp, de);
+ dircache_remove(dvp, vp, v->a_cnp);
/* No vnode should be allocated for this entry from this point */
TMPFS_NODE_LOCK(node);
@@ -1448,6 +1456,9 @@
TMPFS_NODE_UNLOCK(node);
MPASS(vp->v_data == NULL);
+
+ dircache_reclaimvnode(vp);
+
return 0;
}
@@ -1552,7 +1563,7 @@
*/
struct vop_vector tmpfs_vnodeop_entries = {
.vop_default = &default_vnodeops,
- .vop_lookup = vfs_cache_lookup,
+ .vop_lookup = vfs_dircache_lookup,
.vop_cachedlookup = tmpfs_lookup,
.vop_create = tmpfs_create,
.vop_mknod = tmpfs_mknod,
==== //depot/projects/soc2010/gk_namecache/sys/kern/vfs_subr.c#2 (text+ko) ====
@@ -863,6 +863,7 @@
VNASSERT(TAILQ_EMPTY(&vp->v_cache_dst), vp, ("vp has namecache dst"));
VNASSERT(LIST_EMPTY(&vp->v_cache_src), vp, ("vp has namecache src"));
VNASSERT(vp->v_cache_dd == NULL, vp, ("vp has namecache for .."));
+ VNASSERT(TAILQ_EMPTY(&vp->v_dircache), vp, ("vp has dircache refs"));
VI_UNLOCK(vp);
#ifdef MAC
mac_vnode_destroy(vp);
@@ -1007,6 +1008,7 @@
*/
LIST_INIT(&vp->v_cache_src);
TAILQ_INIT(&vp->v_cache_dst);
+ TAILQ_INIT(&vp->v_dircache);
/*
* Finalize various vnode identity bits.
*/
==== //depot/projects/soc2010/gk_namecache/sys/modules/tmpfs/Makefile#2 (text+ko) ====
@@ -1,9 +1,10 @@
# $FreeBSD: src/sys/modules/tmpfs/Makefile,v 1.2 2007/06/29 05:23:15 delphij Exp $
.PATH: ${.CURDIR}/../../fs/tmpfs
+.PATH: ${.CURDIR}/../../kern
KMOD= tmpfs
SRCS= vnode_if.h \
- tmpfs_vnops.c tmpfs_fifoops.c tmpfs_vfsops.c tmpfs_subr.c
+ tmpfs_vnops.c tmpfs_fifoops.c tmpfs_vfsops.c tmpfs_subr.c vfs_dircache.c
.include <bsd.kmod.mk>
==== //depot/projects/soc2010/gk_namecache/sys/sys/mount.h#2 (text+ko) ====
@@ -127,6 +127,8 @@
long f_spare[2]; /* unused spare */
};
+struct dircache;
+
TAILQ_HEAD(vnodelst, vnode);
/* Mount options list */
@@ -184,6 +186,7 @@
int mnt_secondary_writes; /* (i) # of secondary writes */
int mnt_secondary_accwrites;/* (i) secondary wr. starts */
struct thread *mnt_susp_owner; /* (i) thread owning suspension */
+ struct dircache *mnt_dircache; /* dircache root node */
#define mnt_endzero mnt_gjprovider
char *mnt_gjprovider; /* gjournal provider name */
struct lock mnt_explock; /* vfs_export walkers lock */
==== //depot/projects/soc2010/gk_namecache/sys/sys/vnode.h#2 (text+ko) ====
@@ -60,6 +60,7 @@
* it from v_data. If non-null, this area is freed in getnewvnode().
*/
+struct dircache;
struct namecache;
struct vpollinfo {
@@ -136,6 +137,7 @@
LIST_HEAD(, namecache) v_cache_src; /* c Cache entries from us */
TAILQ_HEAD(, namecache) v_cache_dst; /* c Cache entries to us */
struct namecache *v_cache_dd; /* c Cache entry for .. vnode */
+ TAILQ_HEAD(, dircache) v_dircache; /* i Dircache referencies */
/*
* clustering stuff
More information about the p4-projects
mailing list