Page MenuHomeFreeBSD

D33914.id101516.diff
No OneTemporary

D33914.id101516.diff

Index: sys/fs/unionfs/union_subr.c
===================================================================
--- sys/fs/unionfs/union_subr.c
+++ sys/fs/unionfs/union_subr.c
@@ -304,7 +304,6 @@
struct componentname *cnp)
{
char *path;
- struct unionfs_mount *ump;
struct unionfs_node *unp;
struct vnode *vp;
u_long hashmask;
@@ -313,7 +312,6 @@
enum vtype vt;
error = 0;
- ump = MOUNTTOUNIONFSMOUNT(mp);
lkflags = (cnp ? cnp->cn_lkflags : 0);
path = (cnp ? cnp->cn_nameptr : NULL);
*vpp = NULLVP;
@@ -336,12 +334,6 @@
}
}
- if ((uppervp == NULLVP || ump->um_uppervp != uppervp) ||
- (lowervp == NULLVP || ump->um_lowervp != lowervp)) {
- /* dvp will be NULLVP only in case of root vnode. */
- if (dvp == NULLVP)
- return (EINVAL);
- }
unp = malloc(sizeof(struct unionfs_node),
M_UNIONFSNODE, M_WAITOK | M_ZERO);
@@ -383,10 +375,6 @@
vp->v_type = vt;
vp->v_data = unp;
- if ((uppervp != NULLVP && ump->um_uppervp == uppervp) &&
- (lowervp != NULLVP && ump->um_lowervp == lowervp))
- vp->v_vflag |= VV_ROOT;
-
vn_lock_pair(lowervp, false, uppervp, false);
error = insmntque1(vp, mp, unionfs_nodeget_cleanup, unp);
if (error != 0)
Index: sys/fs/unionfs/union_vfsops.c
===================================================================
--- sys/fs/unionfs/union_vfsops.c
+++ sys/fs/unionfs/union_vfsops.c
@@ -289,6 +289,10 @@
mp->mnt_data = NULL;
return (error);
}
+ KASSERT(ump->um_rootvp != NULL, ("rootvp cannot be NULL"));
+ vn_lock(ump->um_rootvp, LK_EXCLUSIVE | LK_RETRY);
+ ump->um_rootvp->v_vflag |= VV_ROOT;
+ VOP_UNLOCK(ump->um_rootvp);
lowermp = vfs_register_upper_from_vp(ump->um_lowervp, mp,
&ump->um_lower_link);
Index: sys/fs/unionfs/union_vnops.c
===================================================================
--- sys/fs/unionfs/union_vnops.c
+++ sys/fs/unionfs/union_vnops.c
@@ -1908,8 +1908,6 @@
static int
unionfs_lock(struct vop_lock1_args *ap)
{
- struct mount *mp;
- struct unionfs_mount *ump;
struct unionfs_node *unp;
struct vnode *vp;
struct vnode *uvp;
@@ -1944,13 +1942,8 @@
if ((flags & LK_INTERLOCK) == 0)
VI_LOCK(vp);
- mp = vp->v_mount;
- if (mp == NULL)
- goto unionfs_lock_null_vnode;
-
- ump = MOUNTTOUNIONFSMOUNT(mp);
unp = VTOUNIONFS(vp);
- if (ump == NULL || unp == NULL)
+ if (unp == NULL)
goto unionfs_lock_null_vnode;
lvp = unp->un_lowervp;
uvp = unp->un_uppervp;
@@ -1967,7 +1960,7 @@
* (ex. vfs_domount: mounted vnode is already locked.)
*/
if ((flags & LK_TYPE_MASK) == LK_EXCLUSIVE &&
- vp == ump->um_rootvp)
+ (vp->v_vflag & VV_ROOT) != 0)
flags |= LK_CANRECURSE;
if (lvp != NULLVP) {

File Metadata

Mime Type
text/plain
Expires
Fri, Jul 3, 10:01 PM (7 h, 44 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
34639031
Default Alt Text
D33914.id101516.diff (2 KB)

Event Timeline