Commit 0cc380d0 authored by Fushuai Wang's avatar Fushuai Wang Committed by Steve French
Browse files

cifs: Fix copy_to_iter return value check



The return value of copy_to_iter() function will never be negative,
it is the number of bytes copied, or zero if nothing was copied.
Update the check to treat 0 as an error, and return -1 in that case.

Fixes: d08089f6 ("cifs: Change the I/O paths to use an iterator rather than a page list")
Acked-by: default avatarTom Talpey <tom@talpey.com>
Reviewed-by: default avatarDavid Howells <dhowells@redhat.com>
Signed-off-by: default avatarFushuai Wang <wangfushuai@baidu.com>
Signed-off-by: default avatarSteve French <stfrench@microsoft.com>
parent 68d2e2ca
Loading
Loading
Loading
Loading
+5 −5
Original line number Diff line number Diff line
@@ -4736,7 +4736,7 @@ handle_read_data(struct TCP_Server_Info *server, struct mid_q_entry *mid,
	unsigned int pad_len;
	struct cifs_io_subrequest *rdata = mid->callback_data;
	struct smb2_hdr *shdr = (struct smb2_hdr *)buf;
	int length;
	size_t copied;
	bool use_rdma_mr = false;

	if (shdr->Command != SMB2_READ) {
@@ -4849,10 +4849,10 @@ handle_read_data(struct TCP_Server_Info *server, struct mid_q_entry *mid,
	} else if (buf_len >= data_offset + data_len) {
		/* read response payload is in buf */
		WARN_ONCE(buffer, "read data can be either in buf or in buffer");
		length = copy_to_iter(buf + data_offset, data_len, &rdata->subreq.io_iter);
		if (length < 0)
			return length;
		rdata->got_bytes = data_len;
		copied = copy_to_iter(buf + data_offset, data_len, &rdata->subreq.io_iter);
		if (copied == 0)
			return -EIO;
		rdata->got_bytes = copied;
	} else {
		/* read response payload cannot be in both buf and pages */
		WARN_ONCE(1, "buf can not contain only a part of read data");