]> git.proxmox.com Git - mirror_ubuntu-zesty-kernel.git/commitdiff
CIFS: Fix rsize usage for sync read
authorPavel Shilovsky <pshilovsky@samba.org>
Wed, 25 Jun 2014 12:19:02 +0000 (16:19 +0400)
committerSteve French <smfrench@gmail.com>
Sat, 2 Aug 2014 06:23:03 +0000 (01:23 -0500)
If a server changes maximum buffer size for read requests (rsize)
on reconnect we can fail on repeating with a big size buffer on
-EAGAIN error in cifs_read. Fix this by checking rsize all the
time before repeating requests.

Reviewed-by: Shirish Pargaonkar <spargaonkar@suse.com>
Signed-off-by: Pavel Shilovsky <pshilovsky@samba.org>
Signed-off-by: Steve French <smfrench@gmail.com>
fs/cifs/file.c

index bbc38594b39a510b76cc0e18789b4aae80464e32..00b2a254ff1c8c1e60bd17c6794e5d7bb613c7c0 100644 (file)
@@ -3148,18 +3148,19 @@ cifs_read(struct file *file, char *read_data, size_t read_size, loff_t *offset)
 
        for (total_read = 0, cur_offset = read_data; read_size > total_read;
             total_read += bytes_read, cur_offset += bytes_read) {
-               current_read_size = min_t(uint, read_size - total_read, rsize);
-               /*
-                * For windows me and 9x we do not want to request more than it
-                * negotiated since it will refuse the read then.
-                */
-               if ((tcon->ses) && !(tcon->ses->capabilities &
+               do {
+                       current_read_size = min_t(uint, read_size - total_read,
+                                                 rsize);
+                       /*
+                        * For windows me and 9x we do not want to request more
+                        * than it negotiated since it will refuse the read
+                        * then.
+                        */
+                       if ((tcon->ses) && !(tcon->ses->capabilities &
                                tcon->ses->server->vals->cap_large_files)) {
-                       current_read_size = min_t(uint, current_read_size,
-                                       CIFSMaxBufSize);
-               }
-               rc = -EAGAIN;
-               while (rc == -EAGAIN) {
+                               current_read_size = min_t(uint,
+                                       current_read_size, CIFSMaxBufSize);
+                       }
                        if (open_file->invalidHandle) {
                                rc = cifs_reopen_file(open_file, true);
                                if (rc != 0)
@@ -3172,7 +3173,8 @@ cifs_read(struct file *file, char *read_data, size_t read_size, loff_t *offset)
                        rc = server->ops->sync_read(xid, open_file, &io_parms,
                                                    &bytes_read, &cur_offset,
                                                    &buf_type);
-               }
+               } while (rc == -EAGAIN);
+
                if (rc || (bytes_read == 0)) {
                        if (total_read) {
                                break;