Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 8 Oct 2009 14:01:44 GMT
From:      Gleb Kurtsou <gk@FreeBSD.org>
To:        Perforce Change Reviews <perforce@FreeBSD.org>
Subject:   PERFORCE change 169323 for review
Message-ID:  <200910081401.n98E1iBq067518@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=169323

Change 169323 by gk@gk_h1 on 2009/10/08 14:00:57

	recursively lock root vnode if fs was mounted on the same dir (e.g. pefs mount ~/Private ~/Private)
	lock Giant if needed during async node free

Affected files ...

.. //depot/projects/soc2009/gk_pefs/sys/fs/pefs/pefs.h#14 edit
.. //depot/projects/soc2009/gk_pefs/sys/fs/pefs/pefs_subr.c#14 edit
.. //depot/projects/soc2009/gk_pefs/sys/fs/pefs/pefs_vfsops.c#13 edit
.. //depot/projects/soc2009/gk_pefs/sys/fs/pefs/pefs_vnops.c#21 edit

Differences ...

==== //depot/projects/soc2009/gk_pefs/sys/fs/pefs/pefs.h#14 (text+ko) ====

@@ -97,11 +97,14 @@
 	struct pefs_tkey pn_tkey;
 };
 
+#define PM_ROOT_CANRECURSE		0x01
+
 struct pefs_mount {
 	struct mount *pm_lowervfs;
 	struct vnode *pm_rootvp;	/* Reference to root pefs_node */
 	struct mtx pm_keys_lock;
 	struct pefs_key_head pm_keys;
+	int pm_flags;
 };
 
 struct pefs_chunk {

==== //depot/projects/soc2009/gk_pefs/sys/fs/pefs/pefs_subr.c#14 (text+ko) ====

@@ -469,6 +469,7 @@
 {
 	struct pefs_node *pn;
 	struct vnode *lowervp;
+	int vfslocked = 0;
 
 	while (1) {
 		mtx_lock(&pefs_node_listmtx);
@@ -481,9 +482,13 @@
 		mtx_unlock(&pefs_node_listmtx);
 		lowervp = pn->pn_lowervp_dead;
 		uma_zfree(pefs_node_zone, pn);
-		if (lowervp != NULL)
+		if (lowervp != NULL) {
+			if (!vfslocked)
+				vfslocked = VFS_LOCK_GIANT(lowervp->v_mount);
 			vrele(lowervp);
+		}
 	}
+	VFS_UNLOCK_GIANT(vfslocked);
 }
 
 /*

==== //depot/projects/soc2009/gk_pefs/sys/fs/pefs/pefs_vfsops.c#13 (text+ko) ====

@@ -134,6 +134,8 @@
 	 * Save reference to underlying FS
 	 */
 	pm->pm_lowervfs = lowerrootvp->v_mount;
+	if (lowerrootvp == mp->mnt_vnodecovered)
+		pm->pm_flags |= PM_ROOT_CANRECURSE;
 
 	/*
 	 * Save reference.  Each mount also holds

==== //depot/projects/soc2009/gk_pefs/sys/fs/pefs/pefs_vnops.c#21 (text+ko) ====

@@ -891,6 +891,7 @@
 {
 	struct vnode *vp = ap->a_vp;
 	int flags = ap->a_flags;
+	struct pefs_mount *pm;
 	struct pefs_node *pn;
 	struct vnode *lvp;
 	int error;
@@ -907,6 +908,13 @@
 	 * vop lock.
 	 */
 	if (pn != NULL && (lvp = pn->pn_lowervp) != NULL) {
+		if (vp->v_mount != NULL) {
+			pm = VFS_TO_PEFS(vp->v_mount);
+			if (pm != NULL &&
+			    (pm->pm_flags & PM_ROOT_CANRECURSE) &&
+			    pm->pm_rootvp == vp)
+				ap->a_flags = flags |= LK_CANRECURSE;
+		}
 		VI_LOCK_FLAGS(lvp, MTX_DUPOK);
 		VI_UNLOCK(vp);
 		/*



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200910081401.n98E1iBq067518>