|
@@ -1411,27 +1411,6 @@ cifs_readv_discard(struct TCP_Server_Info *server, struct mid_q_entry *mid)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-static inline size_t
|
|
|
-read_rsp_size(void)
|
|
|
-{
|
|
|
- return sizeof(READ_RSP);
|
|
|
-}
|
|
|
-
|
|
|
-static inline unsigned int
|
|
|
-read_data_offset(char *buf)
|
|
|
-{
|
|
|
- READ_RSP *rsp = (READ_RSP *)buf;
|
|
|
- return le16_to_cpu(rsp->DataOffset);
|
|
|
-}
|
|
|
-
|
|
|
-static inline unsigned int
|
|
|
-read_data_length(char *buf)
|
|
|
-{
|
|
|
- READ_RSP *rsp = (READ_RSP *)buf;
|
|
|
- return (le16_to_cpu(rsp->DataLengthHigh) << 16) +
|
|
|
- le16_to_cpu(rsp->DataLength);
|
|
|
-}
|
|
|
-
|
|
|
static int
|
|
|
cifs_readv_receive(struct TCP_Server_Info *server, struct mid_q_entry *mid)
|
|
|
{
|
|
@@ -1449,7 +1428,7 @@ cifs_readv_receive(struct TCP_Server_Info *server, struct mid_q_entry *mid)
|
|
|
* can if there's not enough data. At this point, we've read down to
|
|
|
* the Mid.
|
|
|
*/
|
|
|
- len = min_t(unsigned int, buflen, read_rsp_size()) -
|
|
|
+ len = min_t(unsigned int, buflen, server->vals->read_rsp_size) -
|
|
|
HEADER_SIZE(server) + 1;
|
|
|
|
|
|
rdata->iov[0].iov_base = buf + HEADER_SIZE(server) - 1;
|
|
@@ -1461,7 +1440,7 @@ cifs_readv_receive(struct TCP_Server_Info *server, struct mid_q_entry *mid)
|
|
|
server->total_read += length;
|
|
|
|
|
|
/* Was the SMB read successful? */
|
|
|
- rdata->result = map_smb_to_linux_error(buf, false);
|
|
|
+ rdata->result = server->ops->map_error(buf, false);
|
|
|
if (rdata->result != 0) {
|
|
|
cFYI(1, "%s: server returned error %d", __func__,
|
|
|
rdata->result);
|
|
@@ -1469,14 +1448,15 @@ cifs_readv_receive(struct TCP_Server_Info *server, struct mid_q_entry *mid)
|
|
|
}
|
|
|
|
|
|
/* Is there enough to get to the rest of the READ_RSP header? */
|
|
|
- if (server->total_read < read_rsp_size()) {
|
|
|
+ if (server->total_read < server->vals->read_rsp_size) {
|
|
|
cFYI(1, "%s: server returned short header. got=%u expected=%zu",
|
|
|
- __func__, server->total_read, read_rsp_size());
|
|
|
+ __func__, server->total_read,
|
|
|
+ server->vals->read_rsp_size);
|
|
|
rdata->result = -EIO;
|
|
|
return cifs_readv_discard(server, mid);
|
|
|
}
|
|
|
|
|
|
- data_offset = read_data_offset(buf) + 4;
|
|
|
+ data_offset = server->ops->read_data_offset(buf) + 4;
|
|
|
if (data_offset < server->total_read) {
|
|
|
/*
|
|
|
* win2k8 sometimes sends an offset of 0 when the read
|
|
@@ -1515,7 +1495,7 @@ cifs_readv_receive(struct TCP_Server_Info *server, struct mid_q_entry *mid)
|
|
|
rdata->iov[0].iov_base, rdata->iov[0].iov_len);
|
|
|
|
|
|
/* how much data is in the response? */
|
|
|
- data_len = read_data_length(buf);
|
|
|
+ data_len = server->ops->read_data_length(buf);
|
|
|
if (data_offset + data_len > buflen) {
|
|
|
/* data_len is corrupt -- discard frame */
|
|
|
rdata->result = -EIO;
|