summaryrefslogtreecommitdiff
path: root/usr.sbin/mfiutil
diff options
context:
space:
mode:
authorSimon J. Gerraty <sjg@FreeBSD.org>2014-04-28 07:50:45 +0000
committerSimon J. Gerraty <sjg@FreeBSD.org>2014-04-28 07:50:45 +0000
commit3b8f08459569bf0faa21473e5cec2491e95c9349 (patch)
tree80f45dd81ca716bcd7ca9674581e1fc40b93cd34 /usr.sbin/mfiutil
parent9d2ab4a62d6733c45958627ac113bdbd818d1e2a (diff)
parentb2ba55951383498f252746f618d513139da06e8e (diff)
downloadsrc-test2-3b8f08459569bf0faa21473e5cec2491e95c9349.tar.gz
src-test2-3b8f08459569bf0faa21473e5cec2491e95c9349.zip
Merge head
Notes
Notes: svn path=/projects/bmake/; revision=265044
Diffstat (limited to 'usr.sbin/mfiutil')
-rw-r--r--usr.sbin/mfiutil/Makefile5
-rw-r--r--usr.sbin/mfiutil/mfi_evt.c18
-rw-r--r--usr.sbin/mfiutil/mfi_properties.c171
-rw-r--r--usr.sbin/mfiutil/mfi_show.c4
-rw-r--r--usr.sbin/mfiutil/mfiutil.815
-rw-r--r--usr.sbin/mfiutil/mfiutil.c4
6 files changed, 206 insertions, 11 deletions
diff --git a/usr.sbin/mfiutil/Makefile b/usr.sbin/mfiutil/Makefile
index f6e358a24e62..4fe6f0345222 100644
--- a/usr.sbin/mfiutil/Makefile
+++ b/usr.sbin/mfiutil/Makefile
@@ -2,10 +2,11 @@
PROG= mfiutil
SRCS= mfiutil.c mfi_bbu.c mfi_cmd.c mfi_config.c mfi_drive.c mfi_evt.c \
- mfi_flash.c mfi_patrol.c mfi_show.c mfi_volume.c mfi_foreign.c
+ mfi_flash.c mfi_patrol.c mfi_show.c mfi_volume.c mfi_foreign.c \
+ mfi_properties.c
MAN8= mfiutil.8
-CFLAGS+= -fno-builtin-strftime
+CFLAGS.gcc+= -fno-builtin-strftime
DPADD= ${LIBUTIL}
LDADD= -lutil
diff --git a/usr.sbin/mfiutil/mfi_evt.c b/usr.sbin/mfiutil/mfi_evt.c
index c9a1a6dc567b..901c0bd0a9d7 100644
--- a/usr.sbin/mfiutil/mfi_evt.c
+++ b/usr.sbin/mfiutil/mfi_evt.c
@@ -33,6 +33,7 @@
#include <sys/errno.h>
#include <err.h>
#include <fcntl.h>
+#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <strings.h>
@@ -534,6 +535,7 @@ show_events(int ac, char **av)
struct mfi_evt_log_state info;
struct mfi_evt_list *list;
union mfi_evt filter;
+ bool first;
long val;
char *cp;
ssize_t size;
@@ -640,7 +642,9 @@ show_events(int ac, char **av)
close(fd);
return (ENOMEM);
}
- for (seq = start;;) {
+ first = true;
+ seq = start;
+ for (;;) {
if (mfi_get_events(fd, list, num_events, filter, seq,
&status) < 0) {
error = errno;
@@ -650,8 +654,6 @@ show_events(int ac, char **av)
return (error);
}
if (status == MFI_STAT_NOT_FOUND) {
- if (seq == start)
- warnx("No matching events found");
break;
}
if (status != MFI_STAT_OK) {
@@ -669,13 +671,14 @@ show_events(int ac, char **av)
* the case that our stop point is earlier in
* the buffer than our start point.
*/
- if (list->event[i].seq >= stop) {
+ if (list->event[i].seq > stop) {
if (start <= stop)
- break;
+ goto finish;
else if (list->event[i].seq < start)
- break;
+ goto finish;
}
mfi_decode_evt(fd, &list->event[i], verbose);
+ first = false;
}
/*
@@ -686,6 +689,9 @@ show_events(int ac, char **av)
seq = list->event[list->count - 1].seq + 1;
}
+finish:
+ if (first)
+ warnx("No matching events found");
free(list);
close(fd);
diff --git a/usr.sbin/mfiutil/mfi_properties.c b/usr.sbin/mfiutil/mfi_properties.c
new file mode 100644
index 000000000000..c9c9204d5004
--- /dev/null
+++ b/usr.sbin/mfiutil/mfi_properties.c
@@ -0,0 +1,171 @@
+/*-
+ * Copyright (c) 2013 Yahoo!, Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ *
+ * $FreeBSD$
+ */
+
+#include <sys/errno.h>
+#include <sys/ioctl.h>
+#include <sys/param.h>
+#include <sys/sysctl.h>
+#include <sys/uio.h>
+
+#include <err.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include "mfiutil.h"
+#include <dev/mfi/mfi_ioctl.h>
+
+MFI_TABLE(top, ctrlprop);
+
+static int
+mfi_ctrl_get_properties(int fd, struct mfi_ctrl_props *info)
+{
+
+ return (mfi_dcmd_command(fd, MFI_DCMD_CTRL_GET_PROPS, info,
+ sizeof(struct mfi_ctrl_props), NULL, 0, NULL));
+}
+
+static int
+mfi_ctrl_set_properties(int fd, struct mfi_ctrl_props *info)
+{
+
+ return (mfi_dcmd_command(fd, MFI_DCMD_CTRL_SET_PROPS, info,
+ sizeof(struct mfi_ctrl_props), NULL, 0, NULL));
+}
+
+/*
+ * aquite the controller properties data structure modify the
+ * rebuild rate if requested and then retun
+ */
+static int
+mfi_ctrl_rebuild_rate(int ac, char **av)
+{
+ int error, fd;
+ struct mfi_ctrl_props ctrl_props;
+
+ if (ac > 2) {
+ warn("mfi_ctrl_set_rebuild_rate");
+ return(-1);
+ }
+
+ fd = mfi_open(mfi_unit, O_RDWR);
+ if (fd < 0) {
+ error = errno;
+ warn("mfi_open");
+ return (error);
+ }
+
+ error = mfi_ctrl_get_properties(fd, &ctrl_props);
+ if ( error < 0) {
+ error = errno;
+ warn("Failed to get controller properties");
+ close(fd);
+ return (error);
+ }
+ /*
+ * User requested a change to the rebuild rate
+ */
+ if (ac > 1) {
+ ctrl_props.rebuild_rate = atoi(av[ac - 1]);
+ error = mfi_ctrl_set_properties(fd, &ctrl_props);
+ if ( error < 0) {
+ error = errno;
+ warn("Failed to set controller properties");
+ close(fd);
+ return (error);
+ }
+
+ error = mfi_ctrl_get_properties(fd, &ctrl_props);
+ if ( error < 0) {
+ error = errno;
+ warn("Failed to get controller properties");
+ close(fd);
+ return (error);
+ }
+ }
+ printf ("controller rebuild rate: %%%u \n",
+ ctrl_props.rebuild_rate);
+ return (0);
+}
+MFI_COMMAND(ctrlprop, rebuild, mfi_ctrl_rebuild_rate);
+
+static int
+mfi_ctrl_alarm_enable(int ac, char **av)
+{
+ int error, fd;
+ struct mfi_ctrl_props ctrl_props;
+
+ if (ac > 2) {
+ warn("mfi_ctrl_alarm_enable");
+ return(-1);
+ }
+
+ fd = mfi_open(mfi_unit, O_RDWR);
+ if (fd < 0) {
+ error = errno;
+ warn("mfi_open");
+ return (error);
+ }
+
+ error = mfi_ctrl_get_properties(fd, &ctrl_props);
+ if ( error < 0) {
+ error = errno;
+ warn("Failed to get controller properties");
+ close(fd);
+ return (error);
+ }
+ printf ("controller alarm was : %s\n",
+ (ctrl_props.alarm_enable ? "enabled" : "disabled"));
+
+ if (ac > 1) {
+ ctrl_props.alarm_enable = atoi(av[ac - 1]);
+ error = mfi_ctrl_set_properties(fd, &ctrl_props);
+ if ( error < 0) {
+ error = errno;
+ warn("Failed to set controller properties");
+ close(fd);
+ return (error);
+ }
+
+ error = mfi_ctrl_get_properties(fd, &ctrl_props);
+ if ( error < 0) {
+ error = errno;
+ warn("Failed to get controller properties");
+ close(fd);
+ return (error);
+ }
+ }
+ printf ("controller alarm was : %s\n",
+ (ctrl_props.alarm_enable ? "enabled" : "disabled"));
+ return (0);
+}
+
+MFI_COMMAND(ctrlprop, alarm, mfi_ctrl_alarm_enable);
diff --git a/usr.sbin/mfiutil/mfi_show.c b/usr.sbin/mfiutil/mfi_show.c
index 6bb86124f996..f541045b409b 100644
--- a/usr.sbin/mfiutil/mfi_show.c
+++ b/usr.sbin/mfiutil/mfi_show.c
@@ -320,7 +320,7 @@ print_pd(struct mfi_pd_info *info, int state_len)
const char *s;
char buf[256];
- humanize_number(buf, sizeof(buf), info->raw_size * 512, "",
+ humanize_number(buf, 6, info->raw_size * 512, "",
HN_AUTOSCALE, HN_B | HN_NOSPACE |HN_DECIMAL);
printf("(%6s) ", buf);
if (info->state.ddf.v.pd_type.is_foreign) {
@@ -766,7 +766,7 @@ show_progress(int ac, char **av __unused)
printf("drive %s ", mfi_drive_name(NULL, device_id,
MFI_DNAME_DEVICE_ID|MFI_DNAME_HONOR_OPTS));
mfi_display_progress("Clear", &pinfo.prog_info.clear);
-
+ busy = 1;
}
}
diff --git a/usr.sbin/mfiutil/mfiutil.8 b/usr.sbin/mfiutil/mfiutil.8
index 8346922c9e68..e999c77a35b5 100644
--- a/usr.sbin/mfiutil/mfiutil.8
+++ b/usr.sbin/mfiutil/mfiutil.8
@@ -168,6 +168,12 @@
.Nm
.Op Fl u Ar unit
.Cm bbu Ar setting Ar value
+.Nm
+.Op Fl u Ar unit
+.Cm ctrlprop Ar rebuild Op Ar rate
+.Nm
+.Op Fl u Ar unit
+.Cm ctrlprop Ar alarm Op Ar 0/1
.Sh DESCRIPTION
The
.Nm
@@ -659,6 +665,12 @@ inclusive.
Modes 1, 2 and 3 enable a transparent learn cycle, whereas modes 4 and 5 do not.
The BBU's data retention time is greater when transparent learning is not used.
.El
+.It Cm ctrlprop Ar rebuild Op Ar rate
+With no arguments display the rate of rebuild (percentage)a for volumes.
+With an integer argument (0-100), set that value as the new rebuild rate for volumes.
+.It Cm ctrlprop Ar alarm Op Ar 0/1
+With no arguments display the current alarm enable/disable status.
+With a 0, disable alarms. With a 1, enable alarms.
.El
.Sh EXAMPLES
Configure the cache for volume mfid0 to cache only writes:
@@ -699,6 +711,9 @@ patrol read starting in 5 minutes:
Display the second detected foreign configuration:
.Pp
.Dl Nm Cm show foreign 1
+.Pp
+Set the current rebuild rate for volumes to 40%:
+.Dl Nm Cm ctrlprop rebuild 40
.Sh SEE ALSO
.Xr mfi 4
.Sh HISTORY
diff --git a/usr.sbin/mfiutil/mfiutil.c b/usr.sbin/mfiutil/mfiutil.c
index a8d9ef826449..85ce25c11f32 100644
--- a/usr.sbin/mfiutil/mfiutil.c
+++ b/usr.sbin/mfiutil/mfiutil.c
@@ -78,7 +78,7 @@ usage(void)
fprintf(stderr, " name <volume> <name>\n");
fprintf(stderr, " volume progress <volume> - display status of active operations\n");
fprintf(stderr, " clear - clear volume configuration\n");
- fprintf(stderr, " create <type> [-v] <drive>[,<drive>[,...]] [<drive>[,<drive>[,...]]\n");
+ fprintf(stderr, " create <type> [-v] [-s stripe_size] <drive>[,<drive>[,...]] [<drive>[,<drive>[,...]]\n");
fprintf(stderr, " delete <volume>\n");
fprintf(stderr, " add <drive> [volume] - add a hot spare\n");
fprintf(stderr, " remove <drive> - remove a hot spare\n");
@@ -93,6 +93,8 @@ usage(void)
fprintf(stderr, " flash <firmware>\n");
fprintf(stderr, " start learn - start a BBU relearn\n");
fprintf(stderr, " bbu <setting> <value> - set BBU properties\n");
+ fprintf(stderr, " ctrlprop rebuild [rate] - get/set the volume rebuild rate\n");
+ fprintf(stderr, " ctrlprop alarm [0/1] - enable/disable controller alarms\n");
#ifdef DEBUG
fprintf(stderr, " debug - debug 'show config'\n");
fprintf(stderr, " dump - display 'saved' config\n");