summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormav <mav@FreeBSD.org>2017-08-02 14:43:12 +0000
committermav <mav@FreeBSD.org>2017-08-02 14:43:12 +0000
commit7770a98bafa4cc1311521197fd6267eba751c3a3 (patch)
tree4989c0ccb5b1e0dc5ca27eef7f040d7d071580c9
parentcb043642c2bc0bdbf5116d3592b0e8d83d30ffd1 (diff)
downloadFreeBSD-src-7770a98bafa4cc1311521197fd6267eba751c3a3.zip
FreeBSD-src-7770a98bafa4cc1311521197fd6267eba751c3a3.tar.gz
MFC r320555, r320576 (by allanjude):
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.
-rw-r--r--usr.sbin/diskinfo/diskinfo.821
-rw-r--r--usr.sbin/diskinfo/diskinfo.c35
2 files changed, 53 insertions, 3 deletions
diff --git a/usr.sbin/diskinfo/diskinfo.8 b/usr.sbin/diskinfo/diskinfo.8
index c58f9be..e65633e 100644
--- a/usr.sbin/diskinfo/diskinfo.8
+++ b/usr.sbin/diskinfo/diskinfo.8
@@ -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 enclosure.
+.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, media size in bytes,
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 enclosure.
+.El
.Sh HISTORY
The
.Nm
diff --git a/usr.sbin/diskinfo/diskinfo.c b/usr.sbin/diskinfo/diskinfo.c
index 438f1b8..8c79f2f 100644
--- a/usr.sbin/diskinfo/diskinfo.c
+++ b/usr.sbin/diskinfo/diskinfo.c
@@ -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]);
OpenPOWER on IntegriCloud