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.