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

Commit 7aebf410 authored by Boaz Harrosh's avatar Boaz Harrosh Committed by Boaz Harrosh
Browse files

exofs: Cleaup read path in regard with read_for_write



Last BUG fix added a flag to the the page_collect structure
to communicate with readpage_strip. This calls for a clean up
removing that flag's reincarnations in the read functions
parameters.

Signed-off-by: default avatarBoaz Harrosh &lt;Boaz Harrosh <bharrosh@panasas.com>
parent cd07202c
Loading
Loading
Loading
Loading
+14 −20
Original line number Diff line number Diff line
@@ -185,7 +185,7 @@ static void update_write_page(struct page *page, int ret)
/* Called at the end of reads, to optionally unlock pages and update their
 * status.
 */
static int __readpages_done(struct page_collect *pcol, bool do_unlock)
static int __readpages_done(struct page_collect *pcol)
{
	int i;
	u64 resid;
@@ -221,7 +221,7 @@ static int __readpages_done(struct page_collect *pcol, bool do_unlock)
			  page_stat ? "bad_bytes" : "good_bytes");

		ret = update_read_page(page, page_stat);
		if (do_unlock)
		if (!pcol->read_4_write)
			unlock_page(page);
		length += PAGE_SIZE;
	}
@@ -236,7 +236,7 @@ static void readpages_done(struct exofs_io_state *ios, void *p)
{
	struct page_collect *pcol = p;

	__readpages_done(pcol, true);
	__readpages_done(pcol);
	atomic_dec(&pcol->sbi->s_curr_pending);
	kfree(pcol);
}
@@ -257,7 +257,7 @@ static void _unlock_pcol_pages(struct page_collect *pcol, int ret, int rw)
	}
}

static int read_exec(struct page_collect *pcol, bool is_sync)
static int read_exec(struct page_collect *pcol)
{
	struct exofs_i_info *oi = exofs_i(pcol->inode);
	struct exofs_io_state *ios = pcol->ios;
@@ -267,17 +267,14 @@ static int read_exec(struct page_collect *pcol, bool is_sync)
	if (!pcol->pages)
		return 0;

	/* see comment in _readpage() about sync reads */
	WARN_ON(is_sync && (pcol->nr_pages != 1));

	ios->pages = pcol->pages;
	ios->nr_pages = pcol->nr_pages;
	ios->length = pcol->length;
	ios->offset = pcol->pg_first << PAGE_CACHE_SHIFT;

	if (is_sync) {
	if (pcol->read_4_write) {
		exofs_oi_read(oi, pcol->ios);
		return __readpages_done(pcol, false);
		return __readpages_done(pcol);
	}

	pcol_copy = kmalloc(sizeof(*pcol_copy), GFP_KERNEL);
@@ -303,7 +300,7 @@ static int read_exec(struct page_collect *pcol, bool is_sync)
	return 0;

err:
	if (!is_sync)
	if (!pcol->read_4_write)
		_unlock_pcol_pages(pcol, ret, READ);

	pcol_free(pcol);
@@ -356,7 +353,7 @@ static int readpage_strip(void *data, struct page *page)
		EXOFS_DBGMSG("readpage_strip(0x%lx, 0x%lx) empty page,"
			     " splitting\n", inode->i_ino, page->index);

		return read_exec(pcol, false);
		return read_exec(pcol);
	}

try_again:
@@ -366,7 +363,7 @@ try_again:
	} else if (unlikely((pcol->pg_first + pcol->nr_pages) !=
		   page->index)) {
		/* Discontinuity detected, split the request */
		ret = read_exec(pcol, false);
		ret = read_exec(pcol);
		if (unlikely(ret))
			goto fail;
		goto try_again;
@@ -391,7 +388,7 @@ try_again:
			  page, len, pcol->nr_pages, pcol->length);

		/* split the request, and start again with current page */
		ret = read_exec(pcol, false);
		ret = read_exec(pcol);
		if (unlikely(ret))
			goto fail;

@@ -420,27 +417,24 @@ static int exofs_readpages(struct file *file, struct address_space *mapping,
		return ret;
	}

	return read_exec(&pcol, false);
	return read_exec(&pcol);
}

static int _readpage(struct page *page, bool is_sync)
static int _readpage(struct page *page, bool read_4_write)
{
	struct page_collect pcol;
	int ret;

	_pcol_init(&pcol, 1, page->mapping->host);

	/* readpage_strip might call read_exec(,is_sync==false) at several
	 * places but not if we have a single page.
	 */
	pcol.read_4_write = is_sync;
	pcol.read_4_write = read_4_write;
	ret = readpage_strip(&pcol, page);
	if (ret) {
		EXOFS_ERR("_readpage => %d\n", ret);
		return ret;
	}

	return read_exec(&pcol, is_sync);
	return read_exec(&pcol);
}

/*