From: Peng Tao Date: Wed, 29 May 2013 13:40:56 +0000 (+0800) Subject: staging/lustre: fix LBUG and inode refcount bug X-Git-Url: http://git.cdn.openwrt.org/?a=commitdiff_plain;h=1e4db2b325bc0fa6517ae6081b9284a207b9a688;p=openwrt%2Fstaging%2Fblogic.git staging/lustre: fix LBUG and inode refcount bug 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 Signed-off-by: Andreas Dilger Signed-off-by: Greg Kroah-Hartman --- diff --git a/drivers/staging/lustre/lustre/ldlm/ldlm_resource.c b/drivers/staging/lustre/lustre/ldlm/ldlm_resource.c index f4d5b50b46ae..9052dc5e7ad2 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 4a018167cb03..6f1f047d6555 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; }