diff options
author | David Schultz <das@FreeBSD.org> | 2003-06-14 23:56:27 +0000 |
---|---|---|
committer | David Schultz <das@FreeBSD.org> | 2003-06-14 23:56:27 +0000 |
commit | ac092fb30c99a7dbd7810aa6f3e4ab4e6aa883a0 (patch) | |
tree | 02cb75bc6a4386e5f68da1c77a65eccb709c7397 | |
parent | 0614a6351fa601e82bdabab5264d200e5a5442a5 (diff) | |
download | src-ac092fb30c99a7dbd7810aa6f3e4ab4e6aa883a0.tar.gz src-ac092fb30c99a7dbd7810aa6f3e4ab4e6aa883a0.zip |
If someone tries to mount a union filesystem with another unionfs as
the upper layer, fail gracefully instead of panicing.
MFC after: 3 days
Notes
Notes:
svn path=/head/; revision=116358
-rw-r--r-- | sys/fs/unionfs/union_vnops.c | 18 |
1 files changed, 14 insertions, 4 deletions
diff --git a/sys/fs/unionfs/union_vnops.c b/sys/fs/unionfs/union_vnops.c index 65714cd2a415..7e176dd21e33 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); } |