summaryrefslogtreecommitdiffstats
path: root/sys/kern
diff options
context:
space:
mode:
authordg <dg@FreeBSD.org>1995-08-01 18:51:02 +0000
committerdg <dg@FreeBSD.org>1995-08-01 18:51:02 +0000
commit21cc29328e0ec5d81f23c44eb23b19d99f7e691f (patch)
tree7e1c28d400c2c70e77cbca3654c9d1ca5443bae3 /sys/kern
parentc93738880cf44616a99a51717df53b16bac0effb (diff)
downloadFreeBSD-src-21cc29328e0ec5d81f23c44eb23b19d99f7e691f.zip
FreeBSD-src-21cc29328e0ec5d81f23c44eb23b19d99f7e691f.tar.gz
Removed my special-case hack for VOP_LINK and fixed the problem with the
wrong vp's ops vector being used by changing the VOP_LINK's argument order. The special-case hack doesn't go far enough and breaks the generic bypass routine used in some non-leaf filesystems. Pointed out by Kirk McKusick.
Diffstat (limited to 'sys/kern')
-rw-r--r--sys/kern/vfs_extattr.c19
-rw-r--r--sys/kern/vfs_syscalls.c19
-rw-r--r--sys/kern/vnode_if.pl40
-rw-r--r--sys/kern/vnode_if.sh40
-rw-r--r--sys/kern/vnode_if.src16
5 files changed, 26 insertions, 108 deletions
diff --git a/sys/kern/vfs_extattr.c b/sys/kern/vfs_extattr.c
index c9f62ab..99e2b58 100644
--- a/sys/kern/vfs_extattr.c
+++ b/sys/kern/vfs_extattr.c
@@ -36,7 +36,7 @@
* SUCH DAMAGE.
*
* @(#)vfs_syscalls.c 8.13 (Berkeley) 4/15/94
- * $Id: vfs_syscalls.c,v 1.28 1995/07/13 08:47:42 davidg Exp $
+ * $Id: vfs_syscalls.c,v 1.29 1995/07/31 00:35:47 bde Exp $
*/
#include <sys/param.h>
@@ -839,15 +839,7 @@ link(p, uap, retval)
nd.ni_dirp = uap->link;
error = namei(&nd);
if (!error) {
- if (nd.ni_vp != NULL)
- error = EEXIST;
- if (!error) {
- LEASE_CHECK(nd.ni_dvp,
- p, p->p_ucred, LEASE_WRITE);
- LEASE_CHECK(vp,
- p, p->p_ucred, LEASE_WRITE);
- error = VOP_LINK(vp, nd.ni_dvp, &nd.ni_cnd);
- } else {
+ if (nd.ni_vp != NULL) {
VOP_ABORTOP(nd.ni_dvp, &nd.ni_cnd);
if (nd.ni_dvp == nd.ni_vp)
vrele(nd.ni_dvp);
@@ -855,6 +847,13 @@ link(p, uap, retval)
vput(nd.ni_dvp);
if (nd.ni_vp)
vrele(nd.ni_vp);
+ error = EEXIST;
+ } else {
+ LEASE_CHECK(nd.ni_dvp,
+ p, p->p_ucred, LEASE_WRITE);
+ LEASE_CHECK(vp,
+ p, p->p_ucred, LEASE_WRITE);
+ error = VOP_LINK(nd.ni_dvp, vp, &nd.ni_cnd);
}
}
}
diff --git a/sys/kern/vfs_syscalls.c b/sys/kern/vfs_syscalls.c
index c9f62ab..99e2b58 100644
--- a/sys/kern/vfs_syscalls.c
+++ b/sys/kern/vfs_syscalls.c
@@ -36,7 +36,7 @@
* SUCH DAMAGE.
*
* @(#)vfs_syscalls.c 8.13 (Berkeley) 4/15/94
- * $Id: vfs_syscalls.c,v 1.28 1995/07/13 08:47:42 davidg Exp $
+ * $Id: vfs_syscalls.c,v 1.29 1995/07/31 00:35:47 bde Exp $
*/
#include <sys/param.h>
@@ -839,15 +839,7 @@ link(p, uap, retval)
nd.ni_dirp = uap->link;
error = namei(&nd);
if (!error) {
- if (nd.ni_vp != NULL)
- error = EEXIST;
- if (!error) {
- LEASE_CHECK(nd.ni_dvp,
- p, p->p_ucred, LEASE_WRITE);
- LEASE_CHECK(vp,
- p, p->p_ucred, LEASE_WRITE);
- error = VOP_LINK(vp, nd.ni_dvp, &nd.ni_cnd);
- } else {
+ if (nd.ni_vp != NULL) {
VOP_ABORTOP(nd.ni_dvp, &nd.ni_cnd);
if (nd.ni_dvp == nd.ni_vp)
vrele(nd.ni_dvp);
@@ -855,6 +847,13 @@ link(p, uap, retval)
vput(nd.ni_dvp);
if (nd.ni_vp)
vrele(nd.ni_vp);
+ error = EEXIST;
+ } else {
+ LEASE_CHECK(nd.ni_dvp,
+ p, p->p_ucred, LEASE_WRITE);
+ LEASE_CHECK(vp,
+ p, p->p_ucred, LEASE_WRITE);
+ error = VOP_LINK(nd.ni_dvp, vp, &nd.ni_cnd);
}
}
}
diff --git a/sys/kern/vnode_if.pl b/sys/kern/vnode_if.pl
index 5066a1c..577deb9 100644
--- a/sys/kern/vnode_if.pl
+++ b/sys/kern/vnode_if.pl
@@ -32,7 +32,7 @@
# SUCH DAMAGE.
#
# @(#)vnode_if.sh 8.1 (Berkeley) 6/10/93
-# $Id: vnode_if.sh,v 1.2 1994/08/02 07:43:34 davidg Exp $
+# $Id: vnode_if.sh,v 1.3 1995/07/07 13:41:27 davidg Exp $
#
# Script to produce VFS front-end sugar.
@@ -372,27 +372,6 @@ static inline int VOP_BWRITE(bp)
a.a_bp = bp;
return (VCALL((bp)->b_vp, VOFFSET(vop_bwrite), &a));
}
-
-struct vop_link_args {
- struct vnodeop_desc *a_desc;
- struct vnode *a_vp;
- struct vnode *a_tdvp;
- struct componentname *a_cnp;
-};
-extern struct vnodeop_desc vop_link_desc;
-static inline int VOP_LINK(vp, tdvp, cnp)
- struct vnode *vp;
- struct vnode *tdvp;
- struct componentname *cnp;
-{
- struct vop_link_args a;
-
- a.a_desc = VDESC(vop_link);
- a.a_vp = vp;
- a.a_tdvp = tdvp;
- a.a_cnp = cnp;
- return (VCALL(tdvp, VOFFSET(vop_link), &a));
-}
END_OF_SPECIAL_CASES
cat << END_OF_SPECIAL_CASES >> $CFILE
@@ -424,22 +403,6 @@ struct vnodeop_desc vop_bwrite_desc = {
VDESC_NO_OFFSET,
NULL,
};
-int vop_link_vp_offsets[] = {
- VOPARG_OFFSETOF(struct vop_link_args,a_vp),
- VOPARG_OFFSETOF(struct vop_link_args,a_tdvp),
- VDESC_NO_OFFSET
-};
-struct vnodeop_desc vop_link_desc = {
- 0,
- "vop_link",
- VDESC_VP1_WILLRELE,
- vop_link_vp_offsets,
- VDESC_NO_OFFSET,
- VDESC_NO_OFFSET,
- VDESC_NO_OFFSET,
- VOPARG_OFFSETOF(struct vop_link_args,a_cnp),
- NULL,
-};
END_OF_SPECIAL_CASES
# Add the vfs_op_descs array to the C file.
@@ -449,7 +412,6 @@ $AWK '
printf("\t&vop_default_desc, /* MUST BE FIRST */\n");
printf("\t&vop_strategy_desc, /* XXX: SPECIAL CASE */\n");
printf("\t&vop_bwrite_desc, /* XXX: SPECIAL CASE */\n");
- printf("\t&vop_link_desc, /* XXX: SPECIAL CASE */\n");
}
END {
printf("\tNULL\n};\n");
diff --git a/sys/kern/vnode_if.sh b/sys/kern/vnode_if.sh
index 5066a1c..577deb9 100644
--- a/sys/kern/vnode_if.sh
+++ b/sys/kern/vnode_if.sh
@@ -32,7 +32,7 @@
# SUCH DAMAGE.
#
# @(#)vnode_if.sh 8.1 (Berkeley) 6/10/93
-# $Id: vnode_if.sh,v 1.2 1994/08/02 07:43:34 davidg Exp $
+# $Id: vnode_if.sh,v 1.3 1995/07/07 13:41:27 davidg Exp $
#
# Script to produce VFS front-end sugar.
@@ -372,27 +372,6 @@ static inline int VOP_BWRITE(bp)
a.a_bp = bp;
return (VCALL((bp)->b_vp, VOFFSET(vop_bwrite), &a));
}
-
-struct vop_link_args {
- struct vnodeop_desc *a_desc;
- struct vnode *a_vp;
- struct vnode *a_tdvp;
- struct componentname *a_cnp;
-};
-extern struct vnodeop_desc vop_link_desc;
-static inline int VOP_LINK(vp, tdvp, cnp)
- struct vnode *vp;
- struct vnode *tdvp;
- struct componentname *cnp;
-{
- struct vop_link_args a;
-
- a.a_desc = VDESC(vop_link);
- a.a_vp = vp;
- a.a_tdvp = tdvp;
- a.a_cnp = cnp;
- return (VCALL(tdvp, VOFFSET(vop_link), &a));
-}
END_OF_SPECIAL_CASES
cat << END_OF_SPECIAL_CASES >> $CFILE
@@ -424,22 +403,6 @@ struct vnodeop_desc vop_bwrite_desc = {
VDESC_NO_OFFSET,
NULL,
};
-int vop_link_vp_offsets[] = {
- VOPARG_OFFSETOF(struct vop_link_args,a_vp),
- VOPARG_OFFSETOF(struct vop_link_args,a_tdvp),
- VDESC_NO_OFFSET
-};
-struct vnodeop_desc vop_link_desc = {
- 0,
- "vop_link",
- VDESC_VP1_WILLRELE,
- vop_link_vp_offsets,
- VDESC_NO_OFFSET,
- VDESC_NO_OFFSET,
- VDESC_NO_OFFSET,
- VOPARG_OFFSETOF(struct vop_link_args,a_cnp),
- NULL,
-};
END_OF_SPECIAL_CASES
# Add the vfs_op_descs array to the C file.
@@ -449,7 +412,6 @@ $AWK '
printf("\t&vop_default_desc, /* MUST BE FIRST */\n");
printf("\t&vop_strategy_desc, /* XXX: SPECIAL CASE */\n");
printf("\t&vop_bwrite_desc, /* XXX: SPECIAL CASE */\n");
- printf("\t&vop_link_desc, /* XXX: SPECIAL CASE */\n");
}
END {
printf("\tNULL\n};\n");
diff --git a/sys/kern/vnode_if.src b/sys/kern/vnode_if.src
index 37ef15a..c5f1094 100644
--- a/sys/kern/vnode_if.src
+++ b/sys/kern/vnode_if.src
@@ -31,7 +31,7 @@
# SUCH DAMAGE.
#
# @(#)vnode_if.src 8.3 (Berkeley) 2/3/94
-# $Id: vnode_if.src,v 1.4 1995/06/28 07:06:41 davidg Exp $
+# $Id: vnode_if.src,v 1.5 1995/07/07 13:41:28 davidg Exp $
#
vop_lookup {
IN struct vnode *dvp;
@@ -148,15 +148,11 @@ vop_remove {
IN struct componentname *cnp;
};
-# Gack. The generated VCALL uses the first vp which might
-# not be handled by the same FS as the directory (e.g. special
-# device files)...so it's special-cased.
-#
-#vop_link {
-# IN struct vnode *vp;
-# IN WILLRELE struct vnode *tdvp;
-# IN struct componentname *cnp;
-#};
+vop_link {
+ IN WILLRELE struct vnode *tdvp;
+ IN struct vnode *vp;
+ IN struct componentname *cnp;
+};
vop_rename {
IN WILLRELE struct vnode *fdvp;
OpenPOWER on IntegriCloud