struct obdo *oa,
__u64 valid, struct obd_client_handle *och);
void mdc_exit_request(struct client_obd *cli);
-void mdc_enter_request(struct client_obd *cli);
+int mdc_enter_request(struct client_obd *cli);
int seq_client_init(struct lu_client_seq *seq,
struct obd_export *exp,
/* We record requests in flight in cli->cl_r_in_flight here.
* There is only one write rpc possible in mdc anyway. If this to change
* in the future - the code may need to be revisited. */
-void mdc_enter_request(struct client_obd *cli)
+int mdc_enter_request(struct client_obd *cli)
{
+ int rc = 0;
struct mdc_cache_waiter mcw;
- struct l_wait_info lwi = { 0 };
+ struct l_wait_info lwi = LWI_INTR(LWI_ON_SIGNAL_NOOP, NULL);
spin_lock(&cli->cl_loi_list_lock);
if (cli->cl_r_in_flight >= cli->cl_max_rpcs_in_flight) {
list_add_tail(&mcw.mcw_entry, &cli->cl_cache_waiters);
init_waitqueue_head(&mcw.mcw_waitq);
spin_unlock(&cli->cl_loi_list_lock);
- l_wait_event(mcw.mcw_waitq, mdc_req_avail(cli, &mcw), &lwi);
+ rc = l_wait_event(mcw.mcw_waitq, mdc_req_avail(cli, &mcw),
+ &lwi);
} else {
cli->cl_r_in_flight++;
spin_unlock(&cli->cl_loi_list_lock);
}
+ return rc;
}
void mdc_exit_request(struct client_obd *cli)
* threads that are serialised with rpc_lock are not polluting our
* rpcs in flight counter */
mdc_get_rpc_lock(obddev->u.cli.cl_rpc_lock, it);
- mdc_enter_request(&obddev->u.cli);
- rc = ldlm_cli_enqueue(exp, &req, einfo, res_id, &policy, &flags, NULL,
- 0, NULL, lockh, 0);
- mdc_exit_request(&obddev->u.cli);
+ rc = mdc_enter_request(&obddev->u.cli);
+ if (rc == 0) {
+ rc = ldlm_cli_enqueue(exp, &req, einfo, res_id, &policy, &flags,
+ NULL, 0, NULL, lockh, 0);
+ mdc_exit_request(&obddev->u.cli);
+ }
mdc_put_rpc_lock(obddev->u.cli.cl_rpc_lock, it);
if (rc < 0) {
CERROR("ldlm_cli_enqueue: %d\n", rc);
if (!req)
RETURN(-ENOMEM);
- mdc_enter_request(&obddev->u.cli);
+ rc = mdc_enter_request(&obddev->u.cli);
+ if (rc)
+ RETURN(rc);
rc = ldlm_cli_enqueue(exp, &req, einfo, res_id, &policy, &flags, NULL,
0, NULL, &minfo->mi_lockh, 1);
if (rc < 0) {
ptlrpc_req_set_repsize(req, bufcount, size);
- mdc_enter_request(&obddev->u.cli);
+ rc = mdc_enter_request(&obddev->u.cli);
+ if (rc != 0)
+ RETURN(rc);
rc = ptlrpc_queue_wait(req);
mdc_exit_request(&obddev->u.cli);
if (rc != 0)
[REQ_REC_OFF + 1] = 0, /* capa */
[REQ_REC_OFF + 2] = 0, /* name */
[REQ_REC_OFF + 3] = 0 };
- int rc, xattr_namelen = 0, bufcnt = 2, offset = REQ_REC_OFF + 1;
+ int rc = 0, xattr_namelen = 0, bufcnt = 2, offset = REQ_REC_OFF + 1;
void *tmp;
ENTRY;
/* make rpc */
if (opcode == MDS_SETXATTR || opcode == MDS_REINT)
mdc_get_rpc_lock(exp->exp_obd->u.cli.cl_rpc_lock, NULL);
- else
- mdc_enter_request(&obddev->u.cli);
+ else {
+ rc = mdc_enter_request(&obddev->u.cli);
+ if (rc != 0)
+ GOTO(err_out, rc);
+ }
rc = ptlrpc_queue_wait(req);