make ffs_subr.c work with fsck(8) again
[unix-history] / usr / src / sys / nfs / nfs_node.c
index 42275d6..6ac9e0c 100644 (file)
@@ -7,22 +7,22 @@
  *
  * %sccs.include.redist.c%
  *
  *
  * %sccs.include.redist.c%
  *
- *     @(#)nfs_node.c  7.29 (Berkeley) %G%
+ *     @(#)nfs_node.c  7.34 (Berkeley) %G%
  */
 
 #include "param.h"
 #include "systm.h"
  */
 
 #include "param.h"
 #include "systm.h"
-#include "user.h"
 #include "proc.h"
 #include "mount.h"
 #include "proc.h"
 #include "mount.h"
+#include "namei.h"
 #include "vnode.h"
 #include "vnode.h"
-#include "errno.h"
+#include "kernel.h"
+#include "malloc.h"
+
 #include "nfsv2.h"
 #include "nfs.h"
 #include "nfsnode.h"
 #include "nfsmount.h"
 #include "nfsv2.h"
 #include "nfs.h"
 #include "nfsnode.h"
 #include "nfsmount.h"
-#include "kernel.h"
-#include "malloc.h"
 
 /* The request list head */
 extern struct nfsreq nfsreqh;
 
 /* The request list head */
 extern struct nfsreq nfsreqh;
@@ -137,11 +137,11 @@ loop:
        return (0);
 }
 
        return (0);
 }
 
-nfs_inactive(vp)
+nfs_inactive(vp, p)
        struct vnode *vp;
        struct vnode *vp;
+       struct proc *p;
 {
        register struct nfsnode *np;
 {
        register struct nfsnode *np;
-       register struct nameidata *ndp;
        register struct sillyrename *sp;
        struct nfsnode *dnp;
        extern int prtactive;
        register struct sillyrename *sp;
        struct nfsnode *dnp;
        extern int prtactive;
@@ -156,14 +156,14 @@ nfs_inactive(vp)
                /*
                 * Remove the silly file that was rename'd earlier
                 */
                /*
                 * Remove the silly file that was rename'd earlier
                 */
-               ndp = &sp->s_namei;
                if (!nfs_nget(vp->v_mount, &sp->s_fh, &dnp)) {
                if (!nfs_nget(vp->v_mount, &sp->s_fh, &dnp)) {
-                       ndp->ni_dvp = NFSTOV(dnp);
-                       nfs_removeit(ndp);
-                       nfs_nput(ndp->ni_dvp);
+                       sp->s_dvp = NFSTOV(dnp);
+                       nfs_removeit(sp, p);
+                       nfs_nput(sp->s_dvp);
                }
                }
-               crfree(ndp->ni_cred);
-               free((caddr_t)sp, M_TEMP);
+               crfree(sp->s_cred);
+               vrele(sp->s_dvp);
+               free((caddr_t)sp, M_NFSREQ);
        }
        nfs_unlock(vp);
        np->n_flag &= NMODIFIED;
        }
        nfs_unlock(vp);
        np->n_flag &= NMODIFIED;
@@ -213,24 +213,31 @@ nfs_reclaim(vp)
        return (0);
 }
 
        return (0);
 }
 
+/*
+ * In theory, NFS does not need locking, but we make provision
+ * for doing it just in case it is needed.
+ */
+int donfslocking = 0;
 /*
  * Lock an nfsnode
  */
 /*
  * Lock an nfsnode
  */
+
 nfs_lock(vp)
        struct vnode *vp;
 {
        register struct nfsnode *np = VTONFS(vp);
 
 nfs_lock(vp)
        struct vnode *vp;
 {
        register struct nfsnode *np = VTONFS(vp);
 
+       if (!donfslocking)
+               return;
        while (np->n_flag & NLOCKED) {
                np->n_flag |= NWANT;
        while (np->n_flag & NLOCKED) {
                np->n_flag |= NWANT;
-               if (np->n_lockholder == u.u_procp->p_pid)
+               if (np->n_lockholder == curproc->p_pid)
                        panic("locking against myself");
                        panic("locking against myself");
-               np->n_lockwaiter = u.u_procp->p_pid;
+               np->n_lockwaiter = curproc->p_pid;
                (void) tsleep((caddr_t)np, PINOD, "nfslock", 0);
        }
        np->n_lockwaiter = 0;
                (void) tsleep((caddr_t)np, PINOD, "nfslock", 0);
        }
        np->n_lockwaiter = 0;
-       np->n_lockholder = u.u_procp->p_pid;
-       u.u_spare[0]++;
+       np->n_lockholder = curproc->p_pid;
        np->n_flag |= NLOCKED;
 }
 
        np->n_flag |= NLOCKED;
 }
 
@@ -242,10 +249,7 @@ nfs_unlock(vp)
 {
        register struct nfsnode *np = VTONFS(vp);
 
 {
        register struct nfsnode *np = VTONFS(vp);
 
-       if ((np->n_flag & NLOCKED) == 0)
-               vprint("nfs_unlock: unlocked nfsnode", vp);
        np->n_lockholder = 0;
        np->n_lockholder = 0;
-       u.u_spare[0]--;
        np->n_flag &= ~NLOCKED;
        if (np->n_flag & NWANT) {
                np->n_flag &= ~NWANT;
        np->n_flag &= ~NLOCKED;
        if (np->n_flag & NWANT) {
                np->n_flag &= ~NWANT;
@@ -289,5 +293,7 @@ nfs_abortop(ndp)
        struct nameidata *ndp;
 {
 
        struct nameidata *ndp;
 {
 
+       if ((ndp->ni_nameiop & (HASBUF | SAVESTART)) == HASBUF)
+               FREE(ndp->ni_pnbuf, M_NAMEI);
        return (0);
 }
        return (0);
 }