diff options
author | rwatson <rwatson@FreeBSD.org> | 2008-11-02 20:22:24 +0000 |
---|---|---|
committer | rwatson <rwatson@FreeBSD.org> | 2008-11-02 20:22:24 +0000 |
commit | 8287eede8234a2d0bde06e0ca1635c406e0cd6a9 (patch) | |
tree | 2042fcdb1ae11e45db86a371fb69f95e1e5a17bd /sys/netsmb | |
parent | b563afb1641962b2b7aed20467423c4338d37ff9 (diff) | |
download | FreeBSD-src-8287eede8234a2d0bde06e0ca1635c406e0cd6a9.zip FreeBSD-src-8287eede8234a2d0bde06e0ca1635c406e0cd6a9.tar.gz |
smb_vc_put() requires that the passed vcp be locked, so lock it before
dropping the connection when the requested service isn't available, or
we may try to release a lock that isn't locked.
This prevents an assertion failure when trying to mount a non-present
share using smbfs with INVARIANTS; a lock order reversal warning that
immediately follows is not yet fixed.
Reported by: attilio
MFC after: 3 days
Diffstat (limited to 'sys/netsmb')
-rw-r--r-- | sys/netsmb/smb_conn.c | 4 |
1 files changed, 3 insertions, 1 deletions
diff --git a/sys/netsmb/smb_conn.c b/sys/netsmb/smb_conn.c index 82f6382..3480181 100644 --- a/sys/netsmb/smb_conn.c +++ b/sys/netsmb/smb_conn.c @@ -218,8 +218,10 @@ out: smb_sm_unlockvclist(td); if (error == 0) *vcpp = vcp; - else if (vcp) + else if (vcp) { + smb_vc_lock(vcp, LK_EXCLUSIVE, scred->scr_td); smb_vc_put(vcp, scred); + } return error; } |