Sophie

Sophie

distrib > Scientific%20Linux > 5x > x86_64 > by-pkgid > fc11cd6e1c513a17304da94a5390f3cd > files > 2567

kernel-2.6.18-194.11.1.el5.src.rpm

Date: Wed, 20 Sep 2006 05:14:03 -0400
From: Steve Dickson <SteveD@redhat.com>
Subject: Re: [RHEL5/FC6] [PATCH] kernel BUG at fs/dcache.c:615!

Steve Dickson wrote:
>An oops occurred when the rpc_pipefs filesystem was unmount
>after an NFSv4 mount/umount occurred. The oops is being caused
>by a dentry that is still referenced during the umount.
>The reason the dentry was not being de-referenced was because a state
>bit was not being correctly set. This patch fixes that problem and is 
>already fixed in the -mm kernel.
>
>the bz is: https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=206636

After consulting with upstream, here is the complete upstream patch
which does to a bit more clean up... this is the one we should go with.

steved.

The scheme to indicate which services have been started up appears to be
seriously broken.

Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
---

 fs/nfs/client.c |   10 +++++-----
 1 files changed, 5 insertions(+), 5 deletions(-)
--- linux-2.6.17.i686/fs/nfs/client.c.orig	2006-09-20 04:46:42.000000000 -0400
+++ linux-2.6.17.i686/fs/nfs/client.c	2006-09-20 04:47:23.000000000 -0400
@@ -112,9 +112,9 @@ static struct nfs_client *nfs_alloc_clie
 	if (error < 0) {
 		dprintk("%s: couldn't start rpciod! Error = %d\n",
 				__FUNCTION__, error);
-		__set_bit(NFS_CS_RPCIOD, &clp->cl_res_state);
 		goto error_1;
 	}
+	__set_bit(NFS_CS_RPCIOD, &clp->cl_res_state);
 
 	if (nfsversion == 4) {
 		if (nfs_callback_up() < 0)
@@ -154,8 +154,8 @@ static struct nfs_client *nfs_alloc_clie
 	return clp;
 
 error_3:
-	nfs_callback_down();
-	__clear_bit(NFS_CS_CALLBACK, &clp->cl_res_state);
+	if (__test_and_clear_bit(NFS_CS_CALLBACK, &clp->cl_res_state))
+		nfs_callback_down();
 error_2:
 	rpciod_down();
 	__clear_bit(NFS_CS_RPCIOD, &clp->cl_res_state);
@@ -198,7 +198,7 @@ static void nfs_free_client(struct nfs_c
 		nfs_callback_down();
 
 	if (__test_and_clear_bit(NFS_CS_RPCIOD, &clp->cl_res_state))
-	rpciod_down();
+		rpciod_down();
 
 	kfree(clp->cl_hostname);
 	kfree(clp);
@@ -884,9 +884,9 @@ static int nfs4_init_client(struct nfs_c
 	if (error < 0) {
 		dprintk("%s: failed to create idmapper. Error = %d\n",
 			__FUNCTION__, error);
-		__set_bit(NFS_CS_IDMAP, &clp->cl_res_state);
 		goto error;
 	}
+	__set_bit(NFS_CS_IDMAP, &clp->cl_res_state);
 
 	nfs_mark_client_ready(clp, NFS_CS_READY);
 	return 0;