diff options
-rw-r--r-- | fs/exofs/inode.c | 34 |
1 files changed, 14 insertions, 20 deletions
diff --git a/fs/exofs/inode.c b/fs/exofs/inode.c index 3eadd97324b..24ab327a20c 100644 --- a/fs/exofs/inode.c +++ b/fs/exofs/inode.c @@ -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); } /* |