mirror of
https://github.com/FEX-Emu/linux.git
synced 2025-01-01 14:52:32 +00:00
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: Boaz Harrosh <Boaz Harrosh bharrosh@panasas.com>
This commit is contained in:
parent
cd07202cc8
commit
7aebf4106b
@ -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
|
/* Called at the end of reads, to optionally unlock pages and update their
|
||||||
* status.
|
* status.
|
||||||
*/
|
*/
|
||||||
static int __readpages_done(struct page_collect *pcol, bool do_unlock)
|
static int __readpages_done(struct page_collect *pcol)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
u64 resid;
|
u64 resid;
|
||||||
@ -221,7 +221,7 @@ static int __readpages_done(struct page_collect *pcol, bool do_unlock)
|
|||||||
page_stat ? "bad_bytes" : "good_bytes");
|
page_stat ? "bad_bytes" : "good_bytes");
|
||||||
|
|
||||||
ret = update_read_page(page, page_stat);
|
ret = update_read_page(page, page_stat);
|
||||||
if (do_unlock)
|
if (!pcol->read_4_write)
|
||||||
unlock_page(page);
|
unlock_page(page);
|
||||||
length += PAGE_SIZE;
|
length += PAGE_SIZE;
|
||||||
}
|
}
|
||||||
@ -236,7 +236,7 @@ static void readpages_done(struct exofs_io_state *ios, void *p)
|
|||||||
{
|
{
|
||||||
struct page_collect *pcol = p;
|
struct page_collect *pcol = p;
|
||||||
|
|
||||||
__readpages_done(pcol, true);
|
__readpages_done(pcol);
|
||||||
atomic_dec(&pcol->sbi->s_curr_pending);
|
atomic_dec(&pcol->sbi->s_curr_pending);
|
||||||
kfree(pcol);
|
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_i_info *oi = exofs_i(pcol->inode);
|
||||||
struct exofs_io_state *ios = pcol->ios;
|
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)
|
if (!pcol->pages)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
/* see comment in _readpage() about sync reads */
|
|
||||||
WARN_ON(is_sync && (pcol->nr_pages != 1));
|
|
||||||
|
|
||||||
ios->pages = pcol->pages;
|
ios->pages = pcol->pages;
|
||||||
ios->nr_pages = pcol->nr_pages;
|
ios->nr_pages = pcol->nr_pages;
|
||||||
ios->length = pcol->length;
|
ios->length = pcol->length;
|
||||||
ios->offset = pcol->pg_first << PAGE_CACHE_SHIFT;
|
ios->offset = pcol->pg_first << PAGE_CACHE_SHIFT;
|
||||||
|
|
||||||
if (is_sync) {
|
if (pcol->read_4_write) {
|
||||||
exofs_oi_read(oi, pcol->ios);
|
exofs_oi_read(oi, pcol->ios);
|
||||||
return __readpages_done(pcol, false);
|
return __readpages_done(pcol);
|
||||||
}
|
}
|
||||||
|
|
||||||
pcol_copy = kmalloc(sizeof(*pcol_copy), GFP_KERNEL);
|
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;
|
return 0;
|
||||||
|
|
||||||
err:
|
err:
|
||||||
if (!is_sync)
|
if (!pcol->read_4_write)
|
||||||
_unlock_pcol_pages(pcol, ret, READ);
|
_unlock_pcol_pages(pcol, ret, READ);
|
||||||
|
|
||||||
pcol_free(pcol);
|
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,"
|
EXOFS_DBGMSG("readpage_strip(0x%lx, 0x%lx) empty page,"
|
||||||
" splitting\n", inode->i_ino, page->index);
|
" splitting\n", inode->i_ino, page->index);
|
||||||
|
|
||||||
return read_exec(pcol, false);
|
return read_exec(pcol);
|
||||||
}
|
}
|
||||||
|
|
||||||
try_again:
|
try_again:
|
||||||
@ -366,7 +363,7 @@ try_again:
|
|||||||
} else if (unlikely((pcol->pg_first + pcol->nr_pages) !=
|
} else if (unlikely((pcol->pg_first + pcol->nr_pages) !=
|
||||||
page->index)) {
|
page->index)) {
|
||||||
/* Discontinuity detected, split the request */
|
/* Discontinuity detected, split the request */
|
||||||
ret = read_exec(pcol, false);
|
ret = read_exec(pcol);
|
||||||
if (unlikely(ret))
|
if (unlikely(ret))
|
||||||
goto fail;
|
goto fail;
|
||||||
goto try_again;
|
goto try_again;
|
||||||
@ -391,7 +388,7 @@ try_again:
|
|||||||
page, len, pcol->nr_pages, pcol->length);
|
page, len, pcol->nr_pages, pcol->length);
|
||||||
|
|
||||||
/* split the request, and start again with current page */
|
/* split the request, and start again with current page */
|
||||||
ret = read_exec(pcol, false);
|
ret = read_exec(pcol);
|
||||||
if (unlikely(ret))
|
if (unlikely(ret))
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
||||||
@ -420,27 +417,24 @@ static int exofs_readpages(struct file *file, struct address_space *mapping,
|
|||||||
return ret;
|
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;
|
struct page_collect pcol;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
_pcol_init(&pcol, 1, page->mapping->host);
|
_pcol_init(&pcol, 1, page->mapping->host);
|
||||||
|
|
||||||
/* readpage_strip might call read_exec(,is_sync==false) at several
|
pcol.read_4_write = read_4_write;
|
||||||
* places but not if we have a single page.
|
|
||||||
*/
|
|
||||||
pcol.read_4_write = is_sync;
|
|
||||||
ret = readpage_strip(&pcol, page);
|
ret = readpage_strip(&pcol, page);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
EXOFS_ERR("_readpage => %d\n", ret);
|
EXOFS_ERR("_readpage => %d\n", ret);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
return read_exec(&pcol, is_sync);
|
return read_exec(&pcol);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
Loading…
Reference in New Issue
Block a user