aboutsummaryrefslogtreecommitdiffstats
path: root/fs/exofs
diff options
context:
space:
mode:
authorBoaz Harrosh <bharrosh@panasas.com>2010-11-22 11:02:45 -0500
committerBoaz Harrosh <bharrosh@panasas.com>2011-03-15 09:02:49 -0400
commita8f1418f9e9bd4c487a7b703ff26c5dd5ceb2bf3 (patch)
tree9d72e1be99cf2eb4c8a35cfa8ac3df69dfbca01a /fs/exofs
parent0a935519cca83f26dc15e7577fa6c2b39606a4ac (diff)
exofs: Optimize read_4_write
Don't attempt a read passed i_size, just zero the page and be done with it. Signed-off-by: Boaz Harrosh <bharrosh@panasas.com>
Diffstat (limited to 'fs/exofs')
-rw-r--r--fs/exofs/inode.c25
1 files changed, 22 insertions, 3 deletions
diff --git a/fs/exofs/inode.c b/fs/exofs/inode.c
index a7555238c41a..c8f58a96e597 100644
--- a/fs/exofs/inode.c
+++ b/fs/exofs/inode.c
@@ -350,8 +350,10 @@ static int readpage_strip(void *data, struct page *page)
350 350
351 if (!pcol->read_4_write) 351 if (!pcol->read_4_write)
352 unlock_page(page); 352 unlock_page(page);
353 EXOFS_DBGMSG("readpage_strip(0x%lx, 0x%lx) empty page," 353 EXOFS_DBGMSG("readpage_strip(0x%lx) empty page len=%zx "
354 " splitting\n", inode->i_ino, page->index); 354 "read_4_write=%d index=0x%lx end_index=0x%lx "
355 "splitting\n", inode->i_ino, len,
356 pcol->read_4_write, page->index, end_index);
355 357
356 return read_exec(pcol); 358 return read_exec(pcol);
357 } 359 }
@@ -722,11 +724,28 @@ int exofs_write_begin(struct file *file, struct address_space *mapping,
722 724
723 /* read modify write */ 725 /* read modify write */
724 if (!PageUptodate(page) && (len != PAGE_CACHE_SIZE)) { 726 if (!PageUptodate(page) && (len != PAGE_CACHE_SIZE)) {
727 loff_t i_size = i_size_read(mapping->host);
728 pgoff_t end_index = i_size >> PAGE_CACHE_SHIFT;
729 size_t rlen;
730
731 if (page->index < end_index)
732 rlen = PAGE_CACHE_SIZE;
733 else if (page->index == end_index)
734 rlen = i_size & ~PAGE_CACHE_MASK;
735 else
736 rlen = 0;
737
738 if (!rlen) {
739 clear_highpage(page);
740 SetPageUptodate(page);
741 goto out;
742 }
743
725 ret = _readpage(page, true); 744 ret = _readpage(page, true);
726 if (ret) { 745 if (ret) {
727 /*SetPageError was done by _readpage. Is it ok?*/ 746 /*SetPageError was done by _readpage. Is it ok?*/
728 unlock_page(page); 747 unlock_page(page);
729 EXOFS_DBGMSG("__readpage_filler failed\n"); 748 EXOFS_DBGMSG("__readpage failed\n");
730 } 749 }
731 } 750 }
732out: 751out: