Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 1 Jul 2017 21:34:57 +0000 (UTC)
From:      Allan Jude <allanjude@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r320555 - head/usr.sbin/diskinfo
Message-ID:  <201707012134.v61LYvFc026064@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: allanjude
Date: Sat Jul  1 21:34:57 2017
New Revision: 320555
URL: https://svnweb.freebsd.org/changeset/base/320555

Log:
  Add -s (serial) and -p (physpath) to diskinfo
  
  Return the bare requested information, intended for scripting.
  
  The serial number of a SAS/SCSI device can be returned with
  'camcontrol inquiry disk -S', but there is no similar switch for SATA.
  
  This provides a way to get this information from both SAS and SATA disks
  
  the -s and -p flags are mutually exclusive, and cannot be used with any
  other flags.
  
  Reviewed by:	rpokala, wblock
  MFC after:	1 month
  Sponsored by:	ScaleEngine Inc.
  Differential Revision:	https://reviews.freebsd.org/D7828

Modified:
  head/usr.sbin/diskinfo/diskinfo.8
  head/usr.sbin/diskinfo/diskinfo.c

Modified: head/usr.sbin/diskinfo/diskinfo.8
==============================================================================
--- head/usr.sbin/diskinfo/diskinfo.8	Sat Jul  1 21:18:06 2017	(r320554)
+++ head/usr.sbin/diskinfo/diskinfo.8	Sat Jul  1 21:34:57 2017	(r320555)
@@ -28,7 +28,7 @@
 .\"
 .\" $FreeBSD$
 .\"
-.Dd September 22, 2016
+.Dd July 1, 2017
 .Dt DISKINFO 8
 .Os
 .Sh NAME
@@ -38,6 +38,12 @@
 .Nm
 .Op Fl citv
 .Ar disk ...
+.Nm
+.Op Fl p
+.Ar disk ...
+.Nm
+.Op Fl s
+.Ar disk ...
 .Sh DESCRIPTION
 The
 .Nm
@@ -52,6 +58,12 @@ Print fields one per line with a descriptive comment.
 Perform a simple measurement of the I/O read command overhead.
 .It Fl i
 Perform a simple IOPS benchmark.
+.It Fl p
+Return the physical path of the disk.
+This is a string that identifies the physical path to the disk in the
+storage enclsoure.
+.It Fl s
+Return the disk serial number
 .It Fl t
 Perform a simple and rather naive benchmark of the disks seek
 and transfer performance.
@@ -62,6 +74,13 @@ with the following fields: device name, sectorsize, me
 media size in sectors, stripe size, stripe offset, firmware cylinders,
 firmware heads, and firmware sectors.
 The last three fields are only present if the information is available.
+.It Fl i
+Return the disk ident, usually the serial number.
+.It Fl p
+Return the physical path of the disk.
+This is a string that identifies the physical path to the disk in the
+storage enclsoure.
+.El
 .Sh HISTORY
 The
 .Nm

Modified: head/usr.sbin/diskinfo/diskinfo.c
==============================================================================
--- head/usr.sbin/diskinfo/diskinfo.c	Sat Jul  1 21:18:06 2017	(r320554)
+++ head/usr.sbin/diskinfo/diskinfo.c	Sat Jul  1 21:34:57 2017	(r320555)
@@ -55,7 +55,7 @@ usage(void)
 	exit (1);
 }
 
-static int opt_c, opt_i, opt_t, opt_v;
+static int opt_c, opt_i, opt_p, opt_s, opt_t, opt_v;
 
 static void speeddisk(int fd, off_t mediasize, u_int sectorsize);
 static void commandtime(int fd, off_t mediasize, u_int sectorsize);
@@ -74,7 +74,7 @@ main(int argc, char **argv)
 	u_int	sectorsize, fwsectors, fwheads, zoned = 0;
 	uint32_t zone_mode;
 
-	while ((ch = getopt(argc, argv, "citv")) != -1) {
+	while ((ch = getopt(argc, argv, "cipstv")) != -1) {
 		switch (ch) {
 		case 'c':
 			opt_c = 1;
@@ -84,6 +84,12 @@ main(int argc, char **argv)
 			opt_i = 1;
 			opt_v = 1;
 			break;
+		case 'p':
+			opt_p = 1;
+			break;
+		case 's':
+			opt_s = 1;
+			break;
 		case 't':
 			opt_t = 1;
 			opt_v = 1;
@@ -101,6 +107,11 @@ main(int argc, char **argv)
 	if (argc < 1)
 		usage();
 
+	if ((opt_p && opt_s) || ((opt_p || opt_s) && (opt_c || opt_i || opt_t || opt_v))) {
+		warnx("-p or -s cannot be used with other options");
+		usage();
+	}
+
 	for (i = 0; i < argc; i++) {
 		fd = open(argv[i], O_RDONLY | O_DIRECT);
 		if (fd < 0 && errno == ENOENT && *argv[i] != '/') {
@@ -124,7 +135,27 @@ main(int argc, char **argv)
 			fwheads = 0;
 			stripesize = sb.st_blksize;
 			stripeoffset = 0;
+			if (opt_p || opt_s) {
+				warnx("-p and -s only operate on physical devices: %s", argv[i]);
+				goto out;
+			}
 		} else {
+			if (opt_p) {
+				if (ioctl(fd, DIOCGPHYSPATH, physpath) == 0) {
+					printf("%s\n", physpath);
+				} else {
+					warnx("Failed to determine physpath for: %s", argv[i]);
+				}
+				goto out;
+			}
+			if (opt_s) {
+				if (ioctl(fd, DIOCGIDENT, ident) == 0) {
+					printf("%s\n", ident);
+				} else {
+					warnx("Failed to determine serial number for: %s", argv[i]);
+				}
+				goto out;
+			}
 			error = ioctl(fd, DIOCGMEDIASIZE, &mediasize);
 			if (error) {
 				warnx("%s: ioctl(DIOCGMEDIASIZE) failed, probably not a disk.", argv[i]);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201707012134.v61LYvFc026064>