4bff34e37def8a90f9194d81bc345c52ba20086athurlow * Copyright (c) 2000-2001 Boris Popov
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * All rights reserved.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * Redistribution and use in source and binary forms, with or without
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * modification, are permitted provided that the following conditions
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * 1. Redistributions of source code must retain the above copyright
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * notice, this list of conditions and the following disclaimer.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * 2. Redistributions in binary form must reproduce the above copyright
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * notice, this list of conditions and the following disclaimer in the
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * documentation and/or other materials provided with the distribution.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * 3. All advertising materials mentioning features or use of this software
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * must display the following acknowledgement:
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * This product includes software developed by Boris Popov.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * 4. Neither the name of the author nor the names of any co-contributors
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * may be used to endorse or promote products derived from this software
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * without specific prior written permission.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * SUCH DAMAGE.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * $Id: smb_iod.c,v 1.32 2005/02/12 00:17:09 lindak Exp $
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
42645588b93573e79aaead58bdaf7857c3736401Gordon Ross * Use is subject to license terms.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * No locks should be necessary, because smbfs
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * can't unload until all the mounts are gone.
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross /* smbfs_dead() */
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross * State changes are important and infrequent.
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross * Make them easily observable via dtrace.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow/* Lock Held version of the next function. */
4bff34e37def8a90f9194d81bc345c52ba20086athurlowstatic inline void
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * Invalidate all outstanding requests for this connection
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross * Called by smb_vc_rele, smb_vc_kill, and by the driver
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross * close entry point if the IOD closes its dev handle.
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross * Forcibly kill the connection and IOD.
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross * Inform everyone of the state change.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * Let's be safe here and avoid doing any
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * call across the network while trying to
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * shut things down. If we just disconnect,
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * the server will take care of the logoff.
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross * If we have an IOD, it should immediately notice
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross * that its connection has closed. But in case
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross * it doesn't, let's also send it a signal.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * Send one request.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * Called by _addrq (for internal requests)
9c9af2590af49bb395bc8d2eace0f2d4ea16d165Gordon Ross * and _sendall (via _addrq, _multirq, _waitrq)
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross * Note: Anything special for SMBR_INTERNAL here?
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross * On the first send, set the MID and (maybe)
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross * the signing sequence numbers. The increments
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross * here are serialized by vc_sendlock
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross if (rqp->sr_rqflags2 & SMB_FLAGS2_SECURITY_SIGNATURE) {
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross * We're signing requests and verifying
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross * signatures on responses. Set the
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross * sequence numbers of the request and
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross * response here, used in smb_rq_verify.
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross /* Fill in UID, TID, MID, etc. */
9c9af2590af49bb395bc8d2eace0f2d4ea16d165Gordon Ross * Sign the message now that we're finally done
9c9af2590af49bb395bc8d2eace0f2d4ea16d165Gordon Ross * filling in the SMB header fields, etc.
9c9af2590af49bb395bc8d2eace0f2d4ea16d165Gordon Ross if (rqp->sr_rqflags2 & SMB_FLAGS2_SECURITY_SIGNATURE) {
4bff34e37def8a90f9194d81bc345c52ba20086athurlow if (rqp->sr_sendcnt++ >= 60/SMBSBTIMO) { /* one minute */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow smb_iod_rqprocessed(rqp, rqp->sr_lerror, SMBR_RESTART);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * If all attempts to send a request failed, then
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * something is seriously hosed.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * Replaced m_copym() with Solaris copymsg() which does the same
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * work when we want to do a M_COPYALL.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * m = m_copym(rqp->sr_rq.mb_top, 0, M_COPYALL, 0);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow SMBIODEBUG("M:%04x, P:%04x, U:%04x, T:%04x\n", rqp->sr_mid, 0, 0, 0);
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross m = 0; /* consumed by SEND */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow if (error == 0) {
4bff34e37def8a90f9194d81bc345c52ba20086athurlow return (0);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * Check for fatal errors
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * No further attempts should be made
4bff34e37def8a90f9194d81bc345c52ba20086athurlow SMBSDEBUG("TRAN_SEND returned fatal error %d\n", error);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow SMBSDEBUG("TRAN_SEND returned non-fatal error %d\n", error);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow /* If proc waiting on rqp was signaled... */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow return (0);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow if (m == NULL) {
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * Check the SMB header
4bff34e37def8a90f9194d81bc345c52ba20086athurlow return (0);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * Process incoming packets
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * This is the "reader" loop, run by the IOD thread
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * while in state SMBIOD_ST_VCACTIVE. The loop now
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * simply blocks in the socket recv until either a
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * message arrives, or a disconnect.
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross * Any non-zero error means the IOD should terminate.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow int etime_count = 0; /* for "server not responding", etc. */
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross * Check whether someone "killed" this VC,
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross * or is asking the IOD to terminate.
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross /* This IOD thread will terminate. */
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross * Nothing received for 15 seconds and
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross * we have requests in the queue.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * Once, at 15 sec. notify callbacks
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * and print the warning message.
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross /* Was: smb_iod_notify_down(vcp); */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow "SMB server %s not responding\n",
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * At 30 sec. try sending an echo, and then
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross * once a minute thereafter.
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross } /* ETIME && requests in queue */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * If the IOD thread holds the last reference
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross * to this VC, let the IOD thread terminate.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow } /* error == ETIME */
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross * The recv. above returned some error
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross * we can't continue from i.e. ENOTCONN.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * It's dangerous to continue here.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * (possible infinite loop!)
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross * If we have requests enqueued, next
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross * state is reconnecting, else idle.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * Received something. Yea!
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross /* Was: smb_iod_notify_up(vcp); */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * Have an SMB packet. The SMB header was
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * checked in smb_iod_recv1().
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * Find the request...
4bff34e37def8a90f9194d81bc345c52ba20086athurlow/* smb_printrqlist(vcp); */
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross * The IOD receiver thread has requests pending and
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross * has not received anything in a while. Try to
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross * send an SMB echo request. It's tricky to do a
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross * send from the IOD thread because we can't block.
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross * Using tmo=SMBNOREPLYWAIT in the request
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross * so smb_rq_reply will skip smb_iod_waitrq.
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross * The smb_smb_echo call uses SMBR_INTERNAL
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross * to avoid calling smb_iod_sendall().
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross err = smb_smb_echo(vcp, &scred, SMBNOREPLYWAIT);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * The IOD thread is now just a "reader",
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * so no more smb_iod_request(). Yea!
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * Place request in the queue, and send it now if possible.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * Called with no locks held.
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross * State should be correct after the check in
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross * smb_rq_enqueue(), but we dropped locks...
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross * Requests from the IOD itself are marked _INTERNAL,
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross * and get some special treatment to avoid blocking
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross * the reader thread (so we don't deadlock).
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross * The request is not yet on the queue, so we can
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross * modify it's state here without locks.
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross * Only thing using this now is ECHO.
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross * This is a request from the IOD thread.
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross * Always send directly from this thread.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * Note lock order: iod_rqlist, vc_sendlock
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * Note: iod_sendrq expects vc_sendlock,
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * so take that here, but carefully:
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * Never block the IOD thread here.
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross /* Have vc_sendlock */
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross * In the non-error case, _removerq
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross * is done by either smb_rq_reply
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross * or smb_iod_waitrq.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow /* iod_rqlock/WRITER protects iod_newrq */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * Now send any requests that need to be sent,
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * including the one we just put on the list.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * Only the thread that found iod_newrq==0
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * needs to run the send loop.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow return (0);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * Mark an SMBR_MULTIPACKET request as
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * needing another send. Similar to the
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * "normal" part of smb_iod_addrq.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow /* Already on iod_rqlist, just reset state. */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow /* iod_rqlock/WRITER protects iod_newrq */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * Now send any requests that need to be sent,
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * including the one we just marked NOTSENT.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * Only the thread that found iod_newrq==0
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * needs to run the send loop.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow return (0);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * Make sure we have not already removed it.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * See sys/queue.h QUEUEDEBUG_TAILQ_POSTREMOVE
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * XXX: Don't like the constant 1 here...
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * Wait for a request to complete.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * For normal requests, we need to deal with
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * ioc_muxcnt dropping below vc_maxmux by
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * making arrangements to send more...
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * Make sure this is NOT the IOD thread,
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross * or the wait below will stop the reader.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * First, wait for the request to be sent. Normally the send
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * has already happened by the time we get here. However, if
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * we have more than maxmux entries in the request list, our
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * request may not be sent until other requests complete.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * The wait in this case is due to local I/O demands, so
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * we don't want the server response timeout to apply.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * If a request is allowed to interrupt this wait, then the
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * request is cancelled and never sent OTW. Some kinds of
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * requests should never be cancelled (i.e. close) and those
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * are marked SMBR_NOINTR_SEND so they either go eventually,
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * or a connection close will terminate them with ENOTCONN.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow if (rc == 0) {
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * The request has been sent. Now wait for the response,
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * with the timeout specified for this request.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * Compute all the deadlines now, so we effectively
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * start the timer(s) after the request is sent.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow if (smb_timo_notice && (smb_timo_notice < rqp->sr_timo))
d3d50737e566cade9a08d73d2af95105ac7cd960Rafael Vanoni tmo2 = ddi_get_lbolt() + SEC_TO_TICK(rqp->sr_timo);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * As above, we don't want to allow interrupt for some
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * requests like open, because we could miss a succesful
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * response and therefore "leak" a FID. Such requests
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * are marked SMBR_NOINTR_RECV to prevent that.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * If "slow server" warnings are enabled, wait first
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * for the "notice" timeout, and warn if expired.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow if (tr == 0) {
4bff34e37def8a90f9194d81bc345c52ba20086athurlow /* Want this to go ONLY to the user. */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow " to request %d after %d seconds..."
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * Keep waiting until tmo2 is expired.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow if (tr == 0) {
4bff34e37def8a90f9194d81bc345c52ba20086athurlow /* Want this to go ONLY to the user. */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow " to request %d after %d seconds..."
4bff34e37def8a90f9194d81bc345c52ba20086athurlow /* got wakeup */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * MULTIPACKET request must stay in the list.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * They may need additional responses.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * Some request has been completed.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * If we reached the mux limit,
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * re-run the send loop...
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * Shutdown all outstanding I/O requests on the specified share with
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * ENXIO; used when unmounting a share. (There shouldn't be any for a
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * non-forced unmount; if this is a forced unmount, we have to shutdown
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * the requests as part of the unmount process.)
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * Loop through the list of requests and shutdown the ones
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * that are for the specified share.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow if (rqp->sr_state != SMBRQ_NOTIFIED && rqp->sr_share == ssp)
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * Send all requests that need sending.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * Called from _addrq, _multirq, _waitrq
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * Clear "newrq" to make sure threads adding
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * new requests will run this function again.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * We only read iod_rqlist, so downgrade rwlock.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * This allows the IOD to handle responses while
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * some requesting thread may be blocked in send.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * Serialize to prevent multiple senders.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * Note lock order: iod_rqlock, vc_sendlock
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * Walk the list of requests and send when possible.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * We avoid having more than vc_maxmux requests
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * outstanding to the server by traversing only
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * vc_maxmux entries into this list. Simple!
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * If we have vc_maxmux requests outstanding,
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * arrange for _waitrq to call _sendall as
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * requests are completed.
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross * This is called by the one-and-only
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross * IOD thread for this VC.
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross * Get the network transport file pointer,
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross * and "loan" it to our transport module.
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross * In case of reconnect, tell any enqueued requests
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross * then can GO!
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross * The above cv_broadcast should be sufficient to
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross * get requests going again.
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross * If we have a callback function, run it.
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross * Was: smb_iod_notify_connected()
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * Run the "reader" loop.
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross * The reader loop returned, so we must have a
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross * new state. (disconnected or reconnecting)
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross * Notify shares of the disconnect.
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross * Was: smb_iod_notify_disconnect()
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross smb_vc_walkshares(vcp, smb_iod_share_disconnected);
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross * The reader loop function returns only when
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross * there's been an error on the connection, or
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross * this VC has no more references. It also
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross * updates the state before it returns.
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross * Tell any requests to give up or restart.
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross /* Recall the file descriptor loan. */
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross * Wait around for someone to ask to use this VC.
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross * If the VC has only the IOD reference, then
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross * wait only a minute or so, then drop it.
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross * This is called by the one-and-only
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross * IOD thread for this VC.
d3d50737e566cade9a08d73d2af95105ac7cd960Rafael Vanoni tr = cv_reltimedwait_sig(&vcp->iod_idle, &vcp->vc_lock,
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross /* timeout */
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross /* Let this IOD terminate. */
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross /* nobody to cv_broadcast */
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross * After a failed reconnect attempt, smbiod will
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross * call this to make current requests error out.
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross * This is called by the one-and-only
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross * IOD thread for this VC.
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross * Short wait here for two reasons:
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross * (1) Give requests a chance to error out.
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross * (2) Prevent immediate retry.
d3d50737e566cade9a08d73d2af95105ac7cd960Rafael Vanoni tr = cv_reltimedwait_sig(&vcp->iod_idle, &vcp->vc_lock,
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross * Ask the IOD to reconnect (if not already underway)
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross * then wait for the reconnect to finish.
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross /* FALLTHROUGH */