Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=d9df8d6b38228afab519094048aa2c082b0b2cf4
Commit:     d9df8d6b38228afab519094048aa2c082b0b2cf4
Parent:     070ea60214c1894c9eec86ca9aa5dff57a5ab525
Author:     Trond Myklebust <[EMAIL PROTECTED]>
AuthorDate: Tue May 22 10:22:20 2007 -0400
Committer:  Trond Myklebust <[EMAIL PROTECTED]>
CommitDate: Tue Jul 10 23:40:23 2007 -0400

    NFS: Don't fail an O_DIRECT read/write if get_user_pages() returns pages
    
    There is no need to fail the entire O_DIRECT read/write just because
    get_user_pages() returned fewer pages than we requested.
    
    Signed-off-by: Trond Myklebust <[EMAIL PROTECTED]>
---
 fs/nfs/direct.c |   22 ++++++++++++++++------
 1 files changed, 16 insertions(+), 6 deletions(-)

diff --git a/fs/nfs/direct.c b/fs/nfs/direct.c
index 4c97e55..f1b153a 100644
--- a/fs/nfs/direct.c
+++ b/fs/nfs/direct.c
@@ -295,9 +295,14 @@ static ssize_t nfs_direct_read_schedule(struct 
nfs_direct_req *dreq, unsigned lo
                        break;
                }
                if ((unsigned)result < data->npages) {
-                       nfs_direct_release_pages(data->pagevec, result);
-                       nfs_readdata_release(data);
-                       break;
+                       bytes = result * PAGE_SIZE;
+                       if (bytes <= pgbase) {
+                               nfs_direct_release_pages(data->pagevec, result);
+                               nfs_readdata_release(data);
+                               break;
+                       }
+                       bytes -= pgbase;
+                       data->npages = result;
                }
 
                get_dreq(dreq);
@@ -630,9 +635,14 @@ static ssize_t nfs_direct_write_schedule(struct 
nfs_direct_req *dreq, unsigned l
                        break;
                }
                if ((unsigned)result < data->npages) {
-                       nfs_direct_release_pages(data->pagevec, result);
-                       nfs_writedata_release(data);
-                       break;
+                       bytes = result * PAGE_SIZE;
+                       if (bytes <= pgbase) {
+                               nfs_direct_release_pages(data->pagevec, result);
+                               nfs_writedata_release(data);
+                               break;
+                       }
+                       bytes -= pgbase;
+                       data->npages = result;
                }
 
                get_dreq(dreq);
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to