# HG changeset patch # User Bayard Bell # Date 1359585338 -3600 # Node ID c99b1993453c62cb2e48cb703681d3ec716c83ff # Parent 6b4f289e70942653a6af1e93e4794c1936916853 3325 nsmb_close locking and teardown deadlock Reviewed by: Albert Lee Reviewed by: Gordon Ross Reviewed by: Yakov Zaytsev Approved by: Richard Lowe diff -r 6b4f289e7094 -r c99b1993453c usr/src/uts/common/fs/smbclnt/netsmb/smb_dev.c --- 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); diff -r 6b4f289e7094 -r c99b1993453c usr/src/uts/common/fs/smbclnt/netsmb/smb_smb.c --- 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);