> 2 packets transmitted, 0 packets received, 100.0% packet loss :)
I see many people are doing something in persistent memory
subsystems now. Maybe this diff could get some attention now
as well. :) Resending the whole thing.
--
WBR,
Vadim Zhukov
Index: bioctl.c
===================================================================
RCS file: /cvs/src/sbin/bioctl/bioctl.c,v
retrieving revision 1.129
diff -u -p -r1.129 bioctl.c
--- bioctl.c 18 Jul 2015 23:23:20 -0000 1.129
+++ bioctl.c 18 Apr 2016 11:17:06 -0000
@@ -69,7 +69,8 @@ void bio_kdf_generate(struct sr_crypto
void derive_key_pkcs(int, u_int8_t *, size_t, u_int8_t *,
size_t, char *, int);
-void bio_inq(char *);
+void bio_listall();
+void bio_inq(char *, int);
void bio_alarm(char *);
int bio_getvolbyname(char *);
void bio_setstate(char *, int, char *);
@@ -110,12 +111,17 @@ main(int argc, char *argv[])
u_int16_t cr_level = 0;
int biodev = 0;
- if (argc < 2)
- usage();
+ if (argc < 2) {
+ bio_listall();
+ return 0;
+ }
- while ((ch = getopt(argc, argv, "a:b:C:c:dH:hik:l:O:Pp:qr:R:st:u:v")) !=
+ while ((ch = getopt(argc, argv, "Aa:b:C:c:dH:hik:l:O:Pp:qr:R:st:u:v"))
!=
-1) {
switch (ch) {
+ case 'A':
+ bio_listall();
+ return 0;
case 'a': /* alarm */
func |= BIOC_ALARM;
al_arg = optarg;
@@ -243,7 +249,7 @@ main(int argc, char *argv[])
} else if (changepass && !biodev) {
bio_changepass(devicename);
} else if (func & BIOC_INQ) {
- bio_inq(devicename);
+ bio_inq(devicename, 0);
} else if (func == BIOC_ALARM) {
bio_alarm(al_arg);
} else if (func == BIOC_BLINK) {
@@ -273,7 +279,7 @@ usage(void)
extern char *__progname;
fprintf(stderr,
- "usage: %s [-hiqv] [-a alarm-function] "
+ "usage: %s [-Ahiqv] [-a alarm-function] "
"[-b channel:target[.lun]]\n"
"\t[-H channel:target[.lun]] "
"[-R device | channel:target[.lun]]\n"
@@ -355,6 +361,43 @@ str2patrol(const char *string, struct ti
}
void
+bio_listall(void)
+{
+ struct bio_locate bl;
+ struct bioc_controllerlist cl;
+ int rv;
+
+ memset(&cl, 0, sizeof(cl));
+ memset(&bl, 0, sizeof(bl));
+
+ devh = open("/dev/bio", O_RDONLY);
+ if (devh == -1)
+ err(1, "Can't open %s", "/dev/bio");
+
+ rv = ioctl(devh, BIOCLISTCONTROLLERS, &cl);
+ if (rv == -1)
+ err(1, "1 BIOCLISTCONTROLLERS");
+ if (cl.bcl_size == 0)
+ return;
+
+ cl.bcl_list = calloc(cl.bcl_size, sizeof(struct bioc_controller));
+ if (cl.bcl_list == NULL)
+ err(1, "calloc");
+ rv = ioctl(devh, BIOCLISTCONTROLLERS, &cl);
+ if (rv == -1)
+ err(1, "2 BIOCLISTCONTROLLERS");
+ while (cl.bcl_size--) {
+ bl.bl_name = cl.bcl_list[cl.bcl_size].bc_xname;
+ if (ioctl(devh, BIOCLOCATE, &bl))
+ errx(1, "Can't locate %s device via %s",
+ bl.bl_name, "/dev/bio");
+ bio_cookie = bl.bl_bio.bio_cookie;
+ bio_inq(NULL, 1);
+ }
+ free(cl.bcl_list);
+}
+
+void
bio_status(struct bio_status *bs)
{
extern char *__progname;
@@ -378,7 +421,7 @@ bio_status(struct bio_status *bs)
}
void
-bio_inq(char *name)
+bio_inq(char *name, int ignorenotsupp)
{
char *status, *cache;
char size[64], scsiname[16], volname[32];
@@ -394,9 +437,10 @@ bio_inq(char *name)
bi.bi_bio.bio_cookie = bio_cookie;
if (ioctl(devh, BIOCINQ, &bi)) {
- if (errno == ENOTTY)
- bio_diskinq(name);
- else
+ if (errno == ENOTTY) {
+ if (!ignorenotsupp)
+ bio_diskinq(name);
+ } else
err(1, "BIOCINQ");
return;
}