diff options
Diffstat (limited to 'fs/cifs/file.c')
-rw-r--r-- | fs/cifs/file.c | 27 |
1 files changed, 13 insertions, 14 deletions
diff --git a/fs/cifs/file.c b/fs/cifs/file.c index c3390e2c6e0d..e17012817d9d 100644 --- a/fs/cifs/file.c +++ b/fs/cifs/file.c @@ -3027,28 +3027,27 @@ again: rc = wait_for_completion_killable(&rdata->done); if (rc) rc = -EINTR; - else if (rdata->result) { - rc = rdata->result; + else if (rdata->result == -EAGAIN) { /* resend call if it's a retryable error */ - if (rc == -EAGAIN) { - struct list_head tmp_list; + struct list_head tmp_list; - list_del_init(&rdata->list); - INIT_LIST_HEAD(&tmp_list); + list_del_init(&rdata->list); + INIT_LIST_HEAD(&tmp_list); - rc = cifs_send_async_read(rdata->offset, + rc = cifs_send_async_read(rdata->offset, rdata->bytes, rdata->cfile, cifs_sb, &tmp_list); - list_splice(&tmp_list, &rdata_list); + list_splice(&tmp_list, &rdata_list); - kref_put(&rdata->refcount, - cifs_uncached_readdata_release); - goto again; - } - } else { + kref_put(&rdata->refcount, + cifs_uncached_readdata_release); + goto again; + } else if (rdata->result) + rc = rdata->result; + else rc = cifs_readdata_to_iov(rdata, to); - } + /* if there was a short read -- discard anything left */ if (rdata->got_bytes && rdata->got_bytes < rdata->bytes) rc = -ENODATA; |