[PATCH 3/4] staging/lustre: fix LBUG and inode refcount bug

Peng Tao bergwolf at gmail.com
Wed May 29 13:40:56 UTC 2013


ldlm_proc_setup and ldlm_proc_cleanup should reset global
pde pointers otherwise remount may hit
LASSERT(ldlm_ns_proc_dir == NULL);

Also in libcfs_sock_ioctl, fput() includes itself sock_release.
So don't call sock_release twice otherwise kernel may oops
due to incorrect inode ref counting.

Signed-off-by: Peng Tao <tao.peng at emc.com>
Signed-off-by: Andreas Dilger <andreas.dilger at intel.com>
---
 drivers/staging/lustre/lustre/ldlm/ldlm_resource.c |    6 ++++++
 .../lustre/lustre/libcfs/linux/linux-tcpip.c       |    9 ++-------
 2 files changed, 8 insertions(+), 7 deletions(-)

diff --git a/drivers/staging/lustre/lustre/ldlm/ldlm_resource.c b/drivers/staging/lustre/lustre/ldlm/ldlm_resource.c
index f4d5b50..9052dc5 100644
--- a/drivers/staging/lustre/lustre/ldlm/ldlm_resource.c
+++ b/drivers/staging/lustre/lustre/ldlm/ldlm_resource.c
@@ -130,6 +130,8 @@ err_type:
 	lprocfs_remove(&ldlm_type_proc_dir);
 err:
 	ldlm_svc_proc_dir = NULL;
+	ldlm_type_proc_dir = NULL;
+	ldlm_ns_proc_dir = NULL;
 	RETURN(rc);
 }
 
@@ -143,6 +145,10 @@ void ldlm_proc_cleanup(void)
 
 	if (ldlm_type_proc_dir)
 		lprocfs_remove(&ldlm_type_proc_dir);
+
+	ldlm_svc_proc_dir = NULL;
+	ldlm_type_proc_dir = NULL;
+	ldlm_ns_proc_dir = NULL;
 }
 
 static int lprocfs_ns_resources_seq_show(struct seq_file *m, void *v)
diff --git a/drivers/staging/lustre/lustre/libcfs/linux/linux-tcpip.c b/drivers/staging/lustre/lustre/libcfs/linux/linux-tcpip.c
index 4a01816..6f1f047 100644
--- a/drivers/staging/lustre/lustre/libcfs/linux/linux-tcpip.c
+++ b/drivers/staging/lustre/lustre/libcfs/linux/linux-tcpip.c
@@ -49,7 +49,6 @@ libcfs_sock_ioctl(int cmd, unsigned long arg)
 {
 	mm_segment_t    oldmm = get_fs();
 	struct socket  *sock;
-	int	     fd = -1;
 	int	     rc;
 	struct file    *sock_filp;
 
@@ -61,6 +60,7 @@ libcfs_sock_ioctl(int cmd, unsigned long arg)
 
 	sock_filp = sock_alloc_file(sock, 0, NULL);
 	if (!sock_filp) {
+		sock_release(sock);
 		rc = -ENOMEM;
 		goto out;
 	}
@@ -71,12 +71,7 @@ libcfs_sock_ioctl(int cmd, unsigned long arg)
 	set_fs(oldmm);
 
 	fput(sock_filp);
-
- out:
-	if (fd >= 0)
-		sys_close(fd);
-	else
-		sock_release(sock);
+out:
 	return rc;
 }
 
-- 
1.7.9.5




More information about the devel mailing list