void cl_page_list_init(struct cl_page_list *plist);
void cl_page_list_add(struct cl_page_list *plist, struct cl_page *page,
- bool get_ref);
+ bool getref);
void cl_page_list_move(struct cl_page_list *dst, struct cl_page_list *src,
struct cl_page *page);
void cl_page_list_move_head(struct cl_page_list *dst, struct cl_page_list *src,
void cl_page_list_splice(struct cl_page_list *list,
struct cl_page_list *head);
void cl_page_list_del(const struct lu_env *env,
- struct cl_page_list *plist, struct cl_page *page);
+ struct cl_page_list *plist, struct cl_page *page,
+ bool putref);
void cl_page_list_disown(const struct lu_env *env,
struct cl_page_list *plist);
void cl_page_list_assume(const struct lu_env *env,
rc = cl_sync_io_wait(env, anchor, 0);
cl_page_assume(env, io, page);
- cl_page_list_del(env, &queue->c2_qout, page);
+ cl_page_list_del(env, &queue->c2_qout, page, true);
if (!PageUptodate(cl_page_vmpage(page))) {
/* Failed to read a mirror, discard this page so that
while (plist->pl_nr > 0) {
page = cl_page_list_first(plist);
- cl_page_list_del(env, plist, page);
+ cl_page_list_del(env, plist, page, true);
cl_page_clip(env, page, 0, PAGE_SIZE);
* unless they were dirtied before. */
while (queue->pl_nr > 0) {
page = cl_page_list_first(queue);
- cl_page_list_del(env, queue, page);
+ cl_page_list_del(env, queue, page, true);
if (!PageDirty(cl_page_vmpage(page)))
cl_page_discard(env, io, page);
* Adds a page to a page list.
*/
void cl_page_list_add(struct cl_page_list *plist, struct cl_page *page,
- bool get_ref)
+ bool getref)
{
ENTRY;
/* it would be better to check that page is owned by "current" io, but
list_add_tail(&page->cp_batch, &plist->pl_pages);
++plist->pl_nr;
lu_ref_add_at(&page->cp_reference, &page->cp_queue_ref, "queue", plist);
- if (get_ref)
+ if (getref)
cl_page_get(page);
EXIT;
}
* Removes a page from a page list.
*/
void cl_page_list_del(const struct lu_env *env,
- struct cl_page_list *plist, struct cl_page *page)
+ struct cl_page_list *plist, struct cl_page *page,
+ bool putref)
{
LASSERT(plist->pl_nr > 0);
list_del_init(&page->cp_batch);
--plist->pl_nr;
lu_ref_del_at(&page->cp_reference, &page->cp_queue_ref, "queue", plist);
- cl_page_put(env, page);
+ if (putref)
+ cl_page_put(env, page);
EXIT;
}
EXPORT_SYMBOL(cl_page_list_del);
ENTRY;
cl_page_list_for_each_safe(page, temp, plist)
- cl_page_list_del(env, plist, page);
+ cl_page_list_del(env, plist, page, true);
LASSERT(plist->pl_nr == 0);
EXIT;
}
struct cl_page *page = cl_page_list_first(&sdio->csd_pages);
cl_page_delete(env, page);
- cl_page_list_del(env, &sdio->csd_pages, page);
+ cl_page_list_del(env, &sdio->csd_pages, page, false);
+ cl_page_put(env, page);
}
if (sdio->csd_unaligned) {
if (page->cp_sync_io != NULL)
cl_page_list_move(qout, qin, page);
else /* async IO */
- cl_page_list_del(env, qin, page);
+ cl_page_list_del(env, qin, page, true);
queued++;
if (queued == max_pages) {
osc_page_touch_at(env, osc2cl(osc), osc_index(opg),
page == last_page ? to : PAGE_SIZE);
- cl_page_list_del(env, qin, page);
+ cl_page_list_del(env, qin, page, true);
/* if there are no more slots, do the callback & reinit */
if (pagevec_add(pvec, page->cp_vmpage) == 0) {