File Index
Files and directories
Sign in
FILE

transport.c

File preview with syntax highlighting.

linux-6.19.14/fs/smb/client/transport.c C
   1// SPDX-License-Identifier: LGPL-2.1
   2/*
   3 *
   4 *   Copyright (C) International Business Machines  Corp., 2002,2008
   5 *   Author(s): Steve French (sfrench@us.ibm.com)
   6 *   Jeremy Allison (jra@samba.org) 2006.
   7 *
   8 */
   9
  10#include <linux/fs.h>
  11#include <linux/list.h>
  12#include <linux/gfp.h>
  13#include <linux/wait.h>
  14#include <linux/net.h>
  15#include <linux/delay.h>
  16#include <linux/freezer.h>
  17#include <linux/tcp.h>
  18#include <linux/bvec.h>
  19#include <linux/highmem.h>
  20#include <linux/uaccess.h>
  21#include <linux/processor.h>
  22#include <linux/mempool.h>
  23#include <linux/sched/signal.h>
  24#include <linux/task_io_accounting_ops.h>
  25#include <linux/task_work.h>
  26#include "cifspdu.h"
  27#include "cifsglob.h"
  28#include "cifsproto.h"
  29#include "cifs_debug.h"
  30#include "smb2proto.h"
  31#include "smbdirect.h"
  32#include "compress.h"
  33
  34void
  35cifs_wake_up_task(struct TCP_Server_Info *server, struct mid_q_entry *mid)
  36{
  37	if (mid->mid_state == MID_RESPONSE_RECEIVED)
  38		mid->mid_state = MID_RESPONSE_READY;
  39	wake_up_process(mid->callback_data);
  40}
  41
  42void __release_mid(struct TCP_Server_Info *server, struct mid_q_entry *midEntry)
  43{
  44#ifdef CONFIG_CIFS_STATS2
  45	__le16 command = server->vals->lock_cmd;
  46	__u16 smb_cmd = le16_to_cpu(midEntry->command);
  47	unsigned long now;
  48	unsigned long roundtrip_time;
  49#endif
  50
  51	if (midEntry->resp_buf && (midEntry->wait_cancelled) &&
  52	    (midEntry->mid_state == MID_RESPONSE_RECEIVED ||
  53	     midEntry->mid_state == MID_RESPONSE_READY) &&
  54	    server->ops->handle_cancelled_mid)
  55		server->ops->handle_cancelled_mid(midEntry, server);
  56
  57	midEntry->mid_state = MID_FREE;
  58	atomic_dec(&mid_count);
  59	if (midEntry->large_buf)
  60		cifs_buf_release(midEntry->resp_buf);
  61	else
  62		cifs_small_buf_release(midEntry->resp_buf);
  63#ifdef CONFIG_CIFS_STATS2
  64	now = jiffies;
  65	if (now < midEntry->when_alloc)
  66		cifs_server_dbg(VFS, "Invalid mid allocation time\n");
  67	roundtrip_time = now - midEntry->when_alloc;
  68
  69	if (smb_cmd < NUMBER_OF_SMB2_COMMANDS) {
  70		if (atomic_read(&server->num_cmds[smb_cmd]) == 0) {
  71			server->slowest_cmd[smb_cmd] = roundtrip_time;
  72			server->fastest_cmd[smb_cmd] = roundtrip_time;
  73		} else {
  74			if (server->slowest_cmd[smb_cmd] < roundtrip_time)
  75				server->slowest_cmd[smb_cmd] = roundtrip_time;
  76			else if (server->fastest_cmd[smb_cmd] > roundtrip_time)
  77				server->fastest_cmd[smb_cmd] = roundtrip_time;
  78		}
  79		cifs_stats_inc(&server->num_cmds[smb_cmd]);
  80		server->time_per_cmd[smb_cmd] += roundtrip_time;
  81	}
  82	/*
  83	 * commands taking longer than one second (default) can be indications
  84	 * that something is wrong, unless it is quite a slow link or a very
  85	 * busy server. Note that this calc is unlikely or impossible to wrap
  86	 * as long as slow_rsp_threshold is not set way above recommended max
  87	 * value (32767 ie 9 hours) and is generally harmless even if wrong
  88	 * since only affects debug counters - so leaving the calc as simple
  89	 * comparison rather than doing multiple conversions and overflow
  90	 * checks
  91	 */
  92	if ((slow_rsp_threshold != 0) &&
  93	    time_after(now, midEntry->when_alloc + (slow_rsp_threshold * HZ)) &&
  94	    (midEntry->command != command)) {
  95		/*
  96		 * smb2slowcmd[NUMBER_OF_SMB2_COMMANDS] counts by command
  97		 * NB: le16_to_cpu returns unsigned so can not be negative below
  98		 */
  99		if (smb_cmd < NUMBER_OF_SMB2_COMMANDS)
 100			cifs_stats_inc(&server->smb2slowcmd[smb_cmd]);
 101
 102		trace_smb3_slow_rsp(smb_cmd, midEntry->mid, midEntry->pid,
 103			       midEntry->when_sent, midEntry->when_received);
 104		if (cifsFYI & CIFS_TIMER) {
 105			pr_debug("slow rsp: cmd %d mid %llu",
 106				 midEntry->command, midEntry->mid);
 107			cifs_info("A: 0x%lx S: 0x%lx R: 0x%lx\n",
 108				  now - midEntry->when_alloc,
 109				  now - midEntry->when_sent,
 110				  now - midEntry->when_received);
 111		}
 112	}
 113#endif
 114	put_task_struct(midEntry->creator);
 115
 116	mempool_free(midEntry, &cifs_mid_pool);
 117}
 118
 119void
 120delete_mid(struct TCP_Server_Info *server, struct mid_q_entry *mid)
 121{
 122	spin_lock(&server->mid_queue_lock);
 123
 124	if (!mid->deleted_from_q) {
 125		list_del_init(&mid->qhead);
 126		mid->deleted_from_q = true;
 127	}
 128	spin_unlock(&server->mid_queue_lock);
 129
 130	release_mid(server, mid);
 131}
 132
 133/*
 134 * smb_send_kvec - send an array of kvecs to the server
 135 * @server:	Server to send the data to
 136 * @smb_msg:	Message to send
 137 * @sent:	amount of data sent on socket is stored here
 138 *
 139 * Our basic "send data to server" function. Should be called with srv_mutex
 140 * held. The caller is responsible for handling the results.
 141 */
 142int
 143smb_send_kvec(struct TCP_Server_Info *server, struct msghdr *smb_msg,
 144	      size_t *sent)
 145{
 146	int rc = 0;
 147	int retries = 0;
 148	struct socket *ssocket = server->ssocket;
 149
 150	*sent = 0;
 151
 152	if (server->noblocksnd)
 153		smb_msg->msg_flags = MSG_DONTWAIT + MSG_NOSIGNAL;
 154	else
 155		smb_msg->msg_flags = MSG_NOSIGNAL;
 156
 157	while (msg_data_left(smb_msg)) {
 158		/*
 159		 * If blocking send, we try 3 times, since each can block
 160		 * for 5 seconds. For nonblocking  we have to try more
 161		 * but wait increasing amounts of time allowing time for
 162		 * socket to clear.  The overall time we wait in either
 163		 * case to send on the socket is about 15 seconds.
 164		 * Similarly we wait for 15 seconds for a response from
 165		 * the server in SendReceive[2] for the server to send
 166		 * a response back for most types of requests (except
 167		 * SMB Write past end of file which can be slow, and
 168		 * blocking lock operations). NFS waits slightly longer
 169		 * than CIFS, but this can make it take longer for
 170		 * nonresponsive servers to be detected and 15 seconds
 171		 * is more than enough time for modern networks to
 172		 * send a packet.  In most cases if we fail to send
 173		 * after the retries we will kill the socket and
 174		 * reconnect which may clear the network problem.
 175		 *
 176		 * Even if regular signals are masked, EINTR might be
 177		 * propagated from sk_stream_wait_memory() to here when
 178		 * TIF_NOTIFY_SIGNAL is used for task work. For example,
 179		 * certain io_uring completions will use that. Treat
 180		 * having EINTR with pending task work the same as EAGAIN
 181		 * to avoid unnecessary reconnects.
 182		 */
 183		rc = sock_sendmsg(ssocket, smb_msg);
 184		if (rc == -EAGAIN || unlikely(rc == -EINTR && task_work_pending(current))) {
 185			retries++;
 186			if (retries >= 14 ||
 187			    (!server->noblocksnd && (retries > 2))) {
 188				cifs_server_dbg(VFS, "sends on sock %p stuck for 15 seconds\n",
 189					 ssocket);
 190				return -EAGAIN;
 191			}
 192			msleep(1 << retries);
 193			continue;
 194		}
 195
 196		if (rc < 0)
 197			return rc;
 198
 199		if (rc == 0) {
 200			/* should never happen, letting socket clear before
 201			   retrying is our only obvious option here */
 202			cifs_server_dbg(VFS, "tcp sent no data\n");
 203			msleep(500);
 204			continue;
 205		}
 206
 207		/* send was at least partially successful */
 208		*sent += rc;
 209		retries = 0; /* in case we get ENOSPC on the next send */
 210	}
 211	return 0;
 212}
 213
 214unsigned long
 215smb_rqst_len(struct TCP_Server_Info *server, struct smb_rqst *rqst)
 216{
 217	unsigned int i;
 218	struct kvec *iov;
 219	int nvec;
 220	unsigned long buflen = 0;
 221
 222	if (!is_smb1(server) && rqst->rq_nvec >= 2 &&
 223	    rqst->rq_iov[0].iov_len == 4) {
 224		iov = &rqst->rq_iov[1];
 225		nvec = rqst->rq_nvec - 1;
 226	} else {
 227		iov = rqst->rq_iov;
 228		nvec = rqst->rq_nvec;
 229	}
 230
 231	/* total up iov array first */
 232	for (i = 0; i < nvec; i++)
 233		buflen += iov[i].iov_len;
 234
 235	buflen += iov_iter_count(&rqst->rq_iter);
 236	return buflen;
 237}
 238
 239int __smb_send_rqst(struct TCP_Server_Info *server, int num_rqst,
 240		    struct smb_rqst *rqst)
 241{
 242	int rc;
 243	struct kvec *iov;
 244	int n_vec;
 245	unsigned int send_length = 0;
 246	unsigned int i, j;
 247	sigset_t mask, oldmask;
 248	size_t total_len = 0, sent, size;
 249	struct socket *ssocket = server->ssocket;
 250	struct msghdr smb_msg = {};
 251	__be32 rfc1002_marker;
 252
 253	cifs_in_send_inc(server);
 254	if (cifs_rdma_enabled(server)) {
 255		/* return -EAGAIN when connecting or reconnecting */
 256		rc = -EAGAIN;
 257		if (server->smbd_conn)
 258			rc = smbd_send(server, num_rqst, rqst);
 259		goto smbd_done;
 260	}
 261
 262	rc = -EAGAIN;
 263	if (ssocket == NULL)
 264		goto out;
 265
 266	rc = -ERESTARTSYS;
 267	if (fatal_signal_pending(current)) {
 268		cifs_dbg(FYI, "signal pending before send request\n");
 269		goto out;
 270	}
 271
 272	rc = 0;
 273	/* cork the socket */
 274	tcp_sock_set_cork(ssocket->sk, true);
 275
 276	for (j = 0; j < num_rqst; j++)
 277		send_length += smb_rqst_len(server, &rqst[j]);
 278	rfc1002_marker = cpu_to_be32(send_length);
 279
 280	/*
 281	 * We should not allow signals to interrupt the network send because
 282	 * any partial send will cause session reconnects thus increasing
 283	 * latency of system calls and overload a server with unnecessary
 284	 * requests.
 285	 */
 286
 287	sigfillset(&mask);
 288	sigprocmask(SIG_BLOCK, &mask, &oldmask);
 289
 290	/* Generate a rfc1002 marker */
 291	{
 292		struct kvec hiov = {
 293			.iov_base = &rfc1002_marker,
 294			.iov_len  = 4
 295		};
 296		iov_iter_kvec(&smb_msg.msg_iter, ITER_SOURCE, &hiov, 1, 4);
 297		rc = smb_send_kvec(server, &smb_msg, &sent);
 298		if (rc < 0)
 299			goto unmask;
 300
 301		total_len += sent;
 302		send_length += 4;
 303	}
 304
 305	cifs_dbg(FYI, "Sending smb: smb_len=%u\n", send_length);
 306
 307	for (j = 0; j < num_rqst; j++) {
 308		iov = rqst[j].rq_iov;
 309		n_vec = rqst[j].rq_nvec;
 310
 311		size = 0;
 312		for (i = 0; i < n_vec; i++) {
 313			dump_smb(iov[i].iov_base, iov[i].iov_len);
 314			size += iov[i].iov_len;
 315		}
 316
 317		iov_iter_kvec(&smb_msg.msg_iter, ITER_SOURCE, iov, n_vec, size);
 318
 319		rc = smb_send_kvec(server, &smb_msg, &sent);
 320		if (rc < 0)
 321			goto unmask;
 322
 323		total_len += sent;
 324
 325		if (iov_iter_count(&rqst[j].rq_iter) > 0) {
 326			smb_msg.msg_iter = rqst[j].rq_iter;
 327			rc = smb_send_kvec(server, &smb_msg, &sent);
 328			if (rc < 0)
 329				break;
 330			total_len += sent;
 331		}
 332	}
 333
 334unmask:
 335	sigprocmask(SIG_SETMASK, &oldmask, NULL);
 336
 337	/*
 338	 * If signal is pending but we have already sent the whole packet to
 339	 * the server we need to return success status to allow a corresponding
 340	 * mid entry to be kept in the pending requests queue thus allowing
 341	 * to handle responses from the server by the client.
 342	 *
 343	 * If only part of the packet has been sent there is no need to hide
 344	 * interrupt because the session will be reconnected anyway, so there
 345	 * won't be any response from the server to handle.
 346	 */
 347
 348	if (signal_pending(current) && (total_len != send_length)) {
 349		cifs_dbg(FYI, "signal is pending after attempt to send\n");
 350		rc = -ERESTARTSYS;
 351	}
 352
 353	/* uncork it */
 354	tcp_sock_set_cork(ssocket->sk, false);
 355
 356	if ((total_len > 0) && (total_len != send_length)) {
 357		cifs_dbg(FYI, "partial send (wanted=%u sent=%zu): terminating session\n",
 358			 send_length, total_len);
 359		/*
 360		 * If we have only sent part of an SMB then the next SMB could
 361		 * be taken as the remainder of this one. We need to kill the
 362		 * socket so the server throws away the partial SMB
 363		 */
 364		cifs_signal_cifsd_for_reconnect(server, false);
 365		trace_smb3_partial_send_reconnect(server->current_mid,
 366						  server->conn_id, server->hostname);
 367	}
 368smbd_done:
 369	/*
 370	 * there's hardly any use for the layers above to know the
 371	 * actual error code here. All they should do at this point is
 372	 * to retry the connection and hope it goes away.
 373	 */
 374	if (rc < 0 && rc != -EINTR && rc != -EAGAIN) {
 375		cifs_server_dbg(VFS, "Error %d sending data on socket to server\n",
 376			 rc);
 377		rc = -ECONNABORTED;
 378		cifs_signal_cifsd_for_reconnect(server, false);
 379	} else if (rc > 0)
 380		rc = 0;
 381out:
 382	cifs_in_send_dec(server);
 383	return rc;
 384}
 385
 386static int
 387smb_send_rqst(struct TCP_Server_Info *server, int num_rqst,
 388	      struct smb_rqst *rqst, int flags)
 389{
 390	struct smb2_transform_hdr tr_hdr;
 391	struct smb_rqst new_rqst[MAX_COMPOUND] = {};
 392	struct kvec iov = {
 393		.iov_base = &tr_hdr,
 394		.iov_len = sizeof(tr_hdr),
 395	};
 396	int rc;
 397
 398	if (flags & CIFS_COMPRESS_REQ)
 399		return smb_compress(server, &rqst[0], __smb_send_rqst);
 400
 401	if (!(flags & CIFS_TRANSFORM_REQ))
 402		return __smb_send_rqst(server, num_rqst, rqst);
 403
 404	if (WARN_ON_ONCE(num_rqst > MAX_COMPOUND - 1))
 405		return smb_EIO1(smb_eio_trace_tx_max_compound, num_rqst);
 406
 407	if (!server->ops->init_transform_rq) {
 408		cifs_server_dbg(VFS, "Encryption requested but transform callback is missing\n");
 409		return smb_EIO(smb_eio_trace_tx_need_transform);
 410	}
 411
 412	new_rqst[0].rq_iov = &iov;
 413	new_rqst[0].rq_nvec = 1;
 414
 415	rc = server->ops->init_transform_rq(server, num_rqst + 1,
 416					    new_rqst, rqst);
 417	if (!rc) {
 418		rc = __smb_send_rqst(server, num_rqst + 1, new_rqst);
 419		smb3_free_compound_rqst(num_rqst, &new_rqst[1]);
 420	}
 421	return rc;
 422}
 423
 424static int
 425wait_for_free_credits(struct TCP_Server_Info *server, const int num_credits,
 426		      const int timeout, const int flags,
 427		      unsigned int *instance)
 428{
 429	long rc;
 430	int *credits;
 431	int optype;
 432	long int t;
 433	int scredits, in_flight;
 434
 435	if (timeout < 0)
 436		t = MAX_JIFFY_OFFSET;
 437	else
 438		t = msecs_to_jiffies(timeout);
 439
 440	optype = flags & CIFS_OP_MASK;
 441
 442	*instance = 0;
 443
 444	credits = server->ops->get_credits_field(server, optype);
 445	/* Since an echo is already inflight, no need to wait to send another */
 446	if (*credits <= 0 && optype == CIFS_ECHO_OP)
 447		return -EAGAIN;
 448
 449	spin_lock(&server->req_lock);
 450	if ((flags & CIFS_TIMEOUT_MASK) == CIFS_NON_BLOCKING) {
 451		/* oplock breaks must not be held up */
 452		server->in_flight++;
 453		if (server->in_flight > server->max_in_flight)
 454			server->max_in_flight = server->in_flight;
 455		*credits -= 1;
 456		*instance = server->reconnect_instance;
 457		scredits = *credits;
 458		in_flight = server->in_flight;
 459		spin_unlock(&server->req_lock);
 460
 461		trace_smb3_nblk_credits(server->current_mid,
 462				server->conn_id, server->hostname, scredits, -1, in_flight);
 463		cifs_dbg(FYI, "%s: remove %u credits total=%d\n",
 464				__func__, 1, scredits);
 465
 466		return 0;
 467	}
 468
 469	while (1) {
 470		spin_unlock(&server->req_lock);
 471
 472		spin_lock(&server->srv_lock);
 473		if (server->tcpStatus == CifsExiting) {
 474			spin_unlock(&server->srv_lock);
 475			return -ENOENT;
 476		}
 477		spin_unlock(&server->srv_lock);
 478
 479		spin_lock(&server->req_lock);
 480		if (*credits < num_credits) {
 481			scredits = *credits;
 482			spin_unlock(&server->req_lock);
 483
 484			cifs_num_waiters_inc(server);
 485			rc = wait_event_killable_timeout(server->request_q,
 486				has_credits(server, credits, num_credits), t);
 487			cifs_num_waiters_dec(server);
 488			if (!rc) {
 489				spin_lock(&server->req_lock);
 490				scredits = *credits;
 491				in_flight = server->in_flight;
 492				spin_unlock(&server->req_lock);
 493
 494				trace_smb3_credit_timeout(server->current_mid,
 495						server->conn_id, server->hostname, scredits,
 496						num_credits, in_flight);
 497				cifs_server_dbg(VFS, "wait timed out after %d ms\n",
 498						timeout);
 499				return -EBUSY;
 500			}
 501			if (rc == -ERESTARTSYS)
 502				return -ERESTARTSYS;
 503			spin_lock(&server->req_lock);
 504		} else {
 505			/*
 506			 * For normal commands, reserve the last MAX_COMPOUND
 507			 * credits to compound requests.
 508			 * Otherwise these compounds could be permanently
 509			 * starved for credits by single-credit requests.
 510			 *
 511			 * To prevent spinning CPU, block this thread until
 512			 * there are >MAX_COMPOUND credits available.
 513			 * But only do this is we already have a lot of
 514			 * credits in flight to avoid triggering this check
 515			 * for servers that are slow to hand out credits on
 516			 * new sessions.
 517			 */
 518			if (!optype && num_credits == 1 &&
 519			    server->in_flight > 2 * MAX_COMPOUND &&
 520			    *credits <= MAX_COMPOUND) {
 521				spin_unlock(&server->req_lock);
 522
 523				cifs_num_waiters_inc(server);
 524				rc = wait_event_killable_timeout(
 525					server->request_q,
 526					has_credits(server, credits,
 527						    MAX_COMPOUND + 1),
 528					t);
 529				cifs_num_waiters_dec(server);
 530				if (!rc) {
 531					spin_lock(&server->req_lock);
 532					scredits = *credits;
 533					in_flight = server->in_flight;
 534					spin_unlock(&server->req_lock);
 535
 536					trace_smb3_credit_timeout(
 537							server->current_mid,
 538							server->conn_id, server->hostname,
 539							scredits, num_credits, in_flight);
 540					cifs_server_dbg(VFS, "wait timed out after %d ms\n",
 541							timeout);
 542					return -EBUSY;
 543				}
 544				if (rc == -ERESTARTSYS)
 545					return -ERESTARTSYS;
 546				spin_lock(&server->req_lock);
 547				continue;
 548			}
 549
 550			/*
 551			 * Can not count locking commands against total
 552			 * as they are allowed to block on server.
 553			 */
 554
 555			/* update # of requests on the wire to server */
 556			if ((flags & CIFS_TIMEOUT_MASK) != CIFS_BLOCKING_OP) {
 557				*credits -= num_credits;
 558				server->in_flight += num_credits;
 559				if (server->in_flight > server->max_in_flight)
 560					server->max_in_flight = server->in_flight;
 561				*instance = server->reconnect_instance;
 562			}
 563			scredits = *credits;
 564			in_flight = server->in_flight;
 565			spin_unlock(&server->req_lock);
 566
 567			trace_smb3_waitff_credits(server->current_mid,
 568					server->conn_id, server->hostname, scredits,
 569					-(num_credits), in_flight);
 570			cifs_dbg(FYI, "%s: remove %u credits total=%d\n",
 571					__func__, num_credits, scredits);
 572			break;
 573		}
 574	}
 575	return 0;
 576}
 577
 578int wait_for_free_request(struct TCP_Server_Info *server, const int flags,
 579			  unsigned int *instance)
 580{
 581	return wait_for_free_credits(server, 1, -1, flags,
 582				     instance);
 583}
 584
 585static int
 586wait_for_compound_request(struct TCP_Server_Info *server, int num,
 587			  const int flags, unsigned int *instance)
 588{
 589	int *credits;
 590	int scredits, in_flight;
 591
 592	credits = server->ops->get_credits_field(server, flags & CIFS_OP_MASK);
 593
 594	spin_lock(&server->req_lock);
 595	scredits = *credits;
 596	in_flight = server->in_flight;
 597
 598	if (*credits < num) {
 599		/*
 600		 * If the server is tight on resources or just gives us less
 601		 * credits for other reasons (e.g. requests are coming out of
 602		 * order and the server delays granting more credits until it
 603		 * processes a missing mid) and we exhausted most available
 604		 * credits there may be situations when we try to send
 605		 * a compound request but we don't have enough credits. At this
 606		 * point the client needs to decide if it should wait for
 607		 * additional credits or fail the request. If at least one
 608		 * request is in flight there is a high probability that the
 609		 * server will return enough credits to satisfy this compound
 610		 * request.
 611		 *
 612		 * Return immediately if no requests in flight since we will be
 613		 * stuck on waiting for credits.
 614		 */
 615		if (server->in_flight == 0) {
 616			spin_unlock(&server->req_lock);
 617			trace_smb3_insufficient_credits(server->current_mid,
 618					server->conn_id, server->hostname, scredits,
 619					num, in_flight);
 620			cifs_dbg(FYI, "%s: %d requests in flight, needed %d total=%d\n",
 621					__func__, in_flight, num, scredits);
 622			return -EDEADLK;
 623		}
 624	}
 625	spin_unlock(&server->req_lock);
 626
 627	return wait_for_free_credits(server, num, 60000, flags,
 628				     instance);
 629}
 630
 631int
 632cifs_wait_mtu_credits(struct TCP_Server_Info *server, size_t size,
 633		      size_t *num, struct cifs_credits *credits)
 634{
 635	*num = size;
 636	credits->value = 0;
 637	credits->instance = server->reconnect_instance;
 638	return 0;
 639}
 640
 641int wait_for_response(struct TCP_Server_Info *server, struct mid_q_entry *mid)
 642{
 643	unsigned int sleep_state = TASK_KILLABLE;
 644	int error;
 645
 646	if (mid->sr_flags & CIFS_INTERRUPTIBLE_WAIT)
 647		sleep_state = TASK_INTERRUPTIBLE;
 648
 649	error = wait_event_state(server->response_q,
 650				 mid->mid_state != MID_REQUEST_SUBMITTED &&
 651				 mid->mid_state != MID_RESPONSE_RECEIVED,
 652				 (sleep_state | TASK_FREEZABLE_UNSAFE));
 653	if (error < 0)
 654		return -ERESTARTSYS;
 655
 656	return 0;
 657}
 658
 659/*
 660 * Send a SMB request and set the callback function in the mid to handle
 661 * the result. Caller is responsible for dealing with timeouts.
 662 */
 663int
 664cifs_call_async(struct TCP_Server_Info *server, struct smb_rqst *rqst,
 665		mid_receive_t receive, mid_callback_t callback,
 666		mid_handle_t handle, void *cbdata, const int flags,
 667		const struct cifs_credits *exist_credits)
 668{
 669	int rc;
 670	struct mid_q_entry *mid;
 671	struct cifs_credits credits = { .value = 0, .instance = 0 };
 672	unsigned int instance;
 673	int optype;
 674
 675	optype = flags & CIFS_OP_MASK;
 676
 677	if ((flags & CIFS_HAS_CREDITS) == 0) {
 678		rc = wait_for_free_request(server, flags, &instance);
 679		if (rc)
 680			return rc;
 681		credits.value = 1;
 682		credits.instance = instance;
 683	} else
 684		instance = exist_credits->instance;
 685
 686	cifs_server_lock(server);
 687
 688	/*
 689	 * We can't use credits obtained from the previous session to send this
 690	 * request. Check if there were reconnects after we obtained credits and
 691	 * return -EAGAIN in such cases to let callers handle it.
 692	 */
 693	if (instance != server->reconnect_instance) {
 694		cifs_server_unlock(server);
 695		add_credits_and_wake_if(server, &credits, optype);
 696		return -EAGAIN;
 697	}
 698
 699	mid = server->ops->setup_async_request(server, rqst);
 700	if (IS_ERR(mid)) {
 701		cifs_server_unlock(server);
 702		add_credits_and_wake_if(server, &credits, optype);
 703		return PTR_ERR(mid);
 704	}
 705
 706	mid->sr_flags = flags;
 707	mid->receive = receive;
 708	mid->callback = callback;
 709	mid->callback_data = cbdata;
 710	mid->handle = handle;
 711	mid->mid_state = MID_REQUEST_SUBMITTED;
 712
 713	/* put it on the pending_mid_q */
 714	spin_lock(&server->mid_queue_lock);
 715	list_add_tail(&mid->qhead, &server->pending_mid_q);
 716	spin_unlock(&server->mid_queue_lock);
 717
 718	/*
 719	 * Need to store the time in mid before calling I/O. For call_async,
 720	 * I/O response may come back and free the mid entry on another thread.
 721	 */
 722	cifs_save_when_sent(mid);
 723	rc = smb_send_rqst(server, 1, rqst, flags);
 724
 725	if (rc < 0) {
 726		revert_current_mid(server, mid->credits);
 727		server->sequence_number -= 2;
 728		delete_mid(server, mid);
 729	}
 730
 731	cifs_server_unlock(server);
 732
 733	if (rc == 0)
 734		return 0;
 735
 736	add_credits_and_wake_if(server, &credits, optype);
 737	return rc;
 738}
 739
 740int cifs_sync_mid_result(struct mid_q_entry *mid, struct TCP_Server_Info *server)
 741{
 742	int rc = 0;
 743
 744	cifs_dbg(FYI, "%s: cmd=%d mid=%llu state=%d\n",
 745		 __func__, le16_to_cpu(mid->command), mid->mid, mid->mid_state);
 746
 747	spin_lock(&server->mid_queue_lock);
 748	switch (mid->mid_state) {
 749	case MID_RESPONSE_READY:
 750		spin_unlock(&server->mid_queue_lock);
 751		return rc;
 752	case MID_RETRY_NEEDED:
 753		rc = -EAGAIN;
 754		break;
 755	case MID_RESPONSE_MALFORMED:
 756		rc = smb_EIO(smb_eio_trace_rx_sync_mid_malformed);
 757		break;
 758	case MID_SHUTDOWN:
 759		rc = -EHOSTDOWN;
 760		break;
 761	case MID_RC:
 762		rc = mid->mid_rc;
 763		break;
 764	default:
 765		if (mid->deleted_from_q == false) {
 766			list_del_init(&mid->qhead);
 767			mid->deleted_from_q = true;
 768		}
 769		spin_unlock(&server->mid_queue_lock);
 770		cifs_server_dbg(VFS, "%s: invalid mid state mid=%llu state=%d\n",
 771			 __func__, mid->mid, mid->mid_state);
 772		rc = smb_EIO1(smb_eio_trace_rx_sync_mid_invalid, mid->mid_state);
 773		goto sync_mid_done;
 774	}
 775	spin_unlock(&server->mid_queue_lock);
 776
 777sync_mid_done:
 778	release_mid(server, mid);
 779	return rc;
 780}
 781
 782static void
 783cifs_compound_callback(struct TCP_Server_Info *server, struct mid_q_entry *mid)
 784{
 785	struct cifs_credits credits = {
 786		.value = server->ops->get_credits(mid),
 787		.instance = server->reconnect_instance,
 788	};
 789
 790	add_credits(server, &credits, mid->optype);
 791
 792	if (mid->mid_state == MID_RESPONSE_RECEIVED)
 793		mid->mid_state = MID_RESPONSE_READY;
 794}
 795
 796static void
 797cifs_compound_last_callback(struct TCP_Server_Info *server, struct mid_q_entry *mid)
 798{
 799	cifs_compound_callback(server, mid);
 800	cifs_wake_up_task(server, mid);
 801}
 802
 803static void
 804cifs_cancelled_callback(struct TCP_Server_Info *server, struct mid_q_entry *mid)
 805{
 806	cifs_compound_callback(server, mid);
 807	release_mid(server, mid);
 808}
 809
 810/*
 811 * cifs_pick_channel - pick an eligible channel for network operations
 812 *
 813 * @ses: session reference
 814 *
 815 * Select an eligible channel (not terminating and not marked as needing
 816 * reconnect), preferring the least loaded one. If no eligible channel is
 817 * found, fall back to the primary channel (index 0).
 818 *
 819 * Return: TCP_Server_Info pointer for the chosen channel, or NULL if @ses is
 820 * NULL.
 821 */
 822struct TCP_Server_Info *cifs_pick_channel(struct cifs_ses *ses)
 823{
 824	uint index = 0;
 825	unsigned int min_in_flight = UINT_MAX;
 826	struct TCP_Server_Info *server = NULL;
 827	int i, start, cur;
 828
 829	if (!ses)
 830		return NULL;
 831
 832	spin_lock(&ses->chan_lock);
 833	start = atomic_inc_return(&ses->chan_seq);
 834	for (i = 0; i < ses->chan_count; i++) {
 835		cur = (start + i) % ses->chan_count;
 836		server = ses->chans[cur].server;
 837		if (!server || server->terminate)
 838			continue;
 839
 840		if (CIFS_CHAN_NEEDS_RECONNECT(ses, cur))
 841			continue;
 842
 843		/*
 844		 * strictly speaking, we should pick up req_lock to read
 845		 * server->in_flight. But it shouldn't matter much here if we
 846		 * race while reading this data. The worst that can happen is
 847		 * that we could use a channel that's not least loaded. Avoiding
 848		 * taking the lock could help reduce wait time, which is
 849		 * important for this function
 850		 */
 851		if (server->in_flight < min_in_flight) {
 852			min_in_flight = server->in_flight;
 853			index = cur;
 854		}
 855	}
 856
 857	server = ses->chans[index].server;
 858	spin_unlock(&ses->chan_lock);
 859
 860	return server;
 861}
 862
 863int
 864compound_send_recv(const unsigned int xid, struct cifs_ses *ses,
 865		   struct TCP_Server_Info *server,
 866		   const int flags, const int num_rqst, struct smb_rqst *rqst,
 867		   int *resp_buf_type, struct kvec *resp_iov)
 868{
 869	int i, j, optype, rc = 0;
 870	struct mid_q_entry *mid[MAX_COMPOUND];
 871	bool cancelled_mid[MAX_COMPOUND] = {false};
 872	struct cifs_credits credits[MAX_COMPOUND] = {
 873		{ .value = 0, .instance = 0 }
 874	};
 875	unsigned int instance;
 876	char *buf;
 877
 878	optype = flags & CIFS_OP_MASK;
 879
 880	for (i = 0; i < num_rqst; i++)
 881		resp_buf_type[i] = CIFS_NO_BUFFER;  /* no response buf yet */
 882
 883	if (!ses || !ses->server || !server) {
 884		cifs_dbg(VFS, "Null session\n");
 885		return smb_EIO(smb_eio_trace_null_pointers);
 886	}
 887
 888	spin_lock(&server->srv_lock);
 889	if (server->tcpStatus == CifsExiting) {
 890		spin_unlock(&server->srv_lock);
 891		return -ENOENT;
 892	}
 893	spin_unlock(&server->srv_lock);
 894
 895	/*
 896	 * Wait for all the requests to become available.
 897	 * This approach still leaves the possibility to be stuck waiting for
 898	 * credits if the server doesn't grant credits to the outstanding
 899	 * requests and if the client is completely idle, not generating any
 900	 * other requests.
 901	 * This can be handled by the eventual session reconnect.
 902	 */
 903	rc = wait_for_compound_request(server, num_rqst, flags,
 904				       &instance);
 905	if (rc)
 906		return rc;
 907
 908	for (i = 0; i < num_rqst; i++) {
 909		credits[i].value = 1;
 910		credits[i].instance = instance;
 911	}
 912
 913	/*
 914	 * Make sure that we sign in the same order that we send on this socket
 915	 * and avoid races inside tcp sendmsg code that could cause corruption
 916	 * of smb data.
 917	 */
 918
 919	cifs_server_lock(server);
 920
 921	/*
 922	 * All the parts of the compound chain belong obtained credits from the
 923	 * same session. We can not use credits obtained from the previous
 924	 * session to send this request. Check if there were reconnects after
 925	 * we obtained credits and return -EAGAIN in such cases to let callers
 926	 * handle it.
 927	 */
 928	if (instance != server->reconnect_instance) {
 929		cifs_server_unlock(server);
 930		for (j = 0; j < num_rqst; j++)
 931			add_credits(server, &credits[j], optype);
 932		return -EAGAIN;
 933	}
 934
 935	for (i = 0; i < num_rqst; i++) {
 936		mid[i] = server->ops->setup_request(ses, server, &rqst[i]);
 937		if (IS_ERR(mid[i])) {
 938			revert_current_mid(server, i);
 939			for (j = 0; j < i; j++)
 940				delete_mid(server, mid[j]);
 941			cifs_server_unlock(server);
 942
 943			/* Update # of requests on wire to server */
 944			for (j = 0; j < num_rqst; j++)
 945				add_credits(server, &credits[j], optype);
 946			return PTR_ERR(mid[i]);
 947		}
 948
 949		mid[i]->sr_flags = flags;
 950		mid[i]->mid_state = MID_REQUEST_SUBMITTED;
 951		mid[i]->optype = optype;
 952		/*
 953		 * Invoke callback for every part of the compound chain
 954		 * to calculate credits properly. Wake up this thread only when
 955		 * the last element is received.
 956		 */
 957		if (i < num_rqst - 1)
 958			mid[i]->callback = cifs_compound_callback;
 959		else
 960			mid[i]->callback = cifs_compound_last_callback;
 961	}
 962	rc = smb_send_rqst(server, num_rqst, rqst, flags);
 963
 964	for (i = 0; i < num_rqst; i++)
 965		cifs_save_when_sent(mid[i]);
 966
 967	if (rc < 0) {
 968		revert_current_mid(server, num_rqst);
 969		server->sequence_number -= 2;
 970	}
 971
 972	cifs_server_unlock(server);
 973
 974	/*
 975	 * If sending failed for some reason or it is an oplock break that we
 976	 * will not receive a response to - return credits back
 977	 */
 978	if (rc < 0 || (flags & CIFS_NO_SRV_RSP)) {
 979		for (i = 0; i < num_rqst; i++)
 980			add_credits(server, &credits[i], optype);
 981		goto out;
 982	}
 983
 984	/*
 985	 * At this point the request is passed to the network stack - we assume
 986	 * that any credits taken from the server structure on the client have
 987	 * been spent and we can't return them back. Once we receive responses
 988	 * we will collect credits granted by the server in the mid callbacks
 989	 * and add those credits to the server structure.
 990	 */
 991
 992	/*
 993	 * Compounding is never used during session establish.
 994	 */
 995	spin_lock(&ses->ses_lock);
 996	if ((ses->ses_status == SES_NEW) || (optype & CIFS_NEG_OP) || (optype & CIFS_SESS_OP)) {
 997		spin_unlock(&ses->ses_lock);
 998
 999		if (WARN_ON_ONCE(num_rqst != 1 || !resp_iov))
1000			return -EINVAL;
1001
1002		cifs_server_lock(server);
1003		smb311_update_preauth_hash(ses, server, rqst[0].rq_iov, rqst[0].rq_nvec);
1004		cifs_server_unlock(server);
1005
1006		spin_lock(&ses->ses_lock);
1007	}
1008	spin_unlock(&ses->ses_lock);
1009
1010	for (i = 0; i < num_rqst; i++) {
1011		rc = wait_for_response(server, mid[i]);
1012		if (rc != 0)
1013			break;
1014	}
1015	if (rc != 0) {
1016		for (; i < num_rqst; i++) {
1017			cifs_server_dbg(FYI, "Cancelling wait for mid %llu cmd: %d\n",
1018				 mid[i]->mid, le16_to_cpu(mid[i]->command));
1019			send_cancel(ses, server, &rqst[i], mid[i], xid);
1020			spin_lock(&mid[i]->mid_lock);
1021			mid[i]->wait_cancelled = true;
1022			if (mid[i]->mid_state == MID_REQUEST_SUBMITTED ||
1023			    mid[i]->mid_state == MID_RESPONSE_RECEIVED) {
1024				mid[i]->callback = cifs_cancelled_callback;
1025				cancelled_mid[i] = true;
1026				credits[i].value = 0;
1027			}
1028			spin_unlock(&mid[i]->mid_lock);
1029		}
1030	}
1031
1032	for (i = 0; i < num_rqst; i++) {
1033		if (rc < 0)
1034			goto out;
1035
1036		rc = cifs_sync_mid_result(mid[i], server);
1037		if (rc != 0) {
1038			/* mark this mid as cancelled to not free it below */
1039			cancelled_mid[i] = true;
1040			goto out;
1041		}
1042
1043		if (!mid[i]->resp_buf ||
1044		    mid[i]->mid_state != MID_RESPONSE_READY) {
1045			rc = smb_EIO1(smb_eio_trace_rx_mid_unready, mid[i]->mid_state);
1046			cifs_dbg(FYI, "Bad MID state?\n");
1047			goto out;
1048		}
1049
1050		rc = server->ops->check_receive(mid[i], server,
1051						flags & CIFS_LOG_ERROR);
1052
1053		if (resp_iov) {
1054			buf = (char *)mid[i]->resp_buf;
1055			resp_iov[i].iov_base = buf;
1056			resp_iov[i].iov_len = mid[i]->resp_buf_size;
1057
1058			if (mid[i]->large_buf)
1059				resp_buf_type[i] = CIFS_LARGE_BUFFER;
1060			else
1061				resp_buf_type[i] = CIFS_SMALL_BUFFER;
1062
1063			/* mark it so buf will not be freed by delete_mid */
1064			if ((flags & CIFS_NO_RSP_BUF) == 0)
1065				mid[i]->resp_buf = NULL;
1066		}
1067	}
1068
1069	/*
1070	 * Compounding is never used during session establish.
1071	 */
1072	spin_lock(&ses->ses_lock);
1073	if ((ses->ses_status == SES_NEW) || (optype & CIFS_NEG_OP) || (optype & CIFS_SESS_OP)) {
1074		struct kvec iov = {
1075			.iov_base = resp_iov[0].iov_base,
1076			.iov_len = resp_iov[0].iov_len
1077		};
1078		spin_unlock(&ses->ses_lock);
1079		cifs_server_lock(server);
1080		smb311_update_preauth_hash(ses, server, &iov, 1);
1081		cifs_server_unlock(server);
1082		spin_lock(&ses->ses_lock);
1083	}
1084	spin_unlock(&ses->ses_lock);
1085
1086out:
1087	/*
1088	 * This will dequeue all mids. After this it is important that the
1089	 * demultiplex_thread will not process any of these mids any further.
1090	 * This is prevented above by using a noop callback that will not
1091	 * wake this thread except for the very last PDU.
1092	 */
1093	for (i = 0; i < num_rqst; i++) {
1094		if (!cancelled_mid[i])
1095			delete_mid(server, mid[i]);
1096	}
1097
1098	return rc;
1099}
1100
1101int
1102cifs_send_recv(const unsigned int xid, struct cifs_ses *ses,
1103	       struct TCP_Server_Info *server,
1104	       struct smb_rqst *rqst, int *resp_buf_type, const int flags,
1105	       struct kvec *resp_iov)
1106{
1107	return compound_send_recv(xid, ses, server, flags, 1,
1108				  rqst, resp_buf_type, resp_iov);
1109}
1110
1111
1112/*
1113 * Discard any remaining data in the current SMB. To do this, we borrow the
1114 * current bigbuf.
1115 */
1116int
1117cifs_discard_remaining_data(struct TCP_Server_Info *server)
1118{
1119	unsigned int rfclen = server->pdu_size;
1120	size_t remaining = rfclen - server->total_read;
1121
1122	while (remaining > 0) {
1123		ssize_t length;
1124
1125		length = cifs_discard_from_socket(server,
1126				min_t(size_t, remaining,
1127				      CIFSMaxBufSize + MAX_HEADER_SIZE(server)));
1128		if (length < 0)
1129			return length;
1130		server->total_read += length;
1131		remaining -= length;
1132	}
1133
1134	return 0;
1135}
1136
1137static int
1138__cifs_readv_discard(struct TCP_Server_Info *server, struct mid_q_entry *mid,
1139		     bool malformed)
1140{
1141	int length;
1142
1143	length = cifs_discard_remaining_data(server);
1144	dequeue_mid(server, mid, malformed);
1145	mid->resp_buf = server->smallbuf;
1146	server->smallbuf = NULL;
1147	return length;
1148}
1149
1150static int
1151cifs_readv_discard(struct TCP_Server_Info *server, struct mid_q_entry *mid)
1152{
1153	struct cifs_io_subrequest *rdata = mid->callback_data;
1154
1155	return  __cifs_readv_discard(server, mid, rdata->result);
1156}
1157
1158int
1159cifs_readv_receive(struct TCP_Server_Info *server, struct mid_q_entry *mid)
1160{
1161	int length, len;
1162	unsigned int data_offset, data_len;
1163	struct cifs_io_subrequest *rdata = mid->callback_data;
1164	char *buf = server->smallbuf;
1165	unsigned int buflen = server->pdu_size;
1166	bool use_rdma_mr = false;
1167
1168	cifs_dbg(FYI, "%s: mid=%llu offset=%llu bytes=%zu\n",
1169		 __func__, mid->mid, rdata->subreq.start, rdata->subreq.len);
1170
1171	/*
1172	 * read the rest of READ_RSP header (sans Data array), or whatever we
1173	 * can if there's not enough data. At this point, we've read down to
1174	 * the Mid.
1175	 */
1176	len = min_t(unsigned int, buflen, server->vals->read_rsp_size) -
1177							HEADER_SIZE(server) + 1;
1178
1179	length = cifs_read_from_socket(server,
1180				       buf + HEADER_SIZE(server) - 1, len);
1181	if (length < 0)
1182		return length;
1183	server->total_read += length;
1184
1185	if (server->ops->is_session_expired &&
1186	    server->ops->is_session_expired(buf)) {
1187		cifs_reconnect(server, true);
1188		return -1;
1189	}
1190
1191	if (server->ops->is_status_pending &&
1192	    server->ops->is_status_pending(buf, server)) {
1193		cifs_discard_remaining_data(server);
1194		return -1;
1195	}
1196
1197	/* set up first two iov for signature check and to get credits */
1198	rdata->iov[0].iov_base = buf;
1199	rdata->iov[0].iov_len = server->total_read;
1200	cifs_dbg(FYI, "0: iov_base=%p iov_len=%zu\n",
1201		 rdata->iov[0].iov_base, rdata->iov[0].iov_len);
1202
1203	/* Was the SMB read successful? */
1204	rdata->result = server->ops->map_error(buf, false);
1205	if (rdata->result != 0) {
1206		cifs_dbg(FYI, "%s: server returned error %d\n",
1207			 __func__, rdata->result);
1208		/* normal error on read response */
1209		return __cifs_readv_discard(server, mid, false);
1210	}
1211
1212	/* Is there enough to get to the rest of the READ_RSP header? */
1213	if (server->total_read < server->vals->read_rsp_size) {
1214		cifs_dbg(FYI, "%s: server returned short header. got=%u expected=%zu\n",
1215			 __func__, server->total_read,
1216			 server->vals->read_rsp_size);
1217		rdata->result = smb_EIO2(smb_eio_trace_read_rsp_short,
1218					 server->total_read, server->vals->read_rsp_size);
1219		return cifs_readv_discard(server, mid);
1220	}
1221
1222	data_offset = server->ops->read_data_offset(buf);
1223	if (data_offset < server->total_read) {
1224		/*
1225		 * win2k8 sometimes sends an offset of 0 when the read
1226		 * is beyond the EOF. Treat it as if the data starts just after
1227		 * the header.
1228		 */
1229		cifs_dbg(FYI, "%s: data offset (%u) inside read response header\n",
1230			 __func__, data_offset);
1231		data_offset = server->total_read;
1232	} else if (data_offset > MAX_CIFS_SMALL_BUFFER_SIZE) {
1233		/* data_offset is beyond the end of smallbuf */
1234		cifs_dbg(FYI, "%s: data offset (%u) beyond end of smallbuf\n",
1235			 __func__, data_offset);
1236		rdata->result = smb_EIO1(smb_eio_trace_read_overlarge,
1237					 data_offset);
1238		return cifs_readv_discard(server, mid);
1239	}
1240
1241	cifs_dbg(FYI, "%s: total_read=%u data_offset=%u\n",
1242		 __func__, server->total_read, data_offset);
1243
1244	len = data_offset - server->total_read;
1245	if (len > 0) {
1246		/* read any junk before data into the rest of smallbuf */
1247		length = cifs_read_from_socket(server,
1248					       buf + server->total_read, len);
1249		if (length < 0)
1250			return length;
1251		server->total_read += length;
1252		rdata->iov[0].iov_len = server->total_read;
1253	}
1254
1255	/* how much data is in the response? */
1256#ifdef CONFIG_CIFS_SMB_DIRECT
1257	use_rdma_mr = rdata->mr;
1258#endif
1259	data_len = server->ops->read_data_length(buf, use_rdma_mr);
1260	if (!use_rdma_mr && (data_offset + data_len > buflen)) {
1261		/* data_len is corrupt -- discard frame */
1262		rdata->result = smb_EIO2(smb_eio_trace_read_rsp_malformed,
1263					 data_offset + data_len, buflen);
1264		return cifs_readv_discard(server, mid);
1265	}
1266
1267#ifdef CONFIG_CIFS_SMB_DIRECT
1268	if (rdata->mr)
1269		length = data_len; /* An RDMA read is already done. */
1270	else
1271#endif
1272		length = cifs_read_iter_from_socket(server, &rdata->subreq.io_iter,
1273						    data_len);
1274	if (length > 0)
1275		rdata->got_bytes += length;
1276	server->total_read += length;
1277
1278	cifs_dbg(FYI, "total_read=%u buflen=%u remaining=%u\n",
1279		 server->total_read, buflen, data_len);
1280
1281	/* discard anything left over */
1282	if (server->total_read < buflen)
1283		return cifs_readv_discard(server, mid);
1284
1285	dequeue_mid(server, mid, false);
1286	mid->resp_buf = server->smallbuf;
1287	server->smallbuf = NULL;
1288	return length;
1289}
~/ Read-only file preview.