int ptlrpc_check_suspend(void);
void ptlrpc_activate_timeouts(void);
void ptlrpc_deactivate_timeouts(void);
+int ptlrpc_import_control_recovery(struct obd_import *imp, int disable);
#endif
#define IOC_OSC_TYPE 'h'
#define IOC_OSC_MIN_NR 20
#define IOC_OSC_SET_ACTIVE _IOWR(IOC_OSC_TYPE, 21, struct obd_device *)
+#define IOC_OSC_CTL_RECOVERY _IOWR(IOC_OSC_TYPE, 22, struct obd_device *)
#define IOC_OSC_MAX_NR 50
#define IOC_MDC_TYPE 'i'
case IOC_OSC_SET_ACTIVE:
rc = ptlrpc_set_import_active(imp, data->ioc_offset);
GOTO(out, rc);
+ case IOC_OSC_CTL_RECOVERY:
+ rc = ptlrpc_import_control_recovery(imp, data->ioc_offset);
+ GOTO(out, rc);
case OBD_IOC_PARSE: {
ctxt = llog_get_context(&exp->exp_obd->obd_llogs,
LLOG_CONFIG_REPL_CTXT);
err = ptlrpc_set_import_active(obd->u.cli.cl_import,
data->ioc_offset);
GOTO(out, err);
+ case IOC_OSC_CTL_RECOVERY:
+ err = ptlrpc_import_control_recovery(obd->u.cli.cl_import,
+ data->ioc_offset);
+ GOTO(out, err);
default:
CDEBUG(D_INODE, "unrecognised ioctl %#x by %s\n", cmd, current->comm);
GOTO(out, err = -ENOTTY);
EXPORT_SYMBOL(ptlrpc_activate_import);
EXPORT_SYMBOL(ptlrpc_fail_import);
EXPORT_SYMBOL(ptlrpc_disconnect_import);
+EXPORT_SYMBOL(ptlrpc_import_control_recovery);
/* service.c */
EXPORT_SYMBOL(ptlrpc_require_repack);
return in_recovery;
}
+int ptlrpc_import_control_recovery(struct obd_import *imp, int disable)
+{
+ unsigned long flags;
+
+ /* with imp_deactivate == 1 pinger won't initiate re-connect */
+ spin_lock_irqsave(&imp->imp_lock, flags);
+ if (disable)
+ imp->imp_deactive = 1;
+ else
+ imp->imp_deactive = 0;
+ if (imp->imp_state == LUSTRE_IMP_DISCON) {
+ imp->imp_force_verify = 1;
+ ptlrpc_pinger_wake_up();
+ }
+ spin_unlock_irqrestore(&imp->imp_lock, flags);
+ RETURN(0);
+}
+
static int ptlrpc_recover_import_no_retry(struct obd_import *imp,
char *new_uuid)
{
"stop lock manager stress test (no args)\n"},
{"dump_ldlm", jt_obd_dump_ldlm, 0,
"dump all lock manager state (no args)"},
+ {"disable_recovery", jt_obd_disable_recovery, 0, "disable recovery on an import\n"},
+ {"enable_recovery", jt_obd_enable_recovery, 0, "enable recovery on an import\n"},
{"activate", jt_obd_activate, 0, "activate an import\n"},
{"deactivate", jt_obd_deactivate, 0, "deactivate an import\n"},
{"recover", jt_obd_recover, 0, "usage: recover [<connection UUID>]"},
return do_activate(argc, argv, 1);
}
+static int do_control_recovery(int argc, char **argv, int flag)
+{
+ struct obd_ioctl_data data;
+ int rc;
+
+ IOC_INIT(data);
+ if (argc != 1)
+ return CMD_HELP;
+
+ /* reuse offset for 'active' */
+ data.ioc_offset = flag;
+
+ IOC_PACK(argv[0], data);
+ rc = l2_ioctl(OBD_DEV_ID, IOC_OSC_CTL_RECOVERY, buf);
+ if (rc)
+ fprintf(stderr, "error: %s: failed: %s\n",
+ jt_cmdname(argv[0]), strerror(rc = errno));
+
+ return rc;
+}
+
+int jt_obd_disable_recovery(int argc, char **argv)
+{
+ return do_control_recovery(argc, argv, 1);
+}
+
+int jt_obd_enable_recovery(int argc, char **argv)
+{
+ return do_control_recovery(argc, argv, 0);
+}
+
int jt_obd_recover(int argc, char **argv)
{
int rc;
int jt_obd_ldlm_regress_start(int argc, char **argv);
int jt_obd_ldlm_regress_stop(int argc, char **argv);
int jt_obd_dump_ldlm(int argc, char **argv);
+int jt_obd_disable_recovery(int argc, char **argv);
+int jt_obd_enable_recovery(int argc, char **argv);
int jt_obd_activate(int argc, char **argv);
int jt_obd_deactivate(int argc, char **argv);
int jt_obd_recover(int argc, char **argv);