changeset 13938:c99b1993453c

3325 nsmb_close locking and teardown deadlock Reviewed by: Albert Lee <trisk@nexenta.com> Reviewed by: Gordon Ross <gwr@nexenta.com> Reviewed by: Yakov Zaytsev <yakov@nexenta.com> Approved by: Richard Lowe <richlowe@richlowe.net>
author Bayard Bell <bayard.bell@nexenta.com>
date Wed, 30 Jan 2013 23:35:38 +0100
parents 6b4f289e7094
children 20e4d8d8da6d
files usr/src/uts/common/fs/smbclnt/netsmb/smb_dev.c usr/src/uts/common/fs/smbclnt/netsmb/smb_smb.c
diffstat 2 files changed, 7 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/usr/src/uts/common/fs/smbclnt/netsmb/smb_dev.c	Wed Jan 30 15:02:58 2013 -0800
+++ b/usr/src/uts/common/fs/smbclnt/netsmb/smb_dev.c	Wed Jan 30 23:35:38 2013 +0100
@@ -31,7 +31,7 @@
  */
 
 /*
- * Copyright 2011 Nexenta Systems, Inc.  All rights reserved.
+ * Copyright 2012 Nexenta Systems, Inc.  All rights reserved.
  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
@@ -491,7 +491,6 @@
 	smb_dev_t *sdp;
 	int err;
 
-	mutex_enter(&dev_lck);
 	/*
 	 * 1. Check the validity of the minor number.
 	 * 2. Release any shares/vc associated  with the connection.
@@ -508,6 +507,7 @@
 	/*
 	 * Free the instance
 	 */
+	mutex_enter(&dev_lck);
 	ddi_soft_state_free(statep, inst);
 	mutex_exit(&dev_lck);
 	return (err);
--- a/usr/src/uts/common/fs/smbclnt/netsmb/smb_smb.c	Wed Jan 30 15:02:58 2013 -0800
+++ b/usr/src/uts/common/fs/smbclnt/netsmb/smb_smb.c	Wed Jan 30 23:35:38 2013 +0100
@@ -33,7 +33,7 @@
  */
 
 /*
- * Copyright 2011 Nexenta Systems, Inc.  All rights reserved.
+ * Copyright 2012 Nexenta Systems, Inc.  All rights reserved.
  * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
  */
 
@@ -500,8 +500,8 @@
 	smb_rq_bstart(rqp);
 	smb_rq_bend(rqp);
 
-	/* Make sure we send it... */
-	rqp->sr_flags |= SMBR_NOINTR_SEND;
+	/* Make sure we send, but only if already connected */
+	rqp->sr_flags |= (SMBR_NOINTR_SEND | SMBR_NORECONNECT);
 	error = smb_rq_simple(rqp);
 	smb_rq_done(rqp);
 	return (error);
@@ -593,8 +593,8 @@
 	smb_rq_bstart(rqp);
 	smb_rq_bend(rqp);
 
-	/* Make sure we send it... */
-	rqp->sr_flags |= SMBR_NOINTR_SEND;
+	/* Make sure we send but only if already connected */
+	rqp->sr_flags |= (SMBR_NOINTR_SEND | SMBR_NORECONNECT);
 	error = smb_rq_simple(rqp);
 	smb_rq_done(rqp);
 	return (error);