Re: 2.6.9 nfsd crashing often

From: Christoph Hellwig
Date: Fri Nov 19 2004 - 06:18:29 EST


On Fri, Nov 19, 2004 at 09:44:58AM +0100, martin f krafft wrote:
> also sprach Neil Brown <neilb@xxxxxxxxxxxxxxx> [2004.11.19.0542 +0100]:
> > > Call Trace:
> > > [<c0166197>] __lookup_hash+0xa7/0xe0
> >
> > Looks like i_op->lookup == NULL, and I don't think nfsd could do that.
> >
> > What filesystem are you using?
>
> XFS.
>
> Thanks for following up!

Care to check whether it goes away with the patch below?
(also I'm not sure 2.6.9 has all the relevant xfs and nfsd fixes,
updating to 2.6.10-rc is a good idea)


Index: fs/xfs/xfs_dmapi.c
===================================================================
RCS file: /cvs/linux-2.6-xfs/fs/xfs/xfs_dmapi.c,v
retrieving revision 1.108
diff -u -p -r1.108 xfs_dmapi.c
--- fs/xfs/xfs_dmapi.c 28 Oct 2004 22:43:01 -0000 1.108
+++ fs/xfs/xfs_dmapi.c 18 Nov 2004 13:01:48 -0000
@@ -2666,8 +2666,10 @@ xfs_dm_set_fileattr(
}

VOP_SETATTR(vp, &vat, ATTR_DMI, NULL, error);
- if (!error)
- vn_revalidate(vp); /* update Linux inode flags */
+ if (!error) {
+ vn_revalidate_core(vp, &vat);
+ VUNMODIFY(vp);
+ }
return(-error); /* Return negative error to DMAPI */
}

Index: fs/xfs/xfs_vnodeops.c
===================================================================
RCS file: /cvs/linux-2.6-xfs/fs/xfs/xfs_vnodeops.c,v
retrieving revision 1.636
diff -u -p -r1.636 xfs_vnodeops.c
--- fs/xfs/xfs_vnodeops.c 30 Sep 2004 03:40:12 -0000 1.636
+++ fs/xfs/xfs_vnodeops.c 18 Nov 2004 13:01:50 -0000
@@ -909,6 +909,9 @@ xfs_setattr(
mandlock_after);
}

+ vap->va_mask = XFS_AT_STAT|XFS_AT_XFLAGS;
+ code = xfs_getattr(bdp, vap, ATTR_LAZY, credp);
+
xfs_iunlock(ip, lock_flags);

/*
@@ -929,6 +932,7 @@ xfs_setattr(
NULL, DM_RIGHT_NULL, NULL, NULL,
0, 0, AT_DELAY_FLAG(flags));
}
+
return 0;

abort_return:
Index: fs/xfs/linux-2.6/xfs_file.c
===================================================================
RCS file: /cvs/linux-2.6-xfs/fs/xfs/linux-2.6/xfs_file.c,v
retrieving revision 1.109
diff -u -p -r1.109 xfs_file.c
--- fs/xfs/linux-2.6/xfs_file.c 26 Oct 2004 22:56:13 -0000 1.109
+++ fs/xfs/linux-2.6/xfs_file.c 18 Nov 2004 13:01:51 -0000
@@ -409,8 +409,11 @@ linvfs_file_mmap(
vma->vm_ops = &linvfs_file_vm_ops;

VOP_SETATTR(vp, &va, XFS_AT_UPDATIME, NULL, error);
- if (!error)
- vn_revalidate(vp); /* update Linux inode flags */
+ if (!error) {
+ vn_revalidate_core(vp, &va);
+ VUNMODIFY(vp);
+ }
+
return 0;
}

Index: fs/xfs/linux-2.6/xfs_ioctl.c
===================================================================
RCS file: /cvs/linux-2.6-xfs/fs/xfs/linux-2.6/xfs_ioctl.c,v
retrieving revision 1.116
diff -u -p -r1.116 xfs_ioctl.c
--- fs/xfs/linux-2.6/xfs_ioctl.c 27 Oct 2004 12:06:24 -0000 1.116
+++ fs/xfs/linux-2.6/xfs_ioctl.c 18 Nov 2004 13:01:51 -0000
@@ -1102,8 +1102,10 @@ xfs_ioc_xattr(
va.va_extsize = fa.fsx_extsize;

VOP_SETATTR(vp, &va, attr_flags, NULL, error);
- if (!error)
- vn_revalidate(vp); /* update Linux inode flags */
+ if (!error) {
+ vn_revalidate_core(vp, &va);
+ VUNMODIFY(vp);
+ }
return -error;
}

@@ -1147,8 +1149,10 @@ xfs_ioc_xattr(
xfs_dic2xflags(&ip->i_d, ARCH_NOCONVERT));

VOP_SETATTR(vp, &va, attr_flags, NULL, error);
- if (!error)
- vn_revalidate(vp); /* update Linux inode flags */
+ if (!error) {
+ vn_revalidate_core(vp, &va);
+ VUNMODIFY(vp);
+ }
return -error;
}

Index: fs/xfs/linux-2.6/xfs_iops.c
===================================================================
RCS file: /cvs/linux-2.6-xfs/fs/xfs/linux-2.6/xfs_iops.c,v
retrieving revision 1.223
diff -u -p -r1.223 xfs_iops.c
--- fs/xfs/linux-2.6/xfs_iops.c 1 Oct 2004 05:55:52 -0000 1.223
+++ fs/xfs/linux-2.6/xfs_iops.c 18 Nov 2004 13:01:51 -0000
@@ -531,11 +531,10 @@ linvfs_setattr(
vattr.va_mask |= XFS_AT_CTIME;
vattr.va_ctime = attr->ia_ctime;
}
+
if (ia_valid & ATTR_MODE) {
vattr.va_mask |= XFS_AT_MODE;
vattr.va_mode = attr->ia_mode;
- if (!in_group_p(inode->i_gid) && !capable(CAP_FSETID))
- inode->i_mode &= ~S_ISGID;
}

if (ia_valid & (ATTR_MTIME_SET | ATTR_ATIME_SET))
@@ -546,10 +545,11 @@ linvfs_setattr(
#endif

VOP_SETATTR(vp, &vattr, flags, NULL, error);
- if (error)
- return -error;
- vn_revalidate(vp);
- return error;
+ if (!error) {
+ vn_revalidate_core(vp, &vattr);
+ VUNMODIFY(vp);
+ }
+ return -error;
}

STATIC void
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/