b=18213 Handle the signal to avoid process hang.
Change-Id: Ic730d98fb812bc9dbb5249847a6115a84d67758b
Signed-off-by: Yang Sheng <ys@whamcloud.com>
Reviewed-on: http://review.whamcloud.com/470
Reviewed-by: Fan Yong <yong.fan@whamcloud.com>
Tested-by: Hudson
Reviewed-by: Oleg Drokin <green@whamcloud.com>
void mdc_rename_pack(struct ptlrpc_request *req, struct md_op_data *op_data,
const char *old, int oldlen, const char *new, int newlen);
void mdc_close_pack(struct ptlrpc_request *req, struct md_op_data *op_data);
void mdc_rename_pack(struct ptlrpc_request *req, struct md_op_data *op_data,
const char *old, int oldlen, const char *new, int newlen);
void mdc_close_pack(struct ptlrpc_request *req, struct md_op_data *op_data);
-void mdc_enter_request(struct client_obd *cli);
+int mdc_enter_request(struct client_obd *cli);
void mdc_exit_request(struct client_obd *cli);
/* mdc/mdc_locks.c */
void mdc_exit_request(struct client_obd *cli);
/* mdc/mdc_locks.c */
/* 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. */
/* 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)
struct mdc_cache_waiter mcw;
struct mdc_cache_waiter mcw;
- struct l_wait_info lwi = { 0 };
+ struct l_wait_info lwi = LWI_INTR(LWI_ON_SIGNAL_NOOP, NULL);
client_obd_list_lock(&cli->cl_loi_list_lock);
if (cli->cl_r_in_flight >= cli->cl_max_rpcs_in_flight) {
cfs_list_add_tail(&mcw.mcw_entry, &cli->cl_cache_waiters);
cfs_waitq_init(&mcw.mcw_waitq);
client_obd_list_unlock(&cli->cl_loi_list_lock);
client_obd_list_lock(&cli->cl_loi_list_lock);
if (cli->cl_r_in_flight >= cli->cl_max_rpcs_in_flight) {
cfs_list_add_tail(&mcw.mcw_entry, &cli->cl_cache_waiters);
cfs_waitq_init(&mcw.mcw_waitq);
client_obd_list_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);
+ if (rc) {
+ client_obd_list_lock(&cli->cl_loi_list_lock);
+ if (cfs_list_empty(&mcw.mcw_entry))
+ cli->cl_r_in_flight--;
+ cfs_list_del_init(&mcw.mcw_entry);
+ client_obd_list_unlock(&cli->cl_loi_list_lock);
+ }
} else {
cli->cl_r_in_flight++;
client_obd_list_unlock(&cli->cl_loi_list_lock);
}
} else {
cli->cl_r_in_flight++;
client_obd_list_unlock(&cli->cl_loi_list_lock);
}
}
void mdc_exit_request(struct client_obd *cli)
}
void mdc_exit_request(struct client_obd *cli)
* rpcs in flight counter. We do not do flock request limiting, though*/
if (it) {
mdc_get_rpc_lock(obddev->u.cli.cl_rpc_lock, it);
* rpcs in flight counter. We do not do flock request limiting, though*/
if (it) {
mdc_get_rpc_lock(obddev->u.cli.cl_rpc_lock, it);
- mdc_enter_request(&obddev->u.cli);
+ rc = mdc_enter_request(&obddev->u.cli);
+ if (rc != 0) {
+ mdc_put_rpc_lock(obddev->u.cli.cl_rpc_lock, it);
+ ptlrpc_req_finished(req);
+ RETURN(rc);
+ }
}
rc = ldlm_cli_enqueue(exp, &req, einfo, &res_id, policy, &flags, NULL,
}
rc = ldlm_cli_enqueue(exp, &req, einfo, &res_id, policy, &flags, NULL,
.l_inodebits = { MDS_INODELOCK_LOOKUP |
MDS_INODELOCK_UPDATE }
};
.l_inodebits = { MDS_INODELOCK_LOOKUP |
MDS_INODELOCK_UPDATE }
};
int flags = LDLM_FL_HAS_INTENT;
ENTRY;
int flags = LDLM_FL_HAS_INTENT;
ENTRY;
if (!req)
RETURN(-ENOMEM);
if (!req)
RETURN(-ENOMEM);
- mdc_enter_request(&obddev->u.cli);
+ rc = mdc_enter_request(&obddev->u.cli);
+ if (rc != 0) {
+ ptlrpc_req_finished(req);
+ RETURN(rc);
+ }
+
rc = ldlm_cli_enqueue(exp, &req, einfo, &res_id, &policy, &flags, NULL,
0, &minfo->mi_lockh, 1);
if (rc < 0) {
mdc_exit_request(&obddev->u.cli);
rc = ldlm_cli_enqueue(exp, &req, einfo, &res_id, &policy, &flags, NULL,
0, &minfo->mi_lockh, 1);
if (rc < 0) {
mdc_exit_request(&obddev->u.cli);
+ ptlrpc_req_finished(req);
struct osc_async_page *oap)
{
struct osc_cache_waiter ocw;
struct osc_async_page *oap)
{
struct osc_cache_waiter ocw;
- struct l_wait_info lwi = { 0 };
+ struct l_wait_info lwi = LWI_INTR(LWI_ON_SIGNAL_NOOP, NULL);