VOP_ABORTOP is no longer responsible for unlocking and vreleing vnodes
[unix-history] / usr / src / sys / ufs / ffs / ffs_vnops.c
index 9c9015f..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.39 (Berkeley) %G%
+ *     @(#)ffs_vnops.c 7.42 (Berkeley) %G%
  */
 
 #include "param.h"
  */
 
 #include "param.h"
@@ -552,7 +552,7 @@ chown1(vp, uid, gid, cred)
                }
                if ((error = chkdq(ip, change, cred, CHOWN)) == 0) {
                        if ((error = chkiq(ip, 1, cred, CHOWN)) == 0)
                }
                if ((error = chkdq(ip, change, cred, CHOWN)) == 0) {
                        if ((error = chkiq(ip, 1, cred, CHOWN)) == 0)
-                               return (0);
+                               goto good;
                        else
                                (void) chkdq(ip, -change, cred, CHOWN|FORCE);
                }
                        else
                                (void) chkdq(ip, -change, cred, CHOWN|FORCE);
                }
@@ -572,12 +572,15 @@ chown1(vp, uid, gid, cred)
                        dqrele(vp, ip->i_dquot[GRPQUOTA]);
                        ip->i_dquot[GRPQUOTA] = NODQUOT;
                }
                        dqrele(vp, ip->i_dquot[GRPQUOTA]);
                        ip->i_dquot[GRPQUOTA] = NODQUOT;
                }
-               (void) chkdq(ip, change, cred, FORCE);
-               (void) chkiq(ip, 1, cred, FORCE);
+               (void) chkdq(ip, change, cred, FORCE|CHOWN);
+               (void) chkiq(ip, 1, cred, FORCE|CHOWN);
+               (void) getinoquota(ip);
        }
        }
-       if (error)
-               return (error);
-#endif
+       return (error);
+good:
+       if (getinoquota(ip))
+               panic("chown: lost quota");
+#endif /* QUOTA */
        if (ouid != uid || ogid != gid)
                ip->i_flag |= ICHG;
        if (ouid != uid && cred->cr_uid != 0)
        if (ouid != uid || ogid != gid)
                ip->i_flag |= ICHG;
        if (ouid != uid && cred->cr_uid != 0)
@@ -909,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;
@@ -1383,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);
 }
 
 /*
 }
 
 /*