Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a8f1418f authored by Boaz Harrosh's avatar Boaz Harrosh
Browse files

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: default avatarBoaz Harrosh <bharrosh@panasas.com>
parent 0a935519
Loading
Loading
Loading
Loading
+22 −3
Original line number Diff line number Diff line
@@ -350,8 +350,10 @@ static int readpage_strip(void *data, struct page *page)

		if (!pcol->read_4_write)
			unlock_page(page);
		EXOFS_DBGMSG("readpage_strip(0x%lx, 0x%lx) empty page,"
			     " splitting\n", inode->i_ino, page->index);
		EXOFS_DBGMSG("readpage_strip(0x%lx) empty page len=%zx "
			     "read_4_write=%d index=0x%lx end_index=0x%lx "
			     "splitting\n", inode->i_ino, len,
			     pcol->read_4_write, page->index, end_index);

		return read_exec(pcol);
	}
@@ -722,11 +724,28 @@ int exofs_write_begin(struct file *file, struct address_space *mapping,

	 /* read modify write */
	if (!PageUptodate(page) && (len != PAGE_CACHE_SIZE)) {
		loff_t i_size = i_size_read(mapping->host);
		pgoff_t end_index = i_size >> PAGE_CACHE_SHIFT;
		size_t rlen;

		if (page->index < end_index)
			rlen = PAGE_CACHE_SIZE;
		else if (page->index == end_index)
			rlen = i_size & ~PAGE_CACHE_MASK;
		else
			rlen = 0;

		if (!rlen) {
			clear_highpage(page);
			SetPageUptodate(page);
			goto out;
		}

		ret = _readpage(page, true);
		if (ret) {
			/*SetPageError was done by _readpage. Is it ok?*/
			unlock_page(page);
			EXOFS_DBGMSG("__readpage_filler failed\n");
			EXOFS_DBGMSG("__readpage failed\n");
		}
	}
out: