unsigned long long *size_units, int bytes_spec);
extern int llapi_path2fid(const char *path, unsigned long long *seq,
unsigned long *oid, unsigned long *ver);
+extern void llapi_ping_target(char *obd_type, char *obd_name,
+ char *obd_uuid, void *args);
struct mntent;
#define HAVE_LLAPI_IS_LUSTRE_MNT
#define OBD_IOC_LOV_GET_CONFIG _IOWR('f', 132, OBD_IOC_DATA_TYPE)
#define OBD_IOC_CLIENT_RECOVER _IOW ('f', 133, OBD_IOC_DATA_TYPE)
+#define OBD_IOC_PING_TARGET _IOW ('f', 136, OBD_IOC_DATA_TYPE)
#define OBD_IOC_DEC_FS_USE_COUNT _IO ('f', 139 )
#define OBD_IOC_NO_TRANSNO _IOW ('f', 140, OBD_IOC_DATA_TYPE)
/* ptlrpc/pinger.c */
int ptlrpc_pinger_add_import(struct obd_import *imp);
int ptlrpc_pinger_del_import(struct obd_import *imp);
+struct ptlrpc_request * ptlrpc_prep_ping(struct obd_import *imp);
+int ptlrpc_obd_ping(struct obd_device *obd);
cfs_time_t ptlrpc_suspend_wakeup_time(void);
#ifdef __KERNEL__
void ping_evictor_start(void);
/* corresponds to one of the obd's */
#define MAX_OBD_NAME 128
#define OBD_DEVICE_MAGIC 0XAB5CD6EF
+#define OBD_DEV_BY_DEVNAME 0xffffd0de
struct obd_device {
struct obd_type *obd_type;
__u32 obd_magic;
rc = lquota_poll_check(quota_interface, exp,
(struct if_quotacheck *)karg);
GOTO(out, rc);
+ case OBD_IOC_PING_TARGET:
+ rc = ptlrpc_obd_ping(obd);
+ GOTO(out, rc);
default:
CERROR("mdc_ioctl(): unrecognised ioctl %#x\n", cmd);
GOTO(out, rc = -ENOTTY);
}
- if (data->ioc_dev >= class_devno_max()) {
+ if (data->ioc_dev == OBD_DEV_BY_DEVNAME) {
+ if (data->ioc_inllen4 <= 0 || data->ioc_inlbuf4 == NULL)
+ GOTO(out, err = -EINVAL);
+ if (strnlen(data->ioc_inlbuf4, MAX_OBD_NAME) >= MAX_OBD_NAME)
+ GOTO(out, err = -EINVAL);
+ obd = class_name2obd(data->ioc_inlbuf4);
+ } else if (data->ioc_dev < class_devno_max()) {
+ obd = class_num2obd(data->ioc_dev);
+ } else {
CERROR("OBD ioctl: No device\n");
GOTO(out, err = -EINVAL);
}
- obd = class_num2obd(data->ioc_dev);
if (obd == NULL) {
CERROR("OBD ioctl : No Device %d\n", data->ioc_dev);
GOTO(out, err = -EINVAL);
err = lquota_poll_check(quota_interface, exp,
(struct if_quotacheck *)karg);
GOTO(out, err);
+ case OBD_IOC_PING_TARGET:
+ err = ptlrpc_obd_ping(obd);
+ GOTO(out, err);
default:
CDEBUG(D_INODE, "unrecognised ioctl %#x by %s\n",
cmd, cfs_curproc_comm());
ENTRY;
LPROCFS_CLIMP_CHECK(obd);
- req = ptlrpc_request_alloc_pack(obd->u.cli.cl_import, &RQF_OBD_PING,
- LUSTRE_OBD_VERSION, OBD_PING);
-
+ req = ptlrpc_prep_ping(obd->u.cli.cl_import);
LPROCFS_CLIMP_EXIT(obd);
if (req == NULL)
RETURN(-ENOMEM);
- ptlrpc_request_set_replen(req);
req->rq_send_state = LUSTRE_IMP_FULL;
- req->rq_no_resend = 1;
- req->rq_no_delay = 1;
rc = ptlrpc_queue_wait(req);
struct semaphore pinger_sem;
static CFS_LIST_HEAD(pinger_imports);
+struct ptlrpc_request *
+ptlrpc_prep_ping(struct obd_import *imp)
+{
+ struct ptlrpc_request *req;
+
+ req = ptlrpc_request_alloc_pack(imp, &RQF_OBD_PING,
+ LUSTRE_OBD_VERSION, OBD_PING);
+ if (req) {
+ ptlrpc_request_set_replen(req);
+ req->rq_no_resend = req->rq_no_delay = 1;
+ }
+ return req;
+}
+
+int ptlrpc_obd_ping(struct obd_device *obd)
+{
+ int rc;
+ struct ptlrpc_request *req;
+ ENTRY;
+
+ req = ptlrpc_prep_ping(obd->u.cli.cl_import);
+ if (req == NULL)
+ RETURN(-ENOMEM);
+
+ req->rq_send_state = LUSTRE_IMP_FULL;
+
+ rc = ptlrpc_queue_wait(req);
+
+ ptlrpc_req_finished(req);
+
+ RETURN(rc);
+}
+EXPORT_SYMBOL(ptlrpc_obd_ping);
+
int ptlrpc_ping(struct obd_import *imp)
{
struct ptlrpc_request *req;
ENTRY;
- req = ptlrpc_request_alloc_pack(imp, &RQF_OBD_PING, LUSTRE_OBD_VERSION,
- OBD_PING);
+ req = ptlrpc_prep_ping(imp);
if (req == NULL) {
CERROR("OOM trying to ping %s->%s\n",
imp->imp_obd->obd_uuid.uuid,
DEBUG_REQ(D_INFO, req, "pinging %s->%s",
imp->imp_obd->obd_uuid.uuid, obd2cli_tgt(imp->imp_obd));
- req->rq_no_resend = req->rq_no_delay = 1;
- ptlrpc_request_set_replen(req);
ptlrpcd_add_req(req, PSCOPE_OTHER);
RETURN(0);
return -1;
}
- rc = llapi_target_check(num_types, obd_types, mnt->mnt_dir);
+ rc = llapi_target_iterate(num_types, obd_types,
+ mnt->mnt_dir, llapi_ping_target);
if (rc)
fprintf(stderr, "error: %s: %s status failed\n",
return rc;
}
+
+void llapi_ping_target(char *obd_type, char *obd_name,
+ char *obd_uuid, void *args)
+{
+ int rc;
+ struct obd_ioctl_data data;
+
+ memset(&data, 0, sizeof(data));
+ data.ioc_inlbuf4 = obd_name;
+ data.ioc_inllen4 = strlen(obd_name) + 1;
+ data.ioc_dev = OBD_DEV_BY_DEVNAME;
+ memset(buf, 0, sizeof(rawbuf));
+ if (obd_ioctl_pack(&data, &buf, max)) {
+ fprintf(stderr, "error: invalid ioctl\n");
+ return;
+ }
+ rc = l_ioctl(OBD_DEV_ID, OBD_IOC_PING_TARGET, buf);
+ if (rc)
+ rc = errno;
+ if (rc == ENOTCONN || rc == ESHUTDOWN) {
+ printf("%s inactive.\n", obd_name);
+ } else if (rc) {
+ fprintf(stderr, "error: check '%s' %s\n",
+ obd_name, strerror(errno));
+ } else {
+ printf("%s active.\n", obd_name);
+ }
+
+}