Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F167724033
D32148.id.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
3 KB
Referenced Files
None
Subscribers
None
D32148.id.diff
View Options
diff --git a/sys/fs/unionfs/union_subr.c b/sys/fs/unionfs/union_subr.c
--- a/sys/fs/unionfs/union_subr.c
+++ b/sys/fs/unionfs/union_subr.c
@@ -678,6 +678,8 @@
udvp = UNIONFSVPTOUPPERVP(dvp);
vp = NULLVP;
+ KASSERT((cnp->cn_flags & HASBUF) != 0,
+ ("%s called without HASBUF", __func__));
error = unionfs_relookup(udvp, &vp, cnp, &cn, td, cnp->cn_nameptr,
cnp->cn_namelen, CREATE);
if (error)
@@ -712,6 +714,8 @@
udvp = UNIONFSVPTOUPPERVP(dvp);
vp = NULLVP;
+ KASSERT((cnp->cn_flags & HASBUF) != 0,
+ ("%s called without HASBUF", __func__));
error = unionfs_relookup(udvp, &vp, cnp, &cn, td, cnp->cn_nameptr,
cnp->cn_namelen, DELETE);
if (error)
@@ -746,6 +750,8 @@
udvp = UNIONFSVPTOUPPERVP(dvp);
vp = NULLVP;
+ KASSERT((cnp->cn_flags & HASBUF) != 0,
+ ("%s called without HASBUF", __func__));
error = unionfs_relookup(udvp, &vp, cnp, &cn, td, cnp->cn_nameptr,
cnp->cn_namelen, RENAME);
if (error)
diff --git a/sys/fs/unionfs/union_vnops.c b/sys/fs/unionfs/union_vnops.c
--- a/sys/fs/unionfs/union_vnops.c
+++ b/sys/fs/unionfs/union_vnops.c
@@ -167,9 +167,7 @@
} else if (error == ENOENT && (cnflags & MAKEENTRY) != 0)
cache_enter(dvp, NULLVP, cnp);
- UNIONFS_INTERNAL_DEBUG("unionfs_lookup: leave (%d)\n", error);
-
- return (error);
+ goto unionfs_lookup_return;
}
/*
@@ -184,10 +182,8 @@
*(ap->a_vpp) = dvp;
vref(dvp);
- UNIONFS_INTERNAL_DEBUG(
- "unionfs_lookup: leave (%d)\n", uerror);
-
- return (uerror);
+ error = uerror;
+ goto unionfs_lookup_return;
}
if (nameiop == DELETE || nameiop == RENAME ||
(cnp->cn_lkflags & LK_TYPE_MASK))
@@ -246,9 +242,8 @@
* check lookup result
*/
if (uvp == NULLVP && lvp == NULLVP) {
- UNIONFS_INTERNAL_DEBUG("unionfs_lookup: leave (%d)\n",
- (udvp != NULLVP ? uerror : lerror));
- return (udvp != NULLVP ? uerror : lerror);
+ error = (udvp != NULLVP ? uerror : lerror);
+ goto unionfs_lookup_return;
}
/*
@@ -270,7 +265,7 @@
error = unionfs_nodeget(dvp->v_mount, NULLVP, lvp, dvp, &vp,
cnp, td);
if (error != 0)
- goto unionfs_lookup_out;
+ goto unionfs_lookup_cleanup;
if (LK_SHARED == (cnp->cn_lkflags & LK_TYPE_MASK))
VOP_UNLOCK(vp);
@@ -289,7 +284,7 @@
vput(vp);
else
vrele(vp);
- goto unionfs_lookup_out;
+ goto unionfs_lookup_cleanup;
}
if ((cnp->cn_lkflags & LK_TYPE_MASK) == LK_SHARED)
vn_lock(vp, LK_SHARED | LK_RETRY);
@@ -303,7 +298,7 @@
else
error = lerror;
if (error != 0)
- goto unionfs_lookup_out;
+ goto unionfs_lookup_cleanup;
/*
* get socket vnode.
*/
@@ -328,7 +323,7 @@
if (error != 0) {
UNIONFSDEBUG(
"unionfs_lookup: Unable to create unionfs vnode.");
- goto unionfs_lookup_out;
+ goto unionfs_lookup_cleanup;
}
if ((nameiop == DELETE || nameiop == RENAME) &&
(cnp->cn_lkflags & LK_TYPE_MASK) == 0)
@@ -340,7 +335,7 @@
if ((cnflags & MAKEENTRY) && vp->v_type != VSOCK)
cache_enter(dvp, vp, cnp);
-unionfs_lookup_out:
+unionfs_lookup_cleanup:
if (uvp != NULLVP)
vrele(uvp);
if (lvp != NULLVP)
@@ -349,6 +344,12 @@
if (error == ENOENT && (cnflags & MAKEENTRY) != 0)
cache_enter(dvp, NULLVP, cnp);
+unionfs_lookup_return:
+
+ /* Ensure subsequent vnops will get a valid pathname buffer. */
+ if (nameiop != LOOKUP && (error == 0 || error == EJUSTRETURN))
+ cnp->cn_flags |= SAVENAME;
+
UNIONFS_INTERNAL_DEBUG("unionfs_lookup: leave (%d)\n", error);
return (error);
@@ -1372,7 +1373,7 @@
error = VOP_GETATTR(udvp, &va, cnp->cn_cred);
if (error != 0)
return (error);
- if (va.va_flags & OPAQUE)
+ if ((va.va_flags & OPAQUE) != 0)
cnp->cn_flags |= ISWHITEOUT;
}
@@ -1434,7 +1435,7 @@
if (ump->um_whitemode == UNIONFS_WHITE_ALWAYS || lvp != NULLVP)
cnp->cn_flags |= DOWHITEOUT;
error = unionfs_relookup_for_delete(ap->a_dvp, cnp, td);
- if (!error)
+ if (error == 0)
error = VOP_RMDIR(udvp, uvp, cnp);
}
else if (lvp != NULLVP)
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Tue, Aug 25, 1:06 AM (10 h, 37 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
37216455
Default Alt Text
D32148.id.diff (3 KB)
Attached To
Mode
D32148: unionfs: Ensure SAVENAME is set for unionfs vnode operations
Attached
Detach File
Event Timeline
Log In to Comment