CIFS: Make SendReceive2() takes resp iov
Now SendReceive2 frees the first iov and returns a response buffer in it that increases a code complexity. Simplify this by making a caller responsible for freeing request buffer itself and returning a response buffer in a separate iov. Signed-off-by: Pavel Shilovsky <pshilov@microsoft.com>
This commit is contained in:

committed by
Steve French

parent
31473fc4f9
commit
da502f7df0
@@ -673,6 +673,7 @@ CIFSSMBTDis(const unsigned int xid, struct cifs_tcon *tcon)
|
||||
return rc;
|
||||
|
||||
rc = SendReceiveNoRsp(xid, tcon->ses, (char *)smb_buffer, 0);
|
||||
cifs_small_buf_release(smb_buffer);
|
||||
if (rc)
|
||||
cifs_dbg(FYI, "Tree disconnect failed %d\n", rc);
|
||||
|
||||
@@ -772,6 +773,7 @@ CIFSSMBLogoff(const unsigned int xid, struct cifs_ses *ses)
|
||||
|
||||
pSMB->AndXCommand = 0xFF;
|
||||
rc = SendReceiveNoRsp(xid, ses, (char *) pSMB, 0);
|
||||
cifs_small_buf_release(pSMB);
|
||||
session_already_dead:
|
||||
mutex_unlock(&ses->session_mutex);
|
||||
|
||||
@@ -1667,6 +1669,7 @@ CIFSSMBRead(const unsigned int xid, struct cifs_io_parms *io_parms,
|
||||
int wct;
|
||||
int resp_buf_type = 0;
|
||||
struct kvec iov[1];
|
||||
struct kvec rsp_iov;
|
||||
__u32 pid = io_parms->pid;
|
||||
__u16 netfid = io_parms->netfid;
|
||||
__u64 offset = io_parms->offset;
|
||||
@@ -1716,10 +1719,11 @@ CIFSSMBRead(const unsigned int xid, struct cifs_io_parms *io_parms,
|
||||
|
||||
iov[0].iov_base = (char *)pSMB;
|
||||
iov[0].iov_len = be32_to_cpu(pSMB->hdr.smb_buf_length) + 4;
|
||||
rc = SendReceive2(xid, tcon->ses, iov, 1 /* num iovecs */,
|
||||
&resp_buf_type, CIFS_LOG_ERROR);
|
||||
rc = SendReceive2(xid, tcon->ses, iov, 1, &resp_buf_type,
|
||||
CIFS_LOG_ERROR, &rsp_iov);
|
||||
cifs_small_buf_release(pSMB);
|
||||
cifs_stats_inc(&tcon->stats.cifs_stats.num_reads);
|
||||
pSMBr = (READ_RSP *)iov[0].iov_base;
|
||||
pSMBr = (READ_RSP *)rsp_iov.iov_base;
|
||||
if (rc) {
|
||||
cifs_dbg(VFS, "Send error in read = %d\n", rc);
|
||||
} else {
|
||||
@@ -1747,12 +1751,11 @@ CIFSSMBRead(const unsigned int xid, struct cifs_io_parms *io_parms,
|
||||
}
|
||||
}
|
||||
|
||||
/* cifs_small_buf_release(pSMB); */ /* Freed earlier now in SendReceive2 */
|
||||
if (*buf) {
|
||||
free_rsp_buf(resp_buf_type, iov[0].iov_base);
|
||||
free_rsp_buf(resp_buf_type, rsp_iov.iov_base);
|
||||
} else if (resp_buf_type != CIFS_NO_BUFFER) {
|
||||
/* return buffer to caller to free */
|
||||
*buf = iov[0].iov_base;
|
||||
*buf = rsp_iov.iov_base;
|
||||
if (resp_buf_type == CIFS_SMALL_BUFFER)
|
||||
*pbuf_type = CIFS_SMALL_BUFFER;
|
||||
else if (resp_buf_type == CIFS_LARGE_BUFFER)
|
||||
@@ -2182,6 +2185,7 @@ CIFSSMBWrite2(const unsigned int xid, struct cifs_io_parms *io_parms,
|
||||
__u64 offset = io_parms->offset;
|
||||
struct cifs_tcon *tcon = io_parms->tcon;
|
||||
unsigned int count = io_parms->length;
|
||||
struct kvec rsp_iov;
|
||||
|
||||
*nbytes = 0;
|
||||
|
||||
@@ -2240,8 +2244,9 @@ CIFSSMBWrite2(const unsigned int xid, struct cifs_io_parms *io_parms,
|
||||
else /* wct == 12 pad bigger by four bytes */
|
||||
iov[0].iov_len = smb_hdr_len + 8;
|
||||
|
||||
|
||||
rc = SendReceive2(xid, tcon->ses, iov, n_vec + 1, &resp_buf_type, 0);
|
||||
rc = SendReceive2(xid, tcon->ses, iov, n_vec + 1, &resp_buf_type, 0,
|
||||
&rsp_iov);
|
||||
cifs_small_buf_release(pSMB);
|
||||
cifs_stats_inc(&tcon->stats.cifs_stats.num_writes);
|
||||
if (rc) {
|
||||
cifs_dbg(FYI, "Send error Write2 = %d\n", rc);
|
||||
@@ -2249,7 +2254,7 @@ CIFSSMBWrite2(const unsigned int xid, struct cifs_io_parms *io_parms,
|
||||
/* presumably this can not happen, but best to be safe */
|
||||
rc = -EIO;
|
||||
} else {
|
||||
WRITE_RSP *pSMBr = (WRITE_RSP *)iov[0].iov_base;
|
||||
WRITE_RSP *pSMBr = (WRITE_RSP *)rsp_iov.iov_base;
|
||||
*nbytes = le16_to_cpu(pSMBr->CountHigh);
|
||||
*nbytes = (*nbytes) << 16;
|
||||
*nbytes += le16_to_cpu(pSMBr->Count);
|
||||
@@ -2263,8 +2268,7 @@ CIFSSMBWrite2(const unsigned int xid, struct cifs_io_parms *io_parms,
|
||||
*nbytes &= 0xFFFF;
|
||||
}
|
||||
|
||||
/* cifs_small_buf_release(pSMB); */ /* Freed earlier now in SendReceive2 */
|
||||
free_rsp_buf(resp_buf_type, iov[0].iov_base);
|
||||
free_rsp_buf(resp_buf_type, rsp_iov.iov_base);
|
||||
|
||||
/* Note: On -EAGAIN error only caller can retry on handle based calls
|
||||
since file handle passed in no longer valid */
|
||||
@@ -2279,6 +2283,7 @@ int cifs_lockv(const unsigned int xid, struct cifs_tcon *tcon,
|
||||
int rc = 0;
|
||||
LOCK_REQ *pSMB = NULL;
|
||||
struct kvec iov[2];
|
||||
struct kvec rsp_iov;
|
||||
int resp_buf_type;
|
||||
__u16 count;
|
||||
|
||||
@@ -2307,7 +2312,9 @@ int cifs_lockv(const unsigned int xid, struct cifs_tcon *tcon,
|
||||
iov[1].iov_len = (num_unlock + num_lock) * sizeof(LOCKING_ANDX_RANGE);
|
||||
|
||||
cifs_stats_inc(&tcon->stats.cifs_stats.num_locks);
|
||||
rc = SendReceive2(xid, tcon->ses, iov, 2, &resp_buf_type, CIFS_NO_RESP);
|
||||
rc = SendReceive2(xid, tcon->ses, iov, 2, &resp_buf_type, CIFS_NO_RESP,
|
||||
&rsp_iov);
|
||||
cifs_small_buf_release(pSMB);
|
||||
if (rc)
|
||||
cifs_dbg(FYI, "Send error in cifs_lockv = %d\n", rc);
|
||||
|
||||
@@ -2368,14 +2375,12 @@ CIFSSMBLock(const unsigned int xid, struct cifs_tcon *tcon,
|
||||
inc_rfc1001_len(pSMB, count);
|
||||
pSMB->ByteCount = cpu_to_le16(count);
|
||||
|
||||
if (waitFlag) {
|
||||
if (waitFlag)
|
||||
rc = SendReceiveBlockingLock(xid, tcon, (struct smb_hdr *) pSMB,
|
||||
(struct smb_hdr *) pSMB, &bytes_returned);
|
||||
cifs_small_buf_release(pSMB);
|
||||
} else {
|
||||
else
|
||||
rc = SendReceiveNoRsp(xid, tcon->ses, (char *)pSMB, flags);
|
||||
/* SMB buffer freed by function above */
|
||||
}
|
||||
cifs_small_buf_release(pSMB);
|
||||
cifs_stats_inc(&tcon->stats.cifs_stats.num_locks);
|
||||
if (rc)
|
||||
cifs_dbg(FYI, "Send error in Lock = %d\n", rc);
|
||||
@@ -2401,6 +2406,7 @@ CIFSSMBPosixLock(const unsigned int xid, struct cifs_tcon *tcon,
|
||||
int resp_buf_type = 0;
|
||||
__u16 params, param_offset, offset, byte_count, count;
|
||||
struct kvec iov[1];
|
||||
struct kvec rsp_iov;
|
||||
|
||||
cifs_dbg(FYI, "Posix Lock\n");
|
||||
|
||||
@@ -2462,11 +2468,10 @@ CIFSSMBPosixLock(const unsigned int xid, struct cifs_tcon *tcon,
|
||||
iov[0].iov_base = (char *)pSMB;
|
||||
iov[0].iov_len = be32_to_cpu(pSMB->hdr.smb_buf_length) + 4;
|
||||
rc = SendReceive2(xid, tcon->ses, iov, 1 /* num iovecs */,
|
||||
&resp_buf_type, timeout);
|
||||
pSMB = NULL; /* request buf already freed by SendReceive2. Do
|
||||
not try to free it twice below on exit */
|
||||
pSMBr = (struct smb_com_transaction2_sfi_rsp *)iov[0].iov_base;
|
||||
&resp_buf_type, timeout, &rsp_iov);
|
||||
pSMBr = (struct smb_com_transaction2_sfi_rsp *)rsp_iov.iov_base;
|
||||
}
|
||||
cifs_small_buf_release(pSMB);
|
||||
|
||||
if (rc) {
|
||||
cifs_dbg(FYI, "Send error in Posix Lock = %d\n", rc);
|
||||
@@ -2506,10 +2511,7 @@ CIFSSMBPosixLock(const unsigned int xid, struct cifs_tcon *tcon,
|
||||
}
|
||||
|
||||
plk_err_exit:
|
||||
if (pSMB)
|
||||
cifs_small_buf_release(pSMB);
|
||||
|
||||
free_rsp_buf(resp_buf_type, iov[0].iov_base);
|
||||
free_rsp_buf(resp_buf_type, rsp_iov.iov_base);
|
||||
|
||||
/* Note: On -EAGAIN error only caller can retry on handle based calls
|
||||
since file handle passed in no longer valid */
|
||||
@@ -2536,6 +2538,7 @@ CIFSSMBClose(const unsigned int xid, struct cifs_tcon *tcon, int smb_file_id)
|
||||
pSMB->LastWriteTime = 0xFFFFFFFF;
|
||||
pSMB->ByteCount = 0;
|
||||
rc = SendReceiveNoRsp(xid, tcon->ses, (char *) pSMB, 0);
|
||||
cifs_small_buf_release(pSMB);
|
||||
cifs_stats_inc(&tcon->stats.cifs_stats.num_closes);
|
||||
if (rc) {
|
||||
if (rc != -EINTR) {
|
||||
@@ -2565,6 +2568,7 @@ CIFSSMBFlush(const unsigned int xid, struct cifs_tcon *tcon, int smb_file_id)
|
||||
pSMB->FileID = (__u16) smb_file_id;
|
||||
pSMB->ByteCount = 0;
|
||||
rc = SendReceiveNoRsp(xid, tcon->ses, (char *) pSMB, 0);
|
||||
cifs_small_buf_release(pSMB);
|
||||
cifs_stats_inc(&tcon->stats.cifs_stats.num_flushes);
|
||||
if (rc)
|
||||
cifs_dbg(VFS, "Send error in Flush = %d\n", rc);
|
||||
@@ -3820,6 +3824,7 @@ CIFSSMBGetCIFSACL(const unsigned int xid, struct cifs_tcon *tcon, __u16 fid,
|
||||
int buf_type = 0;
|
||||
QUERY_SEC_DESC_REQ *pSMB;
|
||||
struct kvec iov[1];
|
||||
struct kvec rsp_iov;
|
||||
|
||||
cifs_dbg(FYI, "GetCifsACL\n");
|
||||
|
||||
@@ -3843,7 +3848,8 @@ CIFSSMBGetCIFSACL(const unsigned int xid, struct cifs_tcon *tcon, __u16 fid,
|
||||
iov[0].iov_len = be32_to_cpu(pSMB->hdr.smb_buf_length) + 4;
|
||||
|
||||
rc = SendReceive2(xid, tcon->ses, iov, 1 /* num iovec */, &buf_type,
|
||||
0);
|
||||
0, &rsp_iov);
|
||||
cifs_small_buf_release(pSMB);
|
||||
cifs_stats_inc(&tcon->stats.cifs_stats.num_acl_get);
|
||||
if (rc) {
|
||||
cifs_dbg(FYI, "Send error in QuerySecDesc = %d\n", rc);
|
||||
@@ -3855,11 +3861,11 @@ CIFSSMBGetCIFSACL(const unsigned int xid, struct cifs_tcon *tcon, __u16 fid,
|
||||
char *pdata;
|
||||
|
||||
/* validate_nttransact */
|
||||
rc = validate_ntransact(iov[0].iov_base, (char **)&parm,
|
||||
rc = validate_ntransact(rsp_iov.iov_base, (char **)&parm,
|
||||
&pdata, &parm_len, pbuflen);
|
||||
if (rc)
|
||||
goto qsec_out;
|
||||
pSMBr = (struct smb_com_ntransact_rsp *)iov[0].iov_base;
|
||||
pSMBr = (struct smb_com_ntransact_rsp *)rsp_iov.iov_base;
|
||||
|
||||
cifs_dbg(FYI, "smb %p parm %p data %p\n",
|
||||
pSMBr, parm, *acl_inf);
|
||||
@@ -3896,8 +3902,7 @@ CIFSSMBGetCIFSACL(const unsigned int xid, struct cifs_tcon *tcon, __u16 fid,
|
||||
}
|
||||
}
|
||||
qsec_out:
|
||||
free_rsp_buf(buf_type, iov[0].iov_base);
|
||||
/* cifs_small_buf_release(pSMB); */ /* Freed earlier now in SendReceive2 */
|
||||
free_rsp_buf(buf_type, rsp_iov.iov_base);
|
||||
return rc;
|
||||
}
|
||||
|
||||
@@ -4666,6 +4671,7 @@ CIFSFindClose(const unsigned int xid, struct cifs_tcon *tcon,
|
||||
pSMB->FileID = searchHandle;
|
||||
pSMB->ByteCount = 0;
|
||||
rc = SendReceiveNoRsp(xid, tcon->ses, (char *) pSMB, 0);
|
||||
cifs_small_buf_release(pSMB);
|
||||
if (rc)
|
||||
cifs_dbg(VFS, "Send error in FindClose = %d\n", rc);
|
||||
|
||||
@@ -5687,6 +5693,7 @@ CIFSSMBSetFileSize(const unsigned int xid, struct cifs_tcon *tcon,
|
||||
inc_rfc1001_len(pSMB, byte_count);
|
||||
pSMB->ByteCount = cpu_to_le16(byte_count);
|
||||
rc = SendReceiveNoRsp(xid, tcon->ses, (char *) pSMB, 0);
|
||||
cifs_small_buf_release(pSMB);
|
||||
if (rc) {
|
||||
cifs_dbg(FYI, "Send error in SetFileInfo (SetFileSize) = %d\n",
|
||||
rc);
|
||||
@@ -5758,6 +5765,7 @@ CIFSSMBSetFileInfo(const unsigned int xid, struct cifs_tcon *tcon,
|
||||
pSMB->ByteCount = cpu_to_le16(byte_count);
|
||||
memcpy(data_offset, data, sizeof(FILE_BASIC_INFO));
|
||||
rc = SendReceiveNoRsp(xid, tcon->ses, (char *) pSMB, 0);
|
||||
cifs_small_buf_release(pSMB);
|
||||
if (rc)
|
||||
cifs_dbg(FYI, "Send error in Set Time (SetFileInfo) = %d\n",
|
||||
rc);
|
||||
@@ -5818,6 +5826,7 @@ CIFSSMBSetFileDisposition(const unsigned int xid, struct cifs_tcon *tcon,
|
||||
pSMB->ByteCount = cpu_to_le16(byte_count);
|
||||
*data_offset = delete_file ? 1 : 0;
|
||||
rc = SendReceiveNoRsp(xid, tcon->ses, (char *) pSMB, 0);
|
||||
cifs_small_buf_release(pSMB);
|
||||
if (rc)
|
||||
cifs_dbg(FYI, "Send error in SetFileDisposition = %d\n", rc);
|
||||
|
||||
@@ -6057,6 +6066,7 @@ CIFSSMBUnixSetFileInfo(const unsigned int xid, struct cifs_tcon *tcon,
|
||||
cifs_fill_unix_set_info((FILE_UNIX_BASIC_INFO *)data_offset, args);
|
||||
|
||||
rc = SendReceiveNoRsp(xid, tcon->ses, (char *) pSMB, 0);
|
||||
cifs_small_buf_release(pSMB);
|
||||
if (rc)
|
||||
cifs_dbg(FYI, "Send error in Set Time (SetFileInfo) = %d\n",
|
||||
rc);
|
||||
|
Reference in New Issue
Block a user