diff options
-rw-r--r-- | fs/nfs/pagelist.c | 16 |
1 files changed, 9 insertions, 7 deletions
diff --git a/fs/nfs/pagelist.c b/fs/nfs/pagelist.c index ed4e1b07447b..15c254753f88 100644 --- a/fs/nfs/pagelist.c +++ b/fs/nfs/pagelist.c | |||
@@ -1251,20 +1251,22 @@ static void nfs_pageio_complete_mirror(struct nfs_pageio_descriptor *desc, | |||
1251 | int nfs_pageio_resend(struct nfs_pageio_descriptor *desc, | 1251 | int nfs_pageio_resend(struct nfs_pageio_descriptor *desc, |
1252 | struct nfs_pgio_header *hdr) | 1252 | struct nfs_pgio_header *hdr) |
1253 | { | 1253 | { |
1254 | LIST_HEAD(failed); | 1254 | LIST_HEAD(pages); |
1255 | 1255 | ||
1256 | desc->pg_io_completion = hdr->io_completion; | 1256 | desc->pg_io_completion = hdr->io_completion; |
1257 | desc->pg_dreq = hdr->dreq; | 1257 | desc->pg_dreq = hdr->dreq; |
1258 | while (!list_empty(&hdr->pages)) { | 1258 | list_splice_init(&hdr->pages, &pages); |
1259 | struct nfs_page *req = nfs_list_entry(hdr->pages.next); | 1259 | while (!list_empty(&pages)) { |
1260 | struct nfs_page *req = nfs_list_entry(pages.next); | ||
1260 | 1261 | ||
1261 | if (!nfs_pageio_add_request(desc, req)) | 1262 | if (!nfs_pageio_add_request(desc, req)) |
1262 | nfs_list_move_request(req, &failed); | 1263 | break; |
1263 | } | 1264 | } |
1264 | nfs_pageio_complete(desc); | 1265 | nfs_pageio_complete(desc); |
1265 | if (!list_empty(&failed)) { | 1266 | if (!list_empty(&pages)) { |
1266 | list_move(&failed, &hdr->pages); | 1267 | int err = desc->pg_error < 0 ? desc->pg_error : -EIO; |
1267 | return desc->pg_error < 0 ? desc->pg_error : -EIO; | 1268 | hdr->completion_ops->error_cleanup(&pages, err); |
1269 | return err; | ||
1268 | } | 1270 | } |
1269 | return 0; | 1271 | return 0; |
1270 | } | 1272 | } |