PERFORCE change 169323 for review
Gleb Kurtsou
gk at FreeBSD.org
Thu Oct 8 14:01:45 UTC 2009
http://perforce.freebsd.org/chv.cgi?CH=169323
Change 169323 by gk at 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);
/*
More information about the p4-projects
mailing list