summaryrefslogtreecommitdiffstats
path: root/sbin/mdconfig
diff options
context:
space:
mode:
authorhrs <hrs@FreeBSD.org>2013-06-20 14:30:16 +0000
committerhrs <hrs@FreeBSD.org>2013-06-20 14:30:16 +0000
commit7d32f7dfe8a0f0c6e71a6a3de35fa0d21ca1fef4 (patch)
tree193ea14cb0d261ed08ca63e2e69b157cf28a4d66 /sbin/mdconfig
parent06771a9c87365149111695df47e76bde799bb0c0 (diff)
downloadFreeBSD-src-7d32f7dfe8a0f0c6e71a6a3de35fa0d21ca1fef4.zip
FreeBSD-src-7d32f7dfe8a0f0c6e71a6a3de35fa0d21ca1fef4.tar.gz
- Add "-f file" support to listing mode (-l). When a -f option is
specified, only md(4) devices which have the specified file as backing store are displayed. - Use MD_NAME instead of "md". - Use _PATH_DEV instead of "/dev/". MFC after: 1 week
Diffstat (limited to 'sbin/mdconfig')
-rw-r--r--sbin/mdconfig/mdconfig.816
-rw-r--r--sbin/mdconfig/mdconfig.c54
2 files changed, 45 insertions, 25 deletions
diff --git a/sbin/mdconfig/mdconfig.8 b/sbin/mdconfig/mdconfig.8
index c18027c..b3cc110 100644
--- a/sbin/mdconfig/mdconfig.8
+++ b/sbin/mdconfig/mdconfig.8
@@ -41,7 +41,7 @@
.\"
.\" $FreeBSD$
.\"
-.Dd November 3, 2012
+.Dd June 20, 2013
.Dt MDCONFIG 8
.Os
.Sh NAME
@@ -72,6 +72,7 @@
.Fl l
.Op Fl n
.Op Fl v
+.Op Fl f Ar file
.Op Fl u Ar unit
.Nm
.Ar file
@@ -131,6 +132,19 @@ List configured devices.
If given with
.Fl u ,
display details about that particular device.
+If given with
+.Fl f Ar file ,
+display
+.Xr md 4
+device names of which
+.Ar file
+is used as the backing store.
+If both of
+.Fl u
+and
+.Fl f
+options are specified,
+display devices which match the two conditions.
If the
.Fl v
option is specified, show all details.
diff --git a/sbin/mdconfig/mdconfig.c b/sbin/mdconfig/mdconfig.c
index 70cefe9..c04b876 100644
--- a/sbin/mdconfig/mdconfig.c
+++ b/sbin/mdconfig/mdconfig.c
@@ -47,6 +47,7 @@
#include <inttypes.h>
#include <libgeom.h>
#include <libutil.h>
+#include <paths.h>
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
@@ -59,9 +60,9 @@ static int nflag;
static void usage(void);
static void md_set_file(const char *);
-static int md_find(char *, const char *);
-static int md_query(char *name);
-static int md_list(char *units, int opt);
+static int md_find(const char *, const char *);
+static int md_query(const char *, const int, const char *);
+static int md_list(const char *, int, const char *);
static char *geom_config_get(struct gconf *g, const char *name);
static void md_prthumanval(char *length);
@@ -82,7 +83,7 @@ usage(void)
" [-x sectors/track] [-y heads/cylinder]\n"
" mdconfig -d -u unit [-o [no]force]\n"
" mdconfig -r -u unit -s size [-o [no]force]\n"
-" mdconfig -l [-v] [-n] [-u unit]\n"
+" mdconfig -l [-v] [-n] [-f file] [-u unit]\n"
" mdconfig file\n");
fprintf(stderr, "\t\ttype = {malloc, vnode, swap}\n");
fprintf(stderr, "\t\toption = {cluster, compress, reserve}\n");
@@ -215,7 +216,7 @@ main(int argc, char **argv)
errx(1, "unknown suffix on -s argument");
break;
case 'u':
- if (!strncmp(optarg, "/dev/", 5))
+ if (!strncmp(optarg, _PATH_DEV, 5))
optarg += 5;
if (!strncmp(optarg, MD_NAME, sizeof(MD_NAME) - 1))
optarg += sizeof(MD_NAME) - 1;
@@ -298,8 +299,8 @@ main(int argc, char **argv)
errx(1, "-x can only be used with -a");
if (mdio.md_fwheads != 0)
errx(1, "-y can only be used with -a");
- if (fflag != NULL)
- errx(1, "-f can only be used with -a");
+ if (fflag != NULL && action != LIST)
+ errx(1, "-f can only be used with -a and -l");
if (tflag != NULL)
errx(1, "-t can only be used with -a");
if (argc > 0)
@@ -333,14 +334,14 @@ main(int argc, char **argv)
if (!kld_isloaded("g_md") && kld_load("geom_md") == -1)
err(1, "failed to load geom_md module");
- fd = open("/dev/" MDCTL_NAME, O_RDWR, 0);
+ fd = open(_PATH_DEV MDCTL_NAME, O_RDWR, 0);
if (fd < 0)
- err(1, "open(/dev/%s)", MDCTL_NAME);
+ err(1, "open(%s%s)", _PATH_DEV, MDCTL_NAME);
if (action == ATTACH) {
i = ioctl(fd, MDIOCATTACH, &mdio);
if (i < 0)
- err(1, "ioctl(/dev/%s)", MDCTL_NAME);
+ err(1, "ioctl(%s%s)", _PATH_DEV, MDCTL_NAME);
if (mdio.md_options & MD_AUTOUNIT)
printf("%s%d\n", nflag ? "" : MD_NAME, mdio.md_unit);
} else if (action == DETACH) {
@@ -348,22 +349,22 @@ main(int argc, char **argv)
errx(1, "-d requires -u");
i = ioctl(fd, MDIOCDETACH, &mdio);
if (i < 0)
- err(1, "ioctl(/dev/%s)", MDCTL_NAME);
+ err(1, "ioctl(%s%s)", _PATH_DEV, MDCTL_NAME);
} else if (action == RESIZE) {
if (mdio.md_options & MD_AUTOUNIT)
errx(1, "-r requires -u");
i = ioctl(fd, MDIOCRESIZE, &mdio);
if (i < 0)
- err(1, "ioctl(/dev/%s)", MDCTL_NAME);
+ err(1, "ioctl(%s%s)", _PATH_DEV, MDCTL_NAME);
} else if (action == LIST) {
if (mdio.md_options & MD_AUTOUNIT) {
/*
* Listing all devices. This is why we pass NULL
* together with OPT_LIST.
*/
- md_list(NULL, OPT_LIST | vflag);
+ md_list(NULL, OPT_LIST | vflag, fflag);
} else
- return (md_query(uflag));
+ return (md_query(uflag, vflag, fflag));
} else
usage();
close(fd);
@@ -397,7 +398,7 @@ md_set_file(const char *fn)
* between list and query mode.
*/
static int
-md_list(char *units, int opt)
+md_list(const char *units, int opt, const char *fflag)
{
struct gmesh gm;
struct gprovider *pp;
@@ -441,15 +442,20 @@ md_list(char *units, int opt)
found = 1;
}
gc = &pp->lg_config;
- if (nflag && strncmp(pp->lg_name, "md", 2) == 0)
+ type = geom_config_get(gc, "type");
+ if (strcmp(type, "vnode") == 0) {
+ file = geom_config_get(gc, "file");
+ if (fflag != NULL &&
+ strcmp(fflag, file) != 0)
+ continue;
+ }
+ if (nflag && strncmp(pp->lg_name, MD_NAME, 2) == 0)
printf("%s", pp->lg_name + 2);
else
printf("%s", pp->lg_name);
- if (opt & OPT_VERBOSE || opt & OPT_UNIT) {
- type = geom_config_get(gc, "type");
- if (strcmp(type, "vnode") == 0)
- file = geom_config_get(gc, "file");
+ if (opt & OPT_VERBOSE ||
+ ((opt & OPT_UNIT) && fflag == NULL)) {
length = geom_config_get(gc, "length");
printf("\t%s\t", type);
if (length != NULL)
@@ -497,7 +503,7 @@ geom_config_get(struct gconf *g, const char *name)
* otherwise.
*/
static int
-md_find(char *list, const char *name)
+md_find(const char *list, const char *name)
{
int ret;
char num[16];
@@ -508,7 +514,7 @@ md_find(char *list, const char *name)
if (ptr == NULL)
return (-1);
for (p = ptr; (u = strsep(&p, ",")) != NULL;) {
- if (strncmp(u, "/dev/", 5) == 0)
+ if (strncmp(u, _PATH_DEV, 5) == 0)
u += 5;
/* Just in case user specified number instead of full name */
snprintf(num, sizeof(num), "md%s", u);
@@ -538,8 +544,8 @@ md_prthumanval(char *length)
}
static int
-md_query(char *name)
+md_query(const char *name, const int opt, const char *fflag)
{
- return (md_list(name, OPT_UNIT));
+ return (md_list(name, opt | OPT_UNIT, fflag));
}
OpenPOWER on IntegriCloud