/*
* Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
*
- * Copyright (c) 2013, 2015, Intel Corporation.
+ * Copyright (c) 2013, 2017, Intel Corporation.
*
- * This file is part of Lustre, https://wiki.hpdd.intel.com/
+ * This file is part of Lustre, https://wiki.whamcloud.com/
*
* Portals is free software; you can redistribute it and/or
* modify it under the terms of version 2 of the GNU General Public
#include <time.h>
#include <linux/types.h>
-#include <libcfs/util/string.h>
#include <libcfs/util/ioctl.h>
#include <linux/lnet/libcfs_debug.h>
#include <linux/lnet/lnet-dlc.h>
#include <linux/lnet/lnetctl.h>
#include <linux/lnet/nidstr.h>
#include <linux/lnet/socklnd.h>
+#include <lustre/lustreapi.h>
unsigned int libcfs_debug;
unsigned int libcfs_printk = D_CANTMASK;
net_ip = htonl (ipaddr);
he = gethostbyaddr (&net_ip, sizeof (net_ip), AF_INET);
if (he != NULL) {
- strlcpy(str, he->h_name, strsize);
+ snprintf(str, strsize, "%s", he->h_name);
return (str);
}
}
}
static int
+fault_attr_health_error_parse(char *error, __u32 *mask)
+{
+ if (!strcasecmp(error, "local_interrupt")) {
+ *mask |= HSTATUS_LOCAL_INTERRUPT_BIT;
+ return 0;
+ }
+ if (!strcasecmp(error, "local_dropped")) {
+ *mask |= HSTATUS_LOCAL_DROPPED_BIT;
+ return 0;
+ }
+ if (!strcasecmp(error, "local_aborted")) {
+ *mask |= HSTATUS_LOCAL_ABORTED_BIT;
+ return 0;
+ }
+ if (!strcasecmp(error, "local_no_route")) {
+ *mask |= HSTATUS_LOCAL_NO_ROUTE_BIT;
+ return 0;
+ }
+ if (!strcasecmp(error, "local_error")) {
+ *mask |= HSTATUS_LOCAL_ERROR_BIT;
+ return 0;
+ }
+ if (!strcasecmp(error, "local_timeout")) {
+ *mask |= HSTATUS_LOCAL_TIMEOUT_BIT;
+ return 0;
+ }
+ if (!strcasecmp(error, "remote_error")) {
+ *mask |= HSTATUS_REMOTE_ERROR_BIT;
+ return 0;
+ }
+ if (!strcasecmp(error, "remote_dropped")) {
+ *mask |= HSTATUS_REMOTE_DROPPED_BIT;
+ return 0;
+ }
+ if (!strcasecmp(error, "remote_timeout")) {
+ *mask |= HSTATUS_REMOTE_TIMEOUT_BIT;
+ return 0;
+ }
+ if (!strcasecmp(error, "network_timeout")) {
+ *mask |= HSTATUS_NETWORK_TIMEOUT_BIT;
+ return 0;
+ }
+ if (!strcasecmp(error, "random")) {
+ *mask = HSTATUS_RANDOM;
+ return 0;
+ }
+
+ return -1;
+}
+
+static int
fault_simul_rule_add(__u32 opc, char *name, int argc, char **argv)
{
struct libcfs_ioctl_data data = { { 0 } };
{ .name = "dest", .has_arg = required_argument, .val = 'd' },
{ .name = "rate", .has_arg = required_argument, .val = 'r' },
{ .name = "interval", .has_arg = required_argument, .val = 'i' },
+ { .name = "random", .has_arg = no_argument, .val = 'n' },
{ .name = "latency", .has_arg = required_argument, .val = 'l' },
{ .name = "portal", .has_arg = required_argument, .val = 'p' },
{ .name = "message", .has_arg = required_argument, .val = 'm' },
+ { .name = "health_error", .has_arg = required_argument, .val = 'e' },
+ { .name = "local_nid", .has_arg = required_argument, .val = 'o' },
+ { .name = "drop_all", .has_arg = no_argument, .val = 'x' },
{ .name = NULL } };
if (argc == 1) {
return -1;
}
- optstr = opc == LNET_CTL_DROP_ADD ? "s:d:r:i:p:m:" : "s:d:r:l:p:m:";
+ optstr = opc == LNET_CTL_DROP_ADD ? "s:d:o:r:i:p:m:e:nx" : "s:d:o:r:l:p:m:";
memset(&attr, 0, sizeof(attr));
while (1) {
char c = getopt_long(argc, argv, optstr, opts, NULL);
break;
switch (c) {
+ case 'o':
+ rc = fault_attr_nid_parse(optarg, &attr.fa_local_nid);
+ if (rc != 0)
+ goto getopt_failed;
+ break;
case 's': /* source NID/NET */
rc = fault_attr_nid_parse(optarg, &attr.fa_src);
if (rc != 0)
attr.u.delay.la_rate = strtoul(optarg, NULL, 0);
break;
+ case 'e':
+ if (opc == LNET_CTL_DROP_ADD) {
+ rc = fault_attr_health_error_parse(optarg,
+ &attr.u.drop.da_health_error_mask);
+ if (rc)
+ goto getopt_failed;
+ }
+ break;
+
+ case 'x':
+ if (opc == LNET_CTL_DROP_ADD)
+ attr.u.drop.da_drop_all = true;
+ break;
+
+ case 'n':
+ if (opc == LNET_CTL_DROP_ADD)
+ attr.u.drop.da_random = true;
+ break;
+
case 'i': /* time interval (# seconds) for message drop */
if (opc == LNET_CTL_DROP_ADD)
attr.u.drop.da_interval = strtoul(optarg,
"but not both at the same time.\n");
return -1;
}
+
+ if (attr.u.drop.da_random &&
+ attr.u.drop.da_interval == 0) {
+ fprintf(stderr, "please provide an interval to randomize\n");
+ return -1;
+ }
} else if (opc == LNET_CTL_DELAY_ADD) {
if (!((attr.u.delay.la_rate == 0) ^
(attr.u.delay.la_interval == 0))) {
return -1;
}
+ if (attr.fa_local_nid == 0)
+ attr.fa_local_nid = LNET_NID_ANY;
+
data.ioc_flags = opc;
data.ioc_inllen1 = sizeof(attr);
data.ioc_inlbuf1 = (char *)&attr;