struct obd_device *obddev = class_conn2obd(conn);
struct obd_ioctl_data *data = karg;
struct obd_import *imp = obddev->u.cli.cl_import;
+ int rc;
ENTRY;
-
+
switch (cmd) {
case OBD_IOC_CLIENT_RECOVER:
- RETURN(ptlrpc_recover_import(imp, data->ioc_inlbuf1));
+ rc = ptlrpc_recover_import(imp, data->ioc_inlbuf1);
+ if (rc < 0)
+ RETURN(rc);
+ RETURN(0);
case IOC_OSC_SET_ACTIVE:
RETURN(ptlrpc_set_import_active(imp, data->ioc_offset));
default:
RETURN(err);
}
-#warning this needs to change after robert fixes eviction handling
static int after_reply(struct ptlrpc_request *req, int *restartp)
{
unsigned long flags;
RETURN(-ENOTCONN);
}
- ptlrpc_request_handle_eviction(req);
+ ptlrpc_request_handle_notconn(req);
if (req->rq_err)
RETURN(-EIO);
req->rq_import_generation < imp->imp_generation)
rc = -EIO;
-
if (rc) {
spin_unlock_irqrestore(&imp->imp_lock, flags);
GOTO(out, rc);
int ptlrpc_get_ldlm_hooks(void);
void ptlrpc_daemonize(void);
-void ptlrpc_request_handle_eviction(struct ptlrpc_request *);
+void ptlrpc_request_handle_notconn(struct ptlrpc_request *);
void lustre_assert_wire_constants(void);
void ptlrpc_lprocfs_register_service(struct obd_device *obddev,
EXIT;
}
-void ptlrpc_request_handle_eviction(struct ptlrpc_request *failed_req)
+void ptlrpc_request_handle_notconn(struct ptlrpc_request *failed_req)
{
int rc;
struct obd_import *imp= failed_req->rq_import;
unsigned long flags;
ENTRY;
- CDEBUG(D_HA, "import %s of %s@%s evicted: reconnecting\n",
+ CDEBUG(D_HA, "import %s of %s@%s abruptly disconnected: reconnecting\n",
imp->imp_obd->obd_name,
imp->imp_target_uuid.uuid,
imp->imp_connection->c_remote_uuid.uuid);
rc = ptlrpc_recover_import(imp, NULL);
- if (rc) {
+ if (rc < 0) {
ptlrpc_resend_req(failed_req);
if (rc != -EALREADY)
ptlrpc_handle_failed_import(imp);
+ } else if (rc == RECON_RESULT_RECOVERING) {
+ ptlrpc_resend_req(failed_req);
} else {
+ if (rc != RECON_RESULT_EVICTED) {
+ /* like LBUG, without the locking up */
+ CERROR("unknown recover_import result %d\n", rc);
+ portals_debug_dumplog();
+ portals_run_lbug_upcall(__FILE__, __FUNCTION__,
+ __LINE__);
+ }
LASSERT(failed_req->rq_import_generation < imp->imp_generation);
spin_lock_irqsave (&failed_req->rq_lock, flags);
failed_req->rq_err = 1;
imp->imp_target_uuid.uuid,
imp->imp_connection->c_remote_uuid.uuid);
ptlrpc_set_import_active(imp, 0);
-// ptlrpc_invalidate_import_state(imp);
} else {
LBUG();
}
ptlrpc_wake_delayed(imp);
EXIT;
+ if (!rc)
+ rc = recon_result;
out:
return rc;
}