projects
/
unix-history
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
tags
|
clone url
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
date and time created 90/02/07 19:18:39 by mckusick
[unix-history]
/
usr
/
src
/
sys
/
nfs
/
nfs_node.c
diff --git
a/usr/src/sys/nfs/nfs_node.c
b/usr/src/sys/nfs/nfs_node.c
index
dcac47c
..
b8511e5
100644
(file)
--- a/
usr/src/sys/nfs/nfs_node.c
+++ b/
usr/src/sys/nfs/nfs_node.c
@@
-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.
13
(Berkeley) %G%
+ * @(#)nfs_node.c 7.
20
(Berkeley) %G%
*/
#include "param.h"
*/
#include "param.h"
@@
-136,8
+136,9
@@
loop:
/*
* Insert the nfsnode in the hash queue for its new file handle
*/
/*
* Insert the nfsnode in the hash queue for its new file handle
*/
- np->n_flag =
NLOCKED
;
+ np->n_flag =
0
;
insque(np, nh);
insque(np, nh);
+ nfs_lock(vp);
bcopy((caddr_t)fhp, (caddr_t)&np->n_fh, NFSX_FH);
np->n_attrstamp = 0;
np->n_sillyrename = (struct sillyrename *)0;
bcopy((caddr_t)fhp, (caddr_t)&np->n_fh, NFSX_FH);
np->n_attrstamp = 0;
np->n_sillyrename = (struct sillyrename *)0;
@@
-157,9
+158,8
@@
nfs_inactive(vp)
extern int prtactive;
np = VTONFS(vp);
extern int prtactive;
np = VTONFS(vp);
- if (prtactive && vp->v_count != 0)
- printf("nfs_inactive: pushing active fileid %d fsid 0x%x\n",
- np->n_vattr.va_fileid, np->n_vattr.va_fsid);
+ if (prtactive && vp->v_usecount != 0)
+ vprint("nfs_inactive: pushing active", vp);
nfs_lock(vp);
sp = np->n_sillyrename;
np->n_sillyrename = (struct sillyrename *)0;
nfs_lock(vp);
sp = np->n_sillyrename;
np->n_sillyrename = (struct sillyrename *)0;
@@
-211,16
+211,17
@@
nfs_reclaim(vp)
extern int prtactive;
/*
extern int prtactive;
/*
- * Flush out any
associated bio buffers that might be lying about
+ * Flush out any
bio buffer or cmap references
*/
*/
- if (vp->v_type == VREG && (np->n_flag & NBUFFERED)) {
- nfs_lock(np);
- nfs_blkflush(vp, (daddr_t)0, np->n_size, TRUE);
- nfs_unlock(np);
+ if (vp->v_type == VREG) {
+ nfs_lock(vp);
+ vinvalbuf(vp, TRUE);
+ nfs_unlock(vp);
+ if (np->n_flag & NPAGEDON)
+ mpurge(vp);
}
}
- if (prtactive && vp->v_count != 0)
- printf("nfs_reclaim: pushing active fileid %d fsid 0x%x\n",
- np->n_vattr.va_fileid, np->n_vattr.va_fsid);
+ if (prtactive && vp->v_usecount != 0)
+ vprint("nfs_reclaim: pushing active", vp);
/*
* Remove the nfsnode from its hash chain.
*/
/*
* Remove the nfsnode from its hash chain.
*/
@@
-228,6
+229,7
@@
nfs_reclaim(vp)
np->n_forw = np;
np->n_back = np;
cache_purge(vp);
np->n_forw = np;
np->n_back = np;
cache_purge(vp);
+ np->n_flag = 0;
return (0);
}
return (0);
}
@@
-241,8
+243,14
@@
nfs_lock(vp)
while (np->n_flag & NLOCKED) {
np->n_flag |= NWANT;
while (np->n_flag & NLOCKED) {
np->n_flag |= NWANT;
- sleep((caddr_t)np, PINOD);
+ if (np->n_lockholder == u.u_procp->p_pid)
+ panic("locking against myself");
+ np->n_lockwaiter = u.u_procp->p_pid;
+ (void) sleep((caddr_t)np, PINOD);
}
}
+ np->n_lockwaiter = 0;
+ np->n_lockholder = u.u_procp->p_pid;
+ u.u_spare[0]++;
np->n_flag |= NLOCKED;
}
np->n_flag |= NLOCKED;
}
@@
-254,6
+262,10
@@
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;
+ 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;
@@
-261,6
+273,18
@@
nfs_unlock(vp)
}
}
}
}
+/*
+ * Check for a locked nfsnode
+ */
+nfs_islocked(vp)
+ struct vnode *vp;
+{
+
+ if (VTONFS(vp)->n_flag & NLOCKED)
+ return (1);
+ return (0);
+}
+
/*
* Unlock and vrele()
* since I can't decide if dirs. should be locked, I will check for
/*
* Unlock and vrele()
* since I can't decide if dirs. should be locked, I will check for