summaryrefslogtreecommitdiffstats
path: root/sys/fs
diff options
context:
space:
mode:
authordas <das@FreeBSD.org>2003-06-14 23:56:27 +0000
committerdas <das@FreeBSD.org>2003-06-14 23:56:27 +0000
commita2b76875236a7aa6c3389f656013630dbabd0343 (patch)
tree02cb75bc6a4386e5f68da1c77a65eccb709c7397 /sys/fs
parent9ae3e0241b810047bb7784b86faf9ee214fe48f0 (diff)
downloadFreeBSD-src-a2b76875236a7aa6c3389f656013630dbabd0343.zip
FreeBSD-src-a2b76875236a7aa6c3389f656013630dbabd0343.tar.gz
If someone tries to mount a union filesystem with another unionfs as
the upper layer, fail gracefully instead of panicing. MFC after: 3 days
Diffstat (limited to 'sys/fs')
-rw-r--r--sys/fs/unionfs/union_vnops.c18
1 files changed, 14 insertions, 4 deletions
diff --git a/sys/fs/unionfs/union_vnops.c b/sys/fs/unionfs/union_vnops.c
index 65714cd..7e176dd 100644
--- a/sys/fs/unionfs/union_vnops.c
+++ b/sys/fs/unionfs/union_vnops.c
@@ -670,10 +670,20 @@ union_whiteout(ap)
struct vnode *uppervp;
int error = EOPNOTSUPP;
- if ((uppervp = union_lock_upper(un, cnp->cn_thread)) != NULLVP) {
- error = VOP_WHITEOUT(un->un_uppervp, cnp, ap->a_flags);
- union_unlock_upper(uppervp, cnp->cn_thread);
- }
+ switch (ap->a_flags) {
+ case LOOKUP:
+ error = EOPNOTSUPP;
+ break;
+ case CREATE:
+ case DELETE:
+ if ((uppervp=union_lock_upper(un,cnp->cn_thread)) != NULLVP) {
+ error = VOP_WHITEOUT(un->un_uppervp, cnp, ap->a_flags);
+ union_unlock_upper(uppervp, cnp->cn_thread);
+ }
+ break;
+ default:
+ panic("union_whiteout: unknown op");
+ }
return(error);
}
OpenPOWER on IntegriCloud