struct address_space *mapping;
int result = 0;
+ ENTRY;
+
LASSERT(PageLocked(vmpage));
if (PageWriteback(vmpage) || PageDirty(vmpage))
- return 0;
+ RETURN(0);
mapping = vmpage->mapping;
if (mapping == NULL)
- return 1;
+ RETURN(1);
obj = ll_i2info(mapping->host)->lli_clob;
if (obj == NULL)
- return 1;
+ RETURN(1);
page = cl_vmpage_page(vmpage, obj);
if (page == NULL)
- return 1;
+ RETURN(1);
env = cl_env_percpu_get();
LASSERT(!IS_ERR(env));
cl_page_put(env, page);
cl_env_percpu_put(env);
- return result;
+ RETURN(result);
}
#if defined(HAVE_DIRECTIO_ITER) || defined(HAVE_IOV_ITER_RW) || \
struct page *vmpage = cl2vm_page(slice);
struct vvp_page *vpg = cl2vvp_page(slice);
+ ENTRY;
+
LASSERT(vmpage != NULL);
LASSERT(PageLocked(vmpage));
ll_ra_stats_inc(vmpage->mapping->host, RA_STAT_DISCARDED);
generic_error_remove_page(vmpage->mapping, vmpage);
+
+ EXIT;
}
static void vvp_page_delete(const struct lu_env *env,
struct cl_page *page = slice->cpl_page;
int refc;
+ ENTRY;
+
LASSERT(PageLocked(vmpage));
LASSERT((struct cl_page *)vmpage->private == page);
-
/* Drop the reference count held in vvp_page_init */
refc = atomic_dec_return(&page->cp_ref);
LASSERTF(refc >= 1, "page = %p, refc = %d\n", page, refc);
* Reference from vmpage to cl_page is removed, but the reference back
* is still here. It is removed later in vvp_page_fini().
*/
+
+ EXIT;
}
static void vvp_page_export(const struct lu_env *env,
RETURN(rc);
}
+ /* Avoid deadlock with modifying RPCs on MDS_REQUEST_PORTAL
+ * See LU-15245
+ */
+ req->rq_request_portal = MDS_READPAGE_PORTAL;
+
again:
mdc_pack_body(&req->rq_pill, &op_data->op_fid1, op_data->op_valid,
op_data->op_mode, -1, 0);
} else {
mdc_pack_body(&req->rq_pill, fid, valid, output_size,
suppgid, flags);
+ /* Avoid deadlock with modifying RPCs on MDS_REQUEST_PORTAL
+ * See LU-15245
+ */
+ req->rq_request_portal = MDS_READPAGE_PORTAL;
}
if (xattr_name) {