Date: Fri, 20 Oct 2000 17:18:10 +0100 From: David Malone <dwmalone@maths.tcd.ie> To: Vadim Belman <voland@lflat.org> Cc: freebsd-hackers@freebsd.org Subject: Re: NFS/VM deadlock report and help request Message-ID: <20001020171810.A28345@walton.maths.tcd.ie> In-Reply-To: <20001020145043.B73760@lflat.vas.mobilix.dk>; from voland@lflat.org on Fri, Oct 20, 2000 at 02:50:43PM %2B0200 References: <20001020145043.B73760@lflat.vas.mobilix.dk>
next in thread | previous in thread | raw e-mail | index | archive | help
On Fri, Oct 20, 2000 at 02:50:43PM +0200, Vadim Belman wrote:
> The kernel config I supply as an attachment. Kernel-mode stack
> trace for the thttpd process looks like this:
I think we've seen a similar problem and have a work around for it.
You could try the following patch, though it might take more fiddling
to get it right.
(The patch is by Ian Dowse, Matt Dillon had a quick look at it and said
it looked OK, we've been testing it for a bit here).
David.
Index: nfs/nfs.h
===================================================================
RCS file: /FreeBSD/FreeBSD-CVS/src/sys/nfs/nfs.h,v
retrieving revision 1.53
diff -u -r1.53 nfs.h
--- nfs/nfs.h 2000/01/13 20:18:25 1.53
+++ nfs/nfs.h 2000/10/20 16:13:49
@@ -616,7 +616,7 @@
struct ucred *, struct mbuf **, struct mbuf **,
caddr_t *));
int nfs_loadattrcache __P((struct vnode **, struct mbuf **, caddr_t *,
- struct vattr *));
+ struct vattr *, int));
int nfs_namei __P((struct nameidata *, fhandle_t *, int,
struct nfssvc_sock *, struct sockaddr *, struct mbuf **,
caddr_t *, struct vnode **, struct proc *, int, int));
Index: nfs/nfs_subs.c
===================================================================
RCS file: /FreeBSD/FreeBSD-CVS/src/sys/nfs/nfs_subs.c,v
retrieving revision 1.90
diff -u -r1.90 nfs_subs.c
--- nfs/nfs_subs.c 2000/02/13 03:32:06 1.90
+++ nfs/nfs_subs.c 2000/10/20 16:13:49
@@ -1203,11 +1203,12 @@
* copy the attributes to *vaper
*/
int
-nfs_loadattrcache(vpp, mdp, dposp, vaper)
+nfs_loadattrcache(vpp, mdp, dposp, vaper, dontshrink)
struct vnode **vpp;
struct mbuf **mdp;
caddr_t *dposp;
struct vattr *vaper;
+ int dontshrink;
{
register struct vnode *vp = *vpp;
register struct vattr *vap;
@@ -1322,9 +1323,18 @@
vap->va_gen = fxdr_unsigned(u_int32_t,fp->fa2_ctime.nfsv2_usec);
vap->va_filerev = 0;
}
+ np->n_attrstamp = time_second;
if (vap->va_size != np->n_size) {
if (vap->va_type == VREG) {
- if (np->n_flag & NMODIFIED) {
+ if (dontshrink && vap->va_size < np->n_size) {
+ /*
+ * We've been told not to shrink the file;
+ * zero np->n_attrstamp to indicate that
+ * the attributes are stale.
+ */
+ vap->va_size = np->n_size;
+ np->n_attrstamp = 0;
+ } else if (np->n_flag & NMODIFIED) {
if (vap->va_size < np->n_size)
vap->va_size = np->n_size;
else
@@ -1337,7 +1347,6 @@
np->n_size = vap->va_size;
}
}
- np->n_attrstamp = time_second;
if (vaper != NULL) {
bcopy((caddr_t)vap, (caddr_t)vaper, sizeof(*vap));
if (np->n_flag & NCHG) {
Index: nfs/nfsm_subs.h
===================================================================
RCS file: /FreeBSD/FreeBSD-CVS/src/sys/nfs/nfsm_subs.h,v
retrieving revision 1.27
diff -u -r1.27 nfsm_subs.h
--- nfs/nfsm_subs.h 1999/08/28 00:50:02 1.27
+++ nfs/nfsm_subs.h 2000/10/20 16:13:49
@@ -212,7 +212,7 @@
#define nfsm_loadattr(v, a) \
do { \
struct vnode *ttvp = (v); \
- if ((t1 = nfs_loadattrcache(&ttvp, &md, &dpos, (a))) != 0) { \
+ if ((t1 = nfs_loadattrcache(&ttvp, &md, &dpos, (a), 0)) != 0) { \
error = t1; \
m_freem(mrep); \
goto nfsmout; \
@@ -226,7 +226,7 @@
nfsm_dissect(tl, u_int32_t *, NFSX_UNSIGNED); \
if (((f) = fxdr_unsigned(int, *tl)) != 0) { \
if ((t1 = nfs_loadattrcache(&ttvp, &md, &dpos, \
- (struct vattr *)0)) != 0) { \
+ (struct vattr *)0, 1)) != 0) { \
error = t1; \
(f) = 0; \
m_freem(mrep); \
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-hackers" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20001020171810.A28345>
