Commit 74027f4a authored by Al Viro's avatar Al Viro

cifs_iovec_read(): resubmit shouldn't restart the loop

... by that point the request we'd just resent is in the
head of the list anyway.  Just return to the beginning of
the loop body...
Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent 6e58e79d
...@@ -2918,8 +2918,8 @@ cifs_iovec_read(struct file *file, const struct iovec *iov, ...@@ -2918,8 +2918,8 @@ cifs_iovec_read(struct file *file, const struct iovec *iov,
rc = 0; rc = 0;
/* the loop below should proceed in the order of increasing offsets */ /* the loop below should proceed in the order of increasing offsets */
restart_loop:
list_for_each_entry_safe(rdata, tmp, &rdata_list, list) { list_for_each_entry_safe(rdata, tmp, &rdata_list, list) {
again:
if (!rc) { if (!rc) {
ssize_t copied; ssize_t copied;
...@@ -2927,20 +2927,20 @@ cifs_iovec_read(struct file *file, const struct iovec *iov, ...@@ -2927,20 +2927,20 @@ cifs_iovec_read(struct file *file, const struct iovec *iov,
rc = wait_for_completion_killable(&rdata->done); rc = wait_for_completion_killable(&rdata->done);
if (rc) if (rc)
rc = -EINTR; rc = -EINTR;
else if (rdata->result) else if (rdata->result) {
rc = rdata->result; rc = rdata->result;
else { /* resend call if it's a retryable error */
if (rc == -EAGAIN) {
rc = cifs_retry_async_readv(rdata);
goto again;
}
} else {
rc = cifs_readdata_to_iov(rdata, iov, rc = cifs_readdata_to_iov(rdata, iov,
nr_segs, *poffset, nr_segs, *poffset,
&copied); &copied);
total_read += copied; total_read += copied;
} }
/* resend call if it's a retryable error */
if (rc == -EAGAIN) {
rc = cifs_retry_async_readv(rdata);
goto restart_loop;
}
} }
list_del_init(&rdata->list); list_del_init(&rdata->list);
kref_put(&rdata->refcount, cifs_uncached_readdata_release); kref_put(&rdata->refcount, cifs_uncached_readdata_release);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment