VOP_ABORTOP is no longer responsible for unlocking and vreleing vnodes
authorKirk McKusick <mckusick@ucbvax.Berkeley.EDU>
Thu, 31 May 1990 02:39:59 +0000 (18:39 -0800)
committerKirk McKusick <mckusick@ucbvax.Berkeley.EDU>
Thu, 31 May 1990 02:39:59 +0000 (18:39 -0800)
SCCS-vsn: sys/kern/vfs_syscalls.c 7.49
SCCS-vsn: sys/kern/uipc_usrreq.c 7.18
SCCS-vsn: sys/ufs/ffs/ffs_vnops.c 7.42
SCCS-vsn: sys/ufs/ffs/ufs_vnops.c 7.42
SCCS-vsn: sys/ufs/lfs/lfs_vnops.c 7.42
SCCS-vsn: sys/ufs/ufs/ufs_vnops.c 7.42
SCCS-vsn: sys/nfs/nfs_node.c 7.27
SCCS-vsn: sys/nfs/nfs_serv.c 7.21
SCCS-vsn: sys/nfs/nfs_vnops.c 7.41

usr/src/sys/kern/uipc_usrreq.c
usr/src/sys/kern/vfs_syscalls.c
usr/src/sys/nfs/nfs_node.c
usr/src/sys/nfs/nfs_serv.c
usr/src/sys/nfs/nfs_vnops.c
usr/src/sys/ufs/ffs/ffs_vnops.c
usr/src/sys/ufs/ffs/ufs_vnops.c
usr/src/sys/ufs/lfs/lfs_vnops.c
usr/src/sys/ufs/ufs/ufs_vnops.c

index b0855b3..34760d5 100644 (file)
@@ -12,7 +12,7 @@
  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  *
  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  *
- *     @(#)uipc_usrreq.c       7.17 (Berkeley) %G%
+ *     @(#)uipc_usrreq.c       7.18 (Berkeley) %G%
  */
 
 #include "param.h"
  */
 
 #include "param.h"
@@ -368,6 +368,8 @@ unp_bind(unp, nam)
        vp = ndp->ni_vp;
        if (vp != NULL) {
                VOP_ABORTOP(ndp);
        vp = ndp->ni_vp;
        if (vp != NULL) {
                VOP_ABORTOP(ndp);
+               vput(ndp->ni_dvp);
+               vrele(vp);
                return (EADDRINUSE);
        }
        VATTR_NULL(&vattr);
                return (EADDRINUSE);
        }
        VATTR_NULL(&vattr);
index 7c018f0..b3dddb6 100644 (file)
@@ -14,7 +14,7 @@
  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  *
  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  *
- *     @(#)vfs_syscalls.c      7.48 (Berkeley) %G%
+ *     @(#)vfs_syscalls.c      7.49 (Berkeley) %G%
  */
 
 #include "param.h"
  */
 
 #include "param.h"
@@ -651,10 +651,14 @@ mknod(p, uap, retval)
        vattr.va_mode = (uap->fmode & 07777) &~ u.u_cmask;
        vattr.va_rdev = uap->dev;
 out:
        vattr.va_mode = (uap->fmode & 07777) &~ u.u_cmask;
        vattr.va_rdev = uap->dev;
 out:
-       if (error)
-               VOP_ABORTOP(ndp);
-       else
+       if (!error) {
                error = VOP_MKNOD(ndp, &vattr, ndp->ni_cred);
                error = VOP_MKNOD(ndp, &vattr, ndp->ni_cred);
+       } else {
+               VOP_ABORTOP(ndp);
+               vput(ndp->ni_dvp);
+               if (vp)
+                       vrele(vp);
+       }
        RETURN (error);
 }
 
        RETURN (error);
 }
 
@@ -684,6 +688,8 @@ mkfifo(p, uap, retval)
                RETURN (error);
        if (ndp->ni_vp != NULL) {
                VOP_ABORTOP(ndp);
                RETURN (error);
        if (ndp->ni_vp != NULL) {
                VOP_ABORTOP(ndp);
+               vput(ndp->ni_dvp);
+               vrele(ndp->ni_vp);
                RETURN (EEXIST);
        } else {
                VATTR_NULL(&vattr);
                RETURN (EEXIST);
        } else {
                VATTR_NULL(&vattr);
@@ -732,10 +738,14 @@ link(p, uap, retval)
        if (vp->v_mount != xp->v_mount)
                error = EXDEV;
 out:
        if (vp->v_mount != xp->v_mount)
                error = EXDEV;
 out:
-       if (error)
-               VOP_ABORTOP(ndp);
-       else
+       if (!error) {
                error = VOP_LINK(vp, ndp);
                error = VOP_LINK(vp, ndp);
+       } else {
+               VOP_ABORTOP(ndp);
+               vput(ndp->ni_dvp);
+               if (ndp->ni_vp)
+                       vrele(ndp->ni_vp);
+       }
 out1:
        vrele(vp);
        RETURN (error);
 out1:
        vrele(vp);
        RETURN (error);
@@ -754,7 +764,6 @@ symlink(p, uap, retval)
        int *retval;
 {
        register struct nameidata *ndp = &u.u_nd;
        int *retval;
 {
        register struct nameidata *ndp = &u.u_nd;
-       register struct vnode *vp;
        struct vattr vattr;
        char *target;
        int error;
        struct vattr vattr;
        char *target;
        int error;
@@ -763,24 +772,21 @@ symlink(p, uap, retval)
        ndp->ni_dirp = uap->linkname;
        MALLOC(target, char *, MAXPATHLEN, M_NAMEI, M_WAITOK);
        if (error = copyinstr(uap->target, target, MAXPATHLEN, (u_int *)0))
        ndp->ni_dirp = uap->linkname;
        MALLOC(target, char *, MAXPATHLEN, M_NAMEI, M_WAITOK);
        if (error = copyinstr(uap->target, target, MAXPATHLEN, (u_int *)0))
-               goto out1;
+               goto out;
        ndp->ni_nameiop = CREATE | LOCKPARENT;
        if (error = namei(ndp))
        ndp->ni_nameiop = CREATE | LOCKPARENT;
        if (error = namei(ndp))
-               goto out1;
-       vp = ndp->ni_vp;
-       if (vp) {
+               goto out;
+       if (ndp->ni_vp) {
+               VOP_ABORTOP(ndp);
+               vput(ndp->ni_dvp);
+               vrele(ndp->ni_vp);
                error = EEXIST;
                goto out;
        }
                error = EEXIST;
                goto out;
        }
-       vp = ndp->ni_dvp;
        VATTR_NULL(&vattr);
        vattr.va_mode = 0777 &~ u.u_cmask;
        VATTR_NULL(&vattr);
        vattr.va_mode = 0777 &~ u.u_cmask;
+       error = VOP_SYMLINK(ndp, &vattr, target);
 out:
 out:
-       if (error)
-               VOP_ABORTOP(ndp);
-       else
-               error = VOP_SYMLINK(ndp, &vattr, target);
-out1:
        FREE(target, M_NAMEI);
        RETURN (error);
 }
        FREE(target, M_NAMEI);
        RETURN (error);
 }
@@ -821,10 +827,13 @@ unlink(p, uap, retval)
        if (vp->v_flag & VTEXT)
                xrele(vp);      /* try once to free text */
 out:
        if (vp->v_flag & VTEXT)
                xrele(vp);      /* try once to free text */
 out:
-       if (error)
-               VOP_ABORTOP(ndp);
-       else
+       if (!error) {
                error = VOP_REMOVE(ndp);
                error = VOP_REMOVE(ndp);
+       } else {
+               VOP_ABORTOP(ndp);
+               vput(ndp->ni_dvp);
+               vput(vp);
+       }
        RETURN (error);
 }
 
        RETURN (error);
 }
 
@@ -1400,7 +1409,12 @@ rename(p, uap, retval)
        tond.ni_nameiop = RENAME | LOCKPARENT | LOCKLEAF | NOCACHE;
        tond.ni_segflg = UIO_USERSPACE;
        tond.ni_dirp = uap->to;
        tond.ni_nameiop = RENAME | LOCKPARENT | LOCKLEAF | NOCACHE;
        tond.ni_segflg = UIO_USERSPACE;
        tond.ni_dirp = uap->to;
-       error = namei(&tond);
+       if (error = namei(&tond)) {
+               VOP_ABORTOP(ndp);
+               vrele(ndp->ni_dvp);
+               vrele(fvp);
+               goto out1;
+       }
        tdvp = tond.ni_dvp;
        tvp = tond.ni_vp;
        if (tvp != NULL) {
        tdvp = tond.ni_dvp;
        tvp = tond.ni_vp;
        if (tvp != NULL) {
@@ -1412,10 +1426,6 @@ rename(p, uap, retval)
                        goto out;
                }
        }
                        goto out;
                }
        }
-       if (error) {
-               VOP_ABORTOP(ndp);
-               goto out1;
-       }
        if (fvp->v_mount != tdvp->v_mount) {
                error = EXDEV;
                goto out;
        if (fvp->v_mount != tdvp->v_mount) {
                error = EXDEV;
                goto out;
@@ -1429,11 +1439,16 @@ rename(p, uap, retval)
        if (fvp == tvp)
                error = -1;
 out:
        if (fvp == tvp)
                error = -1;
 out:
-       if (error) {
+       if (!error) {
+               error = VOP_RENAME(ndp, &tond);
+       } else {
                VOP_ABORTOP(&tond);
                VOP_ABORTOP(&tond);
+               vput(tdvp);
+               if (tvp)
+                       vput(tvp);
                VOP_ABORTOP(ndp);
                VOP_ABORTOP(ndp);
-       } else {
-               error = VOP_RENAME(ndp, &tond);
+               vrele(ndp->ni_dvp);
+               vrele(fvp);
        }
 out1:
        ndrele(&tond);
        }
 out1:
        ndrele(&tond);
@@ -1467,6 +1482,8 @@ mkdir(p, uap, retval)
        vp = ndp->ni_vp;
        if (vp != NULL) {
                VOP_ABORTOP(ndp);
        vp = ndp->ni_vp;
        if (vp != NULL) {
                VOP_ABORTOP(ndp);
+               vput(ndp->ni_dvp);
+               vrele(vp);
                RETURN (EEXIST);
        }
        VATTR_NULL(&vattr);
                RETURN (EEXIST);
        }
        VATTR_NULL(&vattr);
@@ -1516,10 +1533,13 @@ rmdir(p, uap, retval)
        if (vp->v_flag & VROOT)
                error = EBUSY;
 out:
        if (vp->v_flag & VROOT)
                error = EBUSY;
 out:
-       if (error)
-               VOP_ABORTOP(ndp);
-       else
+       if (!error) {
                error = VOP_RMDIR(ndp);
                error = VOP_RMDIR(ndp);
+       } else {
+               VOP_ABORTOP(ndp);
+               vput(ndp->ni_dvp);
+               vput(vp);
+       }
        RETURN (error);
 }
 
        RETURN (error);
 }
 
index 3bd7579..3c4ed09 100644 (file)
@@ -17,7 +17,7 @@
  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  *
  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  *
- *     @(#)nfs_node.c  7.26 (Berkeley) %G%
+ *     @(#)nfs_node.c  7.27 (Berkeley) %G%
  */
 
 #include "param.h"
  */
 
 #include "param.h"
@@ -290,18 +290,14 @@ nfs_nput(vp)
        vrele(vp);
 }
 
        vrele(vp);
 }
 
+/*
+ * Nfs abort op, called after namei() when a CREATE/DELETE isn't actually
+ * done. Currently nothing to do.
+ */
+/* ARGSUSED */
 nfs_abortop(ndp)
 nfs_abortop(ndp)
-       register struct nameidata *ndp;
+       struct nameidata *ndp;
 {
 
 {
 
-       if (ndp->ni_dvp != NULL) {
-               if (VOP_ISLOCKED(ndp->ni_dvp))
-                       VOP_UNLOCK(ndp->ni_dvp);
-               vrele(ndp->ni_dvp);
-       }
-       if (ndp->ni_vp != NULL) {
-               if (VOP_ISLOCKED(ndp->ni_vp))
-                       VOP_UNLOCK(ndp->ni_vp);
-               vrele(ndp->ni_vp);
-       }
+       return (0);
 }
 }
index 30cc805..2773c2c 100644 (file)
@@ -17,7 +17,7 @@
  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  *
  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  *
- *     @(#)nfs_serv.c  7.20 (Berkeley) %G%
+ *     @(#)nfs_serv.c  7.21 (Berkeley) %G%
  */
 
 /*
  */
 
 /*
@@ -574,11 +574,13 @@ nfsrv_create(mrep, md, dpos, cred, xid, mrq, repstat)
                        if (vap->va_type == VFIFO) {
 #ifndef FIFO
                                VOP_ABORTOP(ndp);
                        if (vap->va_type == VFIFO) {
 #ifndef FIFO
                                VOP_ABORTOP(ndp);
+                               vput(ndp->ni_dvp);
                                error = ENXIO;
                                nfsm_reply(0);
 #endif /* FIFO */
                        } else if (error = suser(cred, (short *)0)) {
                                VOP_ABORTOP(ndp);
                                error = ENXIO;
                                nfsm_reply(0);
 #endif /* FIFO */
                        } else if (error = suser(cred, (short *)0)) {
                                VOP_ABORTOP(ndp);
+                               vput(ndp->ni_dvp);
                                nfsm_reply(0);
                        } else
                                vap->va_rdev = (dev_t)rdev;
                                nfsm_reply(0);
                        } else
                                vap->va_rdev = (dev_t)rdev;
@@ -589,6 +591,7 @@ nfsrv_create(mrep, md, dpos, cred, xid, mrq, repstat)
                                nfsm_reply(0);
                } else {
                        VOP_ABORTOP(ndp);
                                nfsm_reply(0);
                } else {
                        VOP_ABORTOP(ndp);
+                       vput(ndp->ni_dvp);
                        error = ENXIO;
                        nfsm_reply(0);
                }
                        error = ENXIO;
                        nfsm_reply(0);
                }
@@ -597,6 +600,7 @@ nfsrv_create(mrep, md, dpos, cred, xid, mrq, repstat)
                vp = ndp->ni_vp;
                ndp->ni_vp = NULLVP;
                VOP_ABORTOP(ndp);
                vp = ndp->ni_vp;
                ndp->ni_vp = NULLVP;
                VOP_ABORTOP(ndp);
+               vput(ndp->ni_dvp);
                vap->va_size = 0;
                if (error = VOP_SETATTR(vp, vap, cred))
                        nfsm_reply(0);
                vap->va_size = 0;
                if (error = VOP_SETATTR(vp, vap, cred))
                        nfsm_reply(0);
@@ -616,6 +620,9 @@ nfsrv_create(mrep, md, dpos, cred, xid, mrq, repstat)
        return (error);
 nfsmout:
        VOP_ABORTOP(ndp);
        return (error);
 nfsmout:
        VOP_ABORTOP(ndp);
+       vput(ndp->ni_dvp);
+       if (ndp->ni_vp)
+               vput(ndp->ni_vp);
        return (error);
 }
 
        return (error);
 }
 
@@ -664,10 +671,13 @@ nfsrv_remove(mrep, md, dpos, cred, xid, mrq, repstat)
        if (vp->v_flag & VTEXT)
                xrele(vp);      /* try once to free text */
 out:
        if (vp->v_flag & VTEXT)
                xrele(vp);      /* try once to free text */
 out:
-       if (error)
-               VOP_ABORTOP(ndp);
-       else
+       if (!error) {
                error = VOP_REMOVE(ndp);
                error = VOP_REMOVE(ndp);
+       } else {
+               VOP_ABORTOP(ndp);
+               vput(ndp->ni_dvp);
+               vput(vp);
+       }
        nfsm_reply(0);
        nfsm_srvdone;
 }
        nfsm_reply(0);
        nfsm_srvdone;
 }
@@ -721,7 +731,12 @@ nfsrv_rename(mrep, md, dpos, cred, xid, mrq, repstat)
        crhold(cred);
        tond.ni_cred = cred;
        tond.ni_nameiop = RENAME | LOCKPARENT | LOCKLEAF | NOCACHE;
        crhold(cred);
        tond.ni_cred = cred;
        tond.ni_nameiop = RENAME | LOCKPARENT | LOCKLEAF | NOCACHE;
-       error = nfs_namei(&tond, tfhp, len2, &md, &dpos);
+       if (error = nfs_namei(&tond, tfhp, len2, &md, &dpos)) {
+               VOP_ABORTOP(ndp);
+               vrele(ndp->ni_dvp);
+               vrele(fvp);
+               goto out1;
+       }
        tdvp = tond.ni_dvp;
        tvp = tond.ni_vp;
        if (tvp != NULL) {
        tdvp = tond.ni_dvp;
        tvp = tond.ni_vp;
        if (tvp != NULL) {
@@ -733,10 +748,6 @@ nfsrv_rename(mrep, md, dpos, cred, xid, mrq, repstat)
                        goto out;
                }
        }
                        goto out;
                }
        }
-       if (error) {
-               VOP_ABORTOP(ndp);
-               goto out1;
-       }
        if (fvp->v_mount != tdvp->v_mount) {
                error = EXDEV;
                goto out;
        if (fvp->v_mount != tdvp->v_mount) {
                error = EXDEV;
                goto out;
@@ -744,15 +755,20 @@ nfsrv_rename(mrep, md, dpos, cred, xid, mrq, repstat)
        if (fvp == tdvp || fvp == tvp)
                error = EINVAL;
 out:
        if (fvp == tdvp || fvp == tvp)
                error = EINVAL;
 out:
-       if (error) {
-               VOP_ABORTOP(&tond);
-               VOP_ABORTOP(ndp);
-       } else {
+       if (!error) {
                VREF(ndp->ni_cdir);
                VREF(tond.ni_cdir);
                error = VOP_RENAME(ndp, &tond);
                vrele(ndp->ni_cdir);
                vrele(tond.ni_cdir);
                VREF(ndp->ni_cdir);
                VREF(tond.ni_cdir);
                error = VOP_RENAME(ndp, &tond);
                vrele(ndp->ni_cdir);
                vrele(tond.ni_cdir);
+       } else {
+               VOP_ABORTOP(&tond);
+               vput(tdvp);
+               if (tvp)
+                       vput(tvp);
+               VOP_ABORTOP(ndp);
+               vrele(ndp->ni_dvp);
+               vrele(fvp);
        }
 out1:
        crfree(cred);
        }
 out1:
        crfree(cred);
@@ -760,6 +776,8 @@ out1:
        return (error);
 nfsmout:
        VOP_ABORTOP(ndp);
        return (error);
 nfsmout:
        VOP_ABORTOP(ndp);
+       vrele(ndp->ni_dvp);
+       vrele(fvp);
        return (error);
 }
 
        return (error);
 }
 
@@ -809,10 +827,14 @@ nfsrv_link(mrep, md, dpos, cred, xid, mrq, repstat)
        if (vp->v_mount != xp->v_mount)
                error = EXDEV;
 out:
        if (vp->v_mount != xp->v_mount)
                error = EXDEV;
 out:
-       if (error)
-               VOP_ABORTOP(ndp);
-       else
+       if (!error) {
                error = VOP_LINK(vp, ndp);
                error = VOP_LINK(vp, ndp);
+       } else {
+               VOP_ABORTOP(ndp);
+               vput(ndp->ni_dvp);
+               if (ndp->ni_vp)
+                       vrele(ndp->ni_vp);
+       }
 out1:
        vrele(vp);
        nfsm_reply(0);
 out1:
        vrele(vp);
        nfsm_reply(0);
@@ -841,7 +863,6 @@ nfsrv_symlink(mrep, md, dpos, cred, xid, mrq, repstat)
        int error = 0;
        char *pathcp, *cp2;
        struct mbuf *mb, *mreq;
        int error = 0;
        char *pathcp, *cp2;
        struct mbuf *mb, *mreq;
-       struct vnode *vp;
        nfsv2fh_t nfh;
        fhandle_t *fhp;
        long len, len2;
        nfsv2fh_t nfh;
        fhandle_t *fhp;
        long len, len2;
@@ -854,7 +875,7 @@ nfsrv_symlink(mrep, md, dpos, cred, xid, mrq, repstat)
        ndp->ni_cred = cred;
        ndp->ni_nameiop = CREATE | LOCKPARENT;
        if (error = nfs_namei(ndp, fhp, len, &md, &dpos))
        ndp->ni_cred = cred;
        ndp->ni_nameiop = CREATE | LOCKPARENT;
        if (error = nfs_namei(ndp, fhp, len, &md, &dpos))
-               goto out1;
+               goto out;
        nfsm_strsiz(len2, NFS_MAXPATHLEN);
        MALLOC(pathcp, caddr_t, len2 + 1, M_TEMP, M_WAITOK);
        iv.iov_base = pathcp;
        nfsm_strsiz(len2, NFS_MAXPATHLEN);
        MALLOC(pathcp, caddr_t, len2 + 1, M_TEMP, M_WAITOK);
        iv.iov_base = pathcp;
@@ -867,26 +888,26 @@ nfsrv_symlink(mrep, md, dpos, cred, xid, mrq, repstat)
        io.uio_rw = UIO_READ;
        nfsm_mtouio(&io, len2);
        *(pathcp + len2) = '\0';
        io.uio_rw = UIO_READ;
        nfsm_mtouio(&io, len2);
        *(pathcp + len2) = '\0';
-       vp = ndp->ni_vp;
-       if (vp) {
+       if (ndp->ni_vp) {
+               VOP_ABORTOP(ndp);
+               vput(ndp->ni_dvp);
+               vrele(ndp->ni_vp);
                error = EEXIST;
                goto out;
        }
                error = EEXIST;
                goto out;
        }
-       vp = ndp->ni_dvp;
        VATTR_NULL(vap);
        vap->va_mode = 0777;
        VATTR_NULL(vap);
        vap->va_mode = 0777;
+       error = VOP_SYMLINK(ndp, vap, pathcp);
 out:
 out:
-       if (error)
-               VOP_ABORTOP(ndp);
-       else
-               error = VOP_SYMLINK(ndp, vap, pathcp);
-out1:
        if (pathcp)
                FREE(pathcp, M_TEMP);
        nfsm_reply(0);
        return (error);
 nfsmout:
        VOP_ABORTOP(ndp);
        if (pathcp)
                FREE(pathcp, M_TEMP);
        nfsm_reply(0);
        return (error);
 nfsmout:
        VOP_ABORTOP(ndp);
+       vput(ndp->ni_dvp);
+       if (ndp->ni_vp);
+               vrele(ndp->ni_vp);
        if (pathcp)
                FREE(pathcp, M_TEMP);
        return (error);
        if (pathcp)
                FREE(pathcp, M_TEMP);
        return (error);
@@ -934,6 +955,8 @@ nfsrv_mkdir(mrep, md, dpos, cred, xid, mrq, repstat)
        vp = ndp->ni_vp;
        if (vp != NULL) {
                VOP_ABORTOP(ndp);
        vp = ndp->ni_vp;
        if (vp != NULL) {
                VOP_ABORTOP(ndp);
+               vput(ndp->ni_dvp);
+               vrele(vp);
                error = EEXIST;
                nfsm_reply(0);
        }
                error = EEXIST;
                nfsm_reply(0);
        }
@@ -955,6 +978,9 @@ nfsrv_mkdir(mrep, md, dpos, cred, xid, mrq, repstat)
        return (error);
 nfsmout:
        VOP_ABORTOP(ndp);
        return (error);
 nfsmout:
        VOP_ABORTOP(ndp);
+       vput(ndp->ni_dvp);
+       if (ndp->ni_vp)
+               vrele(ndp->ni_vp);
        return (error);
 }
 
        return (error);
 }
 
@@ -1007,10 +1033,13 @@ nfsrv_rmdir(mrep, md, dpos, cred, xid, mrq, repstat)
        if (vp->v_flag & VROOT)
                error = EBUSY;
 out:
        if (vp->v_flag & VROOT)
                error = EBUSY;
 out:
-       if (error)
-               VOP_ABORTOP(ndp);
-       else
+       if (!error) {
                error = VOP_RMDIR(ndp);
                error = VOP_RMDIR(ndp);
+       } else {
+               VOP_ABORTOP(ndp);
+               vput(ndp->ni_dvp);
+               vput(vp);
+       }
        nfsm_reply(0);
        nfsm_srvdone;
 }
        nfsm_reply(0);
        nfsm_srvdone;
 }
index 99e1d87..620774b 100644 (file)
@@ -17,7 +17,7 @@
  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  *
  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  *
- *     @(#)nfs_vnops.c 7.40 (Berkeley) %G%
+ *     @(#)nfs_vnops.c 7.41 (Berkeley) %G%
  */
 
 /*
  */
 
 /*
@@ -771,6 +771,7 @@ nfs_mknod(ndp, vap, cred)
 #endif /* FIFO */
        else {
                VOP_ABORTOP(ndp);
 #endif /* FIFO */
        else {
                VOP_ABORTOP(ndp);
+               vput(ndp->ni_dvp);
                return (EOPNOTSUPP);
        }
        nfsstats.rpccnt[NFSPROC_CREATE]++;
                return (EOPNOTSUPP);
        }
        nfsstats.rpccnt[NFSPROC_CREATE]++;
@@ -940,8 +941,13 @@ nfs_rename(sndp, tndp)
                        cache_purge(tndp->ni_dvp);
                cache_purge(sndp->ni_dvp);
        }
                        cache_purge(tndp->ni_dvp);
                cache_purge(sndp->ni_dvp);
        }
-       nfs_abortop(sndp);
-       nfs_abortop(tndp);
+       VOP_ABORTOP(tndp);
+       vput(tndp->ni_dvp);
+       if (tndp->ni_vp)
+               vput(tndp->ni_vp);
+       VOP_ABORTOP(sndp);
+       vrele(sndp->ni_dvp);
+       vrele(sndp->ni_vp);
        /*
         * Kludge: Map ENOENT => 0 assuming that it is a reply to a retry.
         */
        /*
         * Kludge: Map ENOENT => 0 assuming that it is a reply to a retry.
         */
index c39924d..2f83032 100644 (file)
@@ -14,7 +14,7 @@
  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  *
  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  *
- *     @(#)ffs_vnops.c 7.41 (Berkeley) %G%
+ *     @(#)ffs_vnops.c 7.42 (Berkeley) %G%
  */
 
 #include "param.h"
  */
 
 #include "param.h"
@@ -912,9 +912,13 @@ ufs_rename(fndp, tndp)
                 */
                if ((d->d_namlen == 1 && d->d_name[0] == '.') || dp == ip ||
                    fndp->ni_isdotdot || (ip->i_flag & IRENAME)) {
                 */
                if ((d->d_namlen == 1 && d->d_name[0] == '.') || dp == ip ||
                    fndp->ni_isdotdot || (ip->i_flag & IRENAME)) {
-                       IUNLOCK(ip);
-                       ufs_abortop(fndp);
-                       ufs_abortop(tndp);
+                       VOP_ABORTOP(tndp);
+                       vput(tndp->ni_dvp);
+                       if (tndp->ni_vp)
+                               vput(tndp->ni_vp);
+                       VOP_ABORTOP(fndp);
+                       vrele(fndp->ni_dvp);
+                       vput(fndp->ni_vp);
                        return (EINVAL);
                }
                ip->i_flag |= IRENAME;
                        return (EINVAL);
                }
                ip->i_flag |= IRENAME;
@@ -1386,23 +1390,14 @@ ufs_readlink(vp, uiop, cred)
 
 /*
  * Ufs abort op, called after namei() when a CREATE/DELETE isn't actually
 
 /*
  * Ufs abort op, called after namei() when a CREATE/DELETE isn't actually
- * done. Iff ni_vp/ni_dvp not null and locked, unlock.
+ * done. Nothing to do at the moment.
  */
  */
+/* ARGSUSED */
 ufs_abortop(ndp)
 ufs_abortop(ndp)
-       register struct nameidata *ndp;
+       struct nameidata *ndp;
 {
 
 {
 
-       if (ndp->ni_dvp) {
-               if (VOP_ISLOCKED(ndp->ni_dvp))
-                       VOP_UNLOCK(ndp->ni_dvp);
-               vrele(ndp->ni_dvp);
-       }
-       if (ndp->ni_vp) {
-               if (VOP_ISLOCKED(ndp->ni_vp))
-                       VOP_UNLOCK(ndp->ni_vp);
-               vrele(ndp->ni_vp);
-       }
-       return;
+       return (0);
 }
 
 /*
 }
 
 /*
index d70847a..e46a22f 100644 (file)
@@ -14,7 +14,7 @@
  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  *
  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  *
- *     @(#)ufs_vnops.c 7.41 (Berkeley) %G%
+ *     @(#)ufs_vnops.c 7.42 (Berkeley) %G%
  */
 
 #include "param.h"
  */
 
 #include "param.h"
@@ -912,9 +912,13 @@ ufs_rename(fndp, tndp)
                 */
                if ((d->d_namlen == 1 && d->d_name[0] == '.') || dp == ip ||
                    fndp->ni_isdotdot || (ip->i_flag & IRENAME)) {
                 */
                if ((d->d_namlen == 1 && d->d_name[0] == '.') || dp == ip ||
                    fndp->ni_isdotdot || (ip->i_flag & IRENAME)) {
-                       IUNLOCK(ip);
-                       ufs_abortop(fndp);
-                       ufs_abortop(tndp);
+                       VOP_ABORTOP(tndp);
+                       vput(tndp->ni_dvp);
+                       if (tndp->ni_vp)
+                               vput(tndp->ni_vp);
+                       VOP_ABORTOP(fndp);
+                       vrele(fndp->ni_dvp);
+                       vput(fndp->ni_vp);
                        return (EINVAL);
                }
                ip->i_flag |= IRENAME;
                        return (EINVAL);
                }
                ip->i_flag |= IRENAME;
@@ -1386,23 +1390,14 @@ ufs_readlink(vp, uiop, cred)
 
 /*
  * Ufs abort op, called after namei() when a CREATE/DELETE isn't actually
 
 /*
  * Ufs abort op, called after namei() when a CREATE/DELETE isn't actually
- * done. Iff ni_vp/ni_dvp not null and locked, unlock.
+ * done. Nothing to do at the moment.
  */
  */
+/* ARGSUSED */
 ufs_abortop(ndp)
 ufs_abortop(ndp)
-       register struct nameidata *ndp;
+       struct nameidata *ndp;
 {
 
 {
 
-       if (ndp->ni_dvp) {
-               if (VOP_ISLOCKED(ndp->ni_dvp))
-                       VOP_UNLOCK(ndp->ni_dvp);
-               vrele(ndp->ni_dvp);
-       }
-       if (ndp->ni_vp) {
-               if (VOP_ISLOCKED(ndp->ni_vp))
-                       VOP_UNLOCK(ndp->ni_vp);
-               vrele(ndp->ni_vp);
-       }
-       return;
+       return (0);
 }
 
 /*
 }
 
 /*
index 8b88f3a..706e6e6 100644 (file)
@@ -14,7 +14,7 @@
  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  *
  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  *
- *     @(#)lfs_vnops.c 7.41 (Berkeley) %G%
+ *     @(#)lfs_vnops.c 7.42 (Berkeley) %G%
  */
 
 #include "param.h"
  */
 
 #include "param.h"
@@ -912,9 +912,13 @@ ufs_rename(fndp, tndp)
                 */
                if ((d->d_namlen == 1 && d->d_name[0] == '.') || dp == ip ||
                    fndp->ni_isdotdot || (ip->i_flag & IRENAME)) {
                 */
                if ((d->d_namlen == 1 && d->d_name[0] == '.') || dp == ip ||
                    fndp->ni_isdotdot || (ip->i_flag & IRENAME)) {
-                       IUNLOCK(ip);
-                       ufs_abortop(fndp);
-                       ufs_abortop(tndp);
+                       VOP_ABORTOP(tndp);
+                       vput(tndp->ni_dvp);
+                       if (tndp->ni_vp)
+                               vput(tndp->ni_vp);
+                       VOP_ABORTOP(fndp);
+                       vrele(fndp->ni_dvp);
+                       vput(fndp->ni_vp);
                        return (EINVAL);
                }
                ip->i_flag |= IRENAME;
                        return (EINVAL);
                }
                ip->i_flag |= IRENAME;
@@ -1386,23 +1390,14 @@ ufs_readlink(vp, uiop, cred)
 
 /*
  * Ufs abort op, called after namei() when a CREATE/DELETE isn't actually
 
 /*
  * Ufs abort op, called after namei() when a CREATE/DELETE isn't actually
- * done. Iff ni_vp/ni_dvp not null and locked, unlock.
+ * done. Nothing to do at the moment.
  */
  */
+/* ARGSUSED */
 ufs_abortop(ndp)
 ufs_abortop(ndp)
-       register struct nameidata *ndp;
+       struct nameidata *ndp;
 {
 
 {
 
-       if (ndp->ni_dvp) {
-               if (VOP_ISLOCKED(ndp->ni_dvp))
-                       VOP_UNLOCK(ndp->ni_dvp);
-               vrele(ndp->ni_dvp);
-       }
-       if (ndp->ni_vp) {
-               if (VOP_ISLOCKED(ndp->ni_vp))
-                       VOP_UNLOCK(ndp->ni_vp);
-               vrele(ndp->ni_vp);
-       }
-       return;
+       return (0);
 }
 
 /*
 }
 
 /*
index d70847a..e46a22f 100644 (file)
@@ -14,7 +14,7 @@
  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  *
  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  *
- *     @(#)ufs_vnops.c 7.41 (Berkeley) %G%
+ *     @(#)ufs_vnops.c 7.42 (Berkeley) %G%
  */
 
 #include "param.h"
  */
 
 #include "param.h"
@@ -912,9 +912,13 @@ ufs_rename(fndp, tndp)
                 */
                if ((d->d_namlen == 1 && d->d_name[0] == '.') || dp == ip ||
                    fndp->ni_isdotdot || (ip->i_flag & IRENAME)) {
                 */
                if ((d->d_namlen == 1 && d->d_name[0] == '.') || dp == ip ||
                    fndp->ni_isdotdot || (ip->i_flag & IRENAME)) {
-                       IUNLOCK(ip);
-                       ufs_abortop(fndp);
-                       ufs_abortop(tndp);
+                       VOP_ABORTOP(tndp);
+                       vput(tndp->ni_dvp);
+                       if (tndp->ni_vp)
+                               vput(tndp->ni_vp);
+                       VOP_ABORTOP(fndp);
+                       vrele(fndp->ni_dvp);
+                       vput(fndp->ni_vp);
                        return (EINVAL);
                }
                ip->i_flag |= IRENAME;
                        return (EINVAL);
                }
                ip->i_flag |= IRENAME;
@@ -1386,23 +1390,14 @@ ufs_readlink(vp, uiop, cred)
 
 /*
  * Ufs abort op, called after namei() when a CREATE/DELETE isn't actually
 
 /*
  * Ufs abort op, called after namei() when a CREATE/DELETE isn't actually
- * done. Iff ni_vp/ni_dvp not null and locked, unlock.
+ * done. Nothing to do at the moment.
  */
  */
+/* ARGSUSED */
 ufs_abortop(ndp)
 ufs_abortop(ndp)
-       register struct nameidata *ndp;
+       struct nameidata *ndp;
 {
 
 {
 
-       if (ndp->ni_dvp) {
-               if (VOP_ISLOCKED(ndp->ni_dvp))
-                       VOP_UNLOCK(ndp->ni_dvp);
-               vrele(ndp->ni_dvp);
-       }
-       if (ndp->ni_vp) {
-               if (VOP_ISLOCKED(ndp->ni_vp))
-                       VOP_UNLOCK(ndp->ni_vp);
-               vrele(ndp->ni_vp);
-       }
-       return;
+       return (0);
 }
 
 /*
 }
 
 /*