Lines Matching refs:pcol
66 static void _pcol_init(struct page_collect *pcol, unsigned expected_pages, in _pcol_init() argument
71 pcol->sbi = sbi; in _pcol_init()
72 pcol->inode = inode; in _pcol_init()
73 pcol->expected_pages = expected_pages; in _pcol_init()
75 pcol->ios = NULL; in _pcol_init()
76 pcol->pages = NULL; in _pcol_init()
77 pcol->alloc_pages = 0; in _pcol_init()
78 pcol->nr_pages = 0; in _pcol_init()
79 pcol->length = 0; in _pcol_init()
80 pcol->pg_first = -1; in _pcol_init()
81 pcol->read_4_write = false; in _pcol_init()
82 pcol->that_locked_page = NULL; in _pcol_init()
85 static void _pcol_reset(struct page_collect *pcol) in _pcol_reset() argument
87 pcol->expected_pages -= min(pcol->nr_pages, pcol->expected_pages); in _pcol_reset()
89 pcol->pages = NULL; in _pcol_reset()
90 pcol->alloc_pages = 0; in _pcol_reset()
91 pcol->nr_pages = 0; in _pcol_reset()
92 pcol->length = 0; in _pcol_reset()
93 pcol->pg_first = -1; in _pcol_reset()
94 pcol->ios = NULL; in _pcol_reset()
95 pcol->that_locked_page = NULL; in _pcol_reset()
100 if (!pcol->expected_pages) in _pcol_reset()
101 pcol->expected_pages = in _pcol_reset()
102 exofs_max_io_pages(&pcol->sbi->layout, ~0); in _pcol_reset()
105 static int pcol_try_alloc(struct page_collect *pcol) in pcol_try_alloc() argument
110 pages = exofs_max_io_pages(&pcol->sbi->layout, pcol->expected_pages); in pcol_try_alloc()
113 pcol->pages = kmalloc_array(pages, sizeof(struct page *), in pcol_try_alloc()
115 if (likely(pcol->pages)) { in pcol_try_alloc()
116 pcol->alloc_pages = pages; in pcol_try_alloc()
122 pcol->expected_pages); in pcol_try_alloc()
126 static void pcol_free(struct page_collect *pcol) in pcol_free() argument
128 kfree(pcol->pages); in pcol_free()
129 pcol->pages = NULL; in pcol_free()
131 if (pcol->ios) { in pcol_free()
132 ore_put_io_state(pcol->ios); in pcol_free()
133 pcol->ios = NULL; in pcol_free()
137 static int pcol_add_page(struct page_collect *pcol, struct page *page, in pcol_add_page() argument
140 if (unlikely(pcol->nr_pages >= pcol->alloc_pages)) in pcol_add_page()
143 pcol->pages[pcol->nr_pages++] = page; in pcol_add_page()
144 pcol->length += len; in pcol_add_page()
195 static int __readpages_done(struct page_collect *pcol) in __readpages_done() argument
200 int ret = ore_check_io(pcol->ios, NULL); in __readpages_done()
203 good_bytes = pcol->length; in __readpages_done()
211 pcol->inode->i_ino, _LLU(good_bytes), pcol->length, in __readpages_done()
212 pcol->nr_pages); in __readpages_done()
214 for (i = 0; i < pcol->nr_pages; i++) { in __readpages_done()
215 struct page *page = pcol->pages[i]; in __readpages_done()
219 if (inode != pcol->inode) in __readpages_done()
232 if (!pcol->read_4_write) in __readpages_done()
237 pcol_free(pcol); in __readpages_done()
245 struct page_collect *pcol = p; in readpages_done() local
247 __readpages_done(pcol); in readpages_done()
248 atomic_dec(&pcol->sbi->s_curr_pending); in readpages_done()
249 kfree(pcol); in readpages_done()
252 static void _unlock_pcol_pages(struct page_collect *pcol, int ret, int rw) in _unlock_pcol_pages() argument
256 for (i = 0; i < pcol->nr_pages; i++) { in _unlock_pcol_pages()
257 struct page *page = pcol->pages[i]; in _unlock_pcol_pages()
269 struct page_collect *pcol_src, struct page_collect *pcol) in _maybe_not_all_in_one_io() argument
286 pcol->expected_pages += pages_less; in _maybe_not_all_in_one_io()
287 pcol->nr_pages = pages_less; in _maybe_not_all_in_one_io()
288 pcol->length = len_less; in _maybe_not_all_in_one_io()
290 pcol->pg_first = (*src_page)->index; in _maybe_not_all_in_one_io()
292 ret = pcol_try_alloc(pcol); in _maybe_not_all_in_one_io()
297 pcol->pages[i] = *src_page++; in _maybe_not_all_in_one_io()
302 pcol_src->nr_pages, pages_less, pcol->expected_pages, in _maybe_not_all_in_one_io()
303 pcol->pg_first * PAGE_SIZE, pcol->length); in _maybe_not_all_in_one_io()
308 static int read_exec(struct page_collect *pcol) in read_exec() argument
310 struct exofs_i_info *oi = exofs_i(pcol->inode); in read_exec()
315 if (!pcol->pages) in read_exec()
318 if (!pcol->ios) { in read_exec()
319 int ret = ore_get_rw_state(&pcol->sbi->layout, &oi->oc, true, in read_exec()
320 pcol->pg_first << PAGE_SHIFT, in read_exec()
321 pcol->length, &pcol->ios); in read_exec()
327 ios = pcol->ios; in read_exec()
328 ios->pages = pcol->pages; in read_exec()
330 if (pcol->read_4_write) { in read_exec()
331 ore_read(pcol->ios); in read_exec()
332 return __readpages_done(pcol); in read_exec()
341 *pcol_copy = *pcol; in read_exec()
346 _pcol_reset(pcol); in read_exec()
348 ret = _maybe_not_all_in_one_io(ios, pcol_copy, pcol); in read_exec()
353 pcol->inode->i_ino, _LLU(ios->offset), _LLU(ios->length)); in read_exec()
359 atomic_inc(&pcol->sbi->s_curr_pending); in read_exec()
365 pcol_copy = pcol; in read_exec()
382 struct page_collect *pcol = data; in readpage_strip() local
383 struct inode *inode = pcol->inode; in readpage_strip()
394 EXOFS_ERR("PageUptodate(0x%lx, 0x%lx)\n", pcol->inode->i_ino, in readpage_strip()
397 pcol->that_locked_page = page; in readpage_strip()
416 if (!pcol->read_4_write) in readpage_strip()
421 pcol->read_4_write, page->index, end_index); in readpage_strip()
423 return read_exec(pcol); in readpage_strip()
428 if (unlikely(pcol->pg_first == -1)) { in readpage_strip()
429 pcol->pg_first = page->index; in readpage_strip()
430 } else if (unlikely((pcol->pg_first + pcol->nr_pages) != in readpage_strip()
433 ret = read_exec(pcol); in readpage_strip()
439 if (!pcol->pages) { in readpage_strip()
440 ret = pcol_try_alloc(pcol); in readpage_strip()
451 ret = pcol_add_page(pcol, page, len); in readpage_strip()
455 page, len, pcol->nr_pages, pcol->length); in readpage_strip()
458 ret = read_exec(pcol); in readpage_strip()
476 struct page_collect pcol; in exofs_readpages() local
479 _pcol_init(&pcol, nr_pages, mapping->host); in exofs_readpages()
481 ret = read_cache_pages(mapping, pages, readpage_strip, &pcol); in exofs_readpages()
487 ret = read_exec(&pcol); in exofs_readpages()
491 return read_exec(&pcol); in exofs_readpages()
496 struct page_collect pcol; in _readpage() local
499 _pcol_init(&pcol, 1, page->mapping->host); in _readpage()
501 pcol.read_4_write = read_4_write; in _readpage()
502 ret = readpage_strip(&pcol, page); in _readpage()
508 return read_exec(&pcol); in _readpage()
522 struct page_collect *pcol = p; in writepages_done() local
528 atomic_dec(&pcol->sbi->s_curr_pending); in writepages_done()
531 good_bytes = pcol->length; in writepages_done()
539 pcol->inode->i_ino, _LLU(good_bytes), pcol->length, in writepages_done()
540 pcol->nr_pages); in writepages_done()
542 for (i = 0; i < pcol->nr_pages; i++) { in writepages_done()
543 struct page *page = pcol->pages[i]; in writepages_done()
547 if (inode != pcol->inode) in writepages_done()
563 pcol_free(pcol); in writepages_done()
564 kfree(pcol); in writepages_done()
570 struct page_collect *pcol = priv; in __r4w_get_page() local
573 if (!pcol->that_locked_page || in __r4w_get_page()
574 (pcol->that_locked_page->index != index)) { in __r4w_get_page()
576 loff_t i_size = i_size_read(pcol->inode); in __r4w_get_page()
584 page = find_get_page(pcol->inode->i_mapping, index); in __r4w_get_page()
586 page = find_or_create_page(pcol->inode->i_mapping, in __r4w_get_page()
600 pcol->that_locked_page->index); in __r4w_get_page()
602 return pcol->that_locked_page; in __r4w_get_page()
608 struct page_collect *pcol = priv; in __r4w_put_page() local
610 if ((pcol->that_locked_page != page) && (ZERO_PAGE(0) != page)) { in __r4w_put_page()
624 static int write_exec(struct page_collect *pcol) in write_exec() argument
626 struct exofs_i_info *oi = exofs_i(pcol->inode); in write_exec()
631 if (!pcol->pages) in write_exec()
634 BUG_ON(pcol->ios); in write_exec()
635 ret = ore_get_rw_state(&pcol->sbi->layout, &oi->oc, false, in write_exec()
636 pcol->pg_first << PAGE_SHIFT, in write_exec()
637 pcol->length, &pcol->ios); in write_exec()
648 *pcol_copy = *pcol; in write_exec()
650 ios = pcol->ios; in write_exec()
657 _pcol_reset(pcol); in write_exec()
659 ret = _maybe_not_all_in_one_io(ios, pcol_copy, pcol); in write_exec()
664 pcol->inode->i_ino, _LLU(ios->offset), _LLU(ios->length)); in write_exec()
672 atomic_inc(&pcol->sbi->s_curr_pending); in write_exec()
677 pcol_copy = pcol; in write_exec()
695 struct page_collect *pcol = data; in writepage_strip() local
696 struct inode *inode = pcol->inode; in writepage_strip()
719 ret = write_exec(pcol); in writepage_strip()
734 if (unlikely(pcol->pg_first == -1)) { in writepage_strip()
735 pcol->pg_first = page->index; in writepage_strip()
736 } else if (unlikely((pcol->pg_first + pcol->nr_pages) != in writepage_strip()
739 ret = write_exec(pcol); in writepage_strip()
748 if (!pcol->pages) { in writepage_strip()
749 ret = pcol_try_alloc(pcol); in writepage_strip()
757 ret = pcol_add_page(pcol, page, len); in writepage_strip()
761 pcol->nr_pages, pcol->length); in writepage_strip()
764 ret = write_exec(pcol); in writepage_strip()
789 struct page_collect pcol; in exofs_writepages() local
811 _pcol_init(&pcol, expected_pages, mapping->host); in exofs_writepages()
813 ret = write_cache_pages(mapping, wbc, writepage_strip, &pcol); in exofs_writepages()
819 ret = write_exec(&pcol); in exofs_writepages()
824 return write_exec(&pcol); /* pump the last reminder */ in exofs_writepages()
825 } else if (pcol.nr_pages) { in exofs_writepages()
829 for (i = 0; i < pcol.nr_pages; i++) { in exofs_writepages()
830 struct page *page = pcol.pages[i]; in exofs_writepages()