Module Name:    src
Committed By:   mlelstv
Date:           Sun Aug 21 12:44:16 UTC 2022

Modified Files:
        src/sbin/scsictl: scsictl.8 scsictl.c

Log Message:
Add REPORT_LUNS command.


To generate a diff of this commit:
cvs rdiff -u -r1.31 -r1.32 src/sbin/scsictl/scsictl.8
cvs rdiff -u -r1.39 -r1.40 src/sbin/scsictl/scsictl.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sbin/scsictl/scsictl.8
diff -u src/sbin/scsictl/scsictl.8:1.31 src/sbin/scsictl/scsictl.8:1.32
--- src/sbin/scsictl/scsictl.8:1.31	Wed Mar  8 11:45:14 2017
+++ src/sbin/scsictl/scsictl.8	Sun Aug 21 12:44:16 2022
@@ -1,4 +1,4 @@
-.\"	$NetBSD: scsictl.8,v 1.31 2017/03/08 11:45:14 tsutsui Exp $
+.\"	$NetBSD: scsictl.8,v 1.32 2022/08/21 12:44:16 mlelstv Exp $
 .\"
 .\" Copyright (c) 1998, 2002 The NetBSD Foundation, Inc.
 .\" All rights reserved.
@@ -196,6 +196,27 @@ If the drive's automatic reallocation pa
 .Ar save
 after the automatic reallocation enable state will cause the parameters to be
 saved in non-volatile storage.
+.It Cm reportluns Ar normal|wellknown|all|#
+Report Logical Units provided by the drive.
+.Bl -hang -compact
+.It normal
+report all but well-known logical units.
+This is also the default.
+.It wellknown
+report the well known logical units instead. E.g.,
+.Bl -inset -compact
+.It 0xc101h
+Addressable objects
+.It 0xc102h
+Addressable objects associations
+.It 0xc103h
+SCSI target device identification
+.El
+.It all
+report all logical units.
+.It #
+Use the given numeric select report value (0-255).
+.El
 .El
 .Sh BUS COMMANDS
 The following commands are supported for SCSI busses:

Index: src/sbin/scsictl/scsictl.c
diff -u src/sbin/scsictl/scsictl.c:1.39 src/sbin/scsictl/scsictl.c:1.40
--- src/sbin/scsictl/scsictl.c:1.39	Sat Nov 19 08:43:40 2016
+++ src/sbin/scsictl/scsictl.c	Sun Aug 21 12:44:16 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: scsictl.c,v 1.39 2016/11/19 08:43:40 flxd Exp $	*/
+/*	$NetBSD: scsictl.c,v 1.40 2022/08/21 12:44:16 mlelstv Exp $	*/
 
 /*-
  * Copyright (c) 1998, 2002 The NetBSD Foundation, Inc.
@@ -36,7 +36,7 @@
 #include <sys/cdefs.h>
 
 #ifndef lint
-__RCSID("$NetBSD: scsictl.c,v 1.39 2016/11/19 08:43:40 flxd Exp $");
+__RCSID("$NetBSD: scsictl.c,v 1.40 2022/08/21 12:44:16 mlelstv Exp $");
 #endif
 
 
@@ -93,6 +93,7 @@ static void	device_flushcache(int, char 
 static void	device_setspeed(int, char *[]);
 static void	device_getrealloc(int, char *[]);
 static void	device_setrealloc(int, char *[]);
+static void	device_reportluns(int, char *[]);
 
 static struct command device_commands[] = {
 	{ "defects",	"[primary] [grown] [block|byte|physical]",
@@ -115,6 +116,7 @@ static struct command device_commands[] 
 	{ "setspeed",	"[speed]",		device_setspeed },
 	{ "getrealloc",	"",			device_getrealloc },
 	{ "setrealloc",	"none|r|w|rw [save]",	device_setrealloc },
+	{ "reportluns",	"normal|wellknown|all|#",	device_reportluns },
 	{ NULL,		NULL,			NULL },
 };
 
@@ -985,6 +987,88 @@ device_setspeed(int argc, char *argv[])
 }
 
 /*
+ * device_reportluns:
+ *
+ *	Report the known LUNs to which the initiator can send commands
+ */
+static void
+device_reportluns(int argc, char *argv[])
+{
+	struct scsi_report_luns cmd;
+	struct {
+		struct scsi_report_luns_header header;
+		struct scsi_report_luns_lun desc[1];
+	} *data;
+	u_int32_t dlen, len;
+	u_int64_t lun;
+	size_t count, idx;
+	unsigned long sel;
+	char *endp;
+	int i;
+
+	dlen = USHRT_MAX; /* good for > 8000 LUNs */
+	data = malloc(dlen);
+	if (data == NULL)
+		errx(1, "unable to allocate lun report");
+
+	memset(&cmd, 0, sizeof(cmd));
+	cmd.opcode = SCSI_REPORT_LUNS;
+	cmd.selectreport = SELECTREPORT_NORMAL;
+
+	/* determine which report to read. */
+	for (i = 0; i < argc; i++) {
+		if (strcmp("normal", argv[i]) == 0) {
+			cmd.selectreport = SELECTREPORT_NORMAL;
+			continue;
+		}
+		if (strcmp("wellknown", argv[i]) == 0) {
+			cmd.selectreport = SELECTREPORT_WELLKNOWN;
+			continue;
+		}
+		if (strcmp("all", argv[i]) == 0) {
+			cmd.selectreport = SELECTREPORT_ALL;
+			continue;
+		}
+		sel = strtoul(argv[i], &endp, 0);
+		if (*endp != '\0' || sel > 255)
+			errx(1, "Unknown select report '%s'", argv[i]);
+		cmd.selectreport = sel;
+	}
+
+	_lto4b(dlen, &cmd.alloclen[0]);
+	cmd.control = 0x00;
+
+	scsi_command(fd, &cmd, sizeof(cmd), data, dlen, 30000, SCCMD_READ);
+
+	len = _4btol(data->header.length);
+	if (len > dlen) {
+		/* XXX reallocate and retry */
+		printf("%s: report truncated %" PRIu32 "to %" PRIu32 "\n",
+		    dvname, len, dlen);
+		len = dlen;
+	}
+
+	count = len / sizeof(data->desc[0]);
+
+	for (idx=0; idx<count; ++idx) {
+		lun = _8btol(data->desc[idx].lun);
+
+		/*
+		 * swizzle bits so that LUNs 0..255 are
+		 * mapped to numbers 0..255
+		 */
+		lun = (lun & 0xffff000000000000ull) >> 48
+		    | (lun & 0x0000ffff00000000ull) >> 16
+		    | (lun & 0x00000000ffff0000ull) << 16
+		    | (lun & 0x000000000000ffffull) << 48;
+
+		printf("%s: lun %" PRIu64 "\n", dvname, lun);
+	}
+
+	free(data);
+}
+
+/*
  * device_getrealloc:
  *
  *	Get the automatic reallocation parameters for a SCSI disk.

Reply via email to