|
@@ -1396,11 +1396,10 @@ openRetry:
|
|
|
* current bigbuf.
|
|
|
*/
|
|
|
static int
|
|
|
-cifs_readv_discard(struct TCP_Server_Info *server, struct mid_q_entry *mid)
|
|
|
+discard_remaining_data(struct TCP_Server_Info *server)
|
|
|
{
|
|
|
unsigned int rfclen = get_rfc1002_length(server->smallbuf);
|
|
|
int remaining = rfclen + 4 - server->total_read;
|
|
|
- struct cifs_readdata *rdata = mid->callback_data;
|
|
|
|
|
|
while (remaining > 0) {
|
|
|
int length;
|
|
@@ -1414,10 +1413,20 @@ cifs_readv_discard(struct TCP_Server_Info *server, struct mid_q_entry *mid)
|
|
|
remaining -= length;
|
|
|
}
|
|
|
|
|
|
- dequeue_mid(mid, rdata->result);
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+static int
|
|
|
+cifs_readv_discard(struct TCP_Server_Info *server, struct mid_q_entry *mid)
|
|
|
+{
|
|
|
+ int length;
|
|
|
+ struct cifs_readdata *rdata = mid->callback_data;
|
|
|
+
|
|
|
+ length = discard_remaining_data(server);
|
|
|
+ dequeue_mid(mid, rdata->result);
|
|
|
+ return length;
|
|
|
+}
|
|
|
+
|
|
|
int
|
|
|
cifs_readv_receive(struct TCP_Server_Info *server, struct mid_q_entry *mid)
|
|
|
{
|
|
@@ -1446,6 +1455,12 @@ cifs_readv_receive(struct TCP_Server_Info *server, struct mid_q_entry *mid)
|
|
|
return length;
|
|
|
server->total_read += length;
|
|
|
|
|
|
+ if (server->ops->is_status_pending &&
|
|
|
+ server->ops->is_status_pending(buf, server, 0)) {
|
|
|
+ discard_remaining_data(server);
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+
|
|
|
/* Was the SMB read successful? */
|
|
|
rdata->result = server->ops->map_error(buf, false);
|
|
|
if (rdata->result != 0) {
|