CIFS: Fix readpages retrying on reconnects
authorPavel Shilovsky <pshilovsky@samba.org>
Thu, 2 Oct 2014 16:13:35 +0000 (20:13 +0400)
committerSteve French <smfrench@gmail.com>
Thu, 2 Oct 2014 19:17:41 +0000 (14:17 -0500)
If we got a reconnect error from async readv we re-add pages back
to page_list and continue loop. That is wrong because these pages
have been already added to the pagecache but page_list has pages that
have not been added to the pagecache yet. This ends up with a general
protection fault in put_pages after readpages. Fix it by not retrying
the read of these pages and falling back to readpage instead.

Fixes debian bug 762306

Signed-off-by: Pavel Shilovsky <pshilovsky@samba.org>
Signed-off-by: Steve French <smfrench@gmail.com>
Tested-by: Arthur Marsh <arthur.marsh@internode.on.net>
fs/cifs/file.c

index 7c018a1c52f7d474ce3b6d5ffb63c62485db831b..5f29354b072abfe2a44a4303edc92854c1959082 100644 (file)
@@ -3568,15 +3568,9 @@ static int cifs_readpages(struct file *file, struct address_space *mapping,
                                lru_cache_add_file(page);
                                unlock_page(page);
                                page_cache_release(page);
-                               if (rc == -EAGAIN)
-                                       list_add_tail(&page->lru, &tmplist);
                        }
+                       /* Fallback to the readpage in error/reconnect cases */
                        kref_put(&rdata->refcount, cifs_readdata_release);
-                       if (rc == -EAGAIN) {
-                               /* Re-add pages to the page_list and retry */
-                               list_splice(&tmplist, page_list);
-                               continue;
-                       }
                        break;
                }