Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=8b1f9ee56e21e505a3d5d3e33f823006d1abdbaf
Commit:     8b1f9ee56e21e505a3d5d3e33f823006d1abdbaf
Parent:     77f111929d024165e736e919187cff017279bebe
Author:     Trond Myklebust <[EMAIL PROTECTED]>
AuthorDate: Tue Jan 22 17:13:06 2008 -0500
Committer:  Trond Myklebust <[EMAIL PROTECTED]>
CommitDate: Wed Jan 30 02:05:23 2008 -0500

    NFS: Optimise nfs_vm_page_mkwrite()
    
    The current model locks the page twice for no good reason. Optimise by
    inlining the parts of nfs_write_begin()/nfs_write_end() that we care about.
    
    Signed-off-by: Trond Myklebust <[EMAIL PROTECTED]>
---
 fs/nfs/file.c |   36 ++++++++++++++----------------------
 1 files changed, 14 insertions(+), 22 deletions(-)

diff --git a/fs/nfs/file.c b/fs/nfs/file.c
index b3bb89f..4560fc2 100644
--- a/fs/nfs/file.c
+++ b/fs/nfs/file.c
@@ -392,35 +392,27 @@ static int nfs_vm_page_mkwrite(struct vm_area_struct 
*vma, struct page *page)
        struct file *filp = vma->vm_file;
        unsigned pagelen;
        int ret = -EINVAL;
-       void *fsdata;
        struct address_space *mapping;
-       loff_t offset;
 
        lock_page(page);
        mapping = page->mapping;
-       if (mapping != vma->vm_file->f_path.dentry->d_inode->i_mapping) {
-               unlock_page(page);
-               return -EINVAL;
-       }
+       if (mapping != vma->vm_file->f_path.dentry->d_inode->i_mapping)
+               goto out_unlock;
+
+       ret = 0;
        pagelen = nfs_page_length(page);
-       offset = (loff_t)page->index << PAGE_CACHE_SHIFT;
-       unlock_page(page);
+       if (pagelen == 0)
+               goto out_unlock;
 
-       /*
-        * we can use mapping after releasing the page lock, because:
-        * we hold mmap_sem on the fault path, which should pin the vma
-        * which should pin the file, which pins the dentry which should
-        * hold a reference on inode.
-        */
+       ret = nfs_flush_incompatible(filp, page);
+       if (ret != 0)
+               goto out_unlock;
 
-       if (pagelen) {
-               struct page *page2 = NULL;
-               ret = nfs_write_begin(filp, mapping, offset, pagelen,
-                               0, &page2, &fsdata);
-               if (!ret)
-                       ret = nfs_write_end(filp, mapping, offset, pagelen,
-                                       pagelen, page2, fsdata);
-       }
+       ret = nfs_updatepage(filp, page, 0, pagelen);
+       if (ret == 0)
+               ret = pagelen;
+out_unlock:
+       unlock_page(page);
        return ret;
 }
 
-
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