]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - fs/nfs/direct.c
Merge branch 'pnfs_generic'
[karo-tx-linux.git] / fs / nfs / direct.c
index a9a93927fe3e31af8228bc9bd2dca8e6c41be047..7ab7ec9f4eed8a0212d2079d7c2c79cb331d7a20 100644 (file)
@@ -664,6 +664,10 @@ static void nfs_direct_write_reschedule(struct nfs_direct_req *dreq)
 
        req = nfs_list_entry(reqs.next);
        nfs_direct_setup_mirroring(dreq, &desc, req);
+       if (desc.pg_error < 0) {
+               list_splice_init(&reqs, &failed);
+               goto out_failed;
+       }
 
        list_for_each_entry_safe(req, tmp, &reqs, wb_list) {
                if (!nfs_pageio_add_request(&desc, req)) {
@@ -671,13 +675,17 @@ static void nfs_direct_write_reschedule(struct nfs_direct_req *dreq)
                        nfs_list_add_request(req, &failed);
                        spin_lock(cinfo.lock);
                        dreq->flags = 0;
-                       dreq->error = -EIO;
+                       if (desc.pg_error < 0)
+                               dreq->error = desc.pg_error;
+                       else
+                               dreq->error = -EIO;
                        spin_unlock(cinfo.lock);
                }
                nfs_release_request(req);
        }
        nfs_pageio_complete(&desc);
 
+out_failed:
        while (!list_empty(&failed)) {
                req = nfs_list_entry(failed.next);
                nfs_list_remove_request(req);
@@ -915,6 +923,11 @@ static ssize_t nfs_direct_write_schedule_iovec(struct nfs_direct_req *dreq,
                        }
 
                        nfs_direct_setup_mirroring(dreq, &desc, req);
+                       if (desc.pg_error < 0) {
+                               nfs_free_request(req);
+                               result = desc.pg_error;
+                               break;
+                       }
 
                        nfs_lock_request(req);
                        req->wb_index = pos >> PAGE_SHIFT;