aboutsummaryrefslogtreecommitdiff
path: root/src/sg_reset.c
diff options
context:
space:
mode:
authorDouglas Gilbert <dgilbert@interlog.com>2014-10-24 22:37:54 +0000
committerDouglas Gilbert <dgilbert@interlog.com>2014-10-24 22:37:54 +0000
commitd4fa3af08dabe55f9c21c7410699cdefd5afc0ab (patch)
tree709895cdb236b7017678861154d504f6c7a7f8c7 /src/sg_reset.c
parent649a5fc19092ea6141f0dddfd940a44a845b0778 (diff)
downloadsg3_utils-d4fa3af08dabe55f9c21c7410699cdefd5afc0ab.tar.gz
sg_reset: add words for EAGAIN from reset ioctl; minor cleanups
git-svn-id: https://svn.bingwo.ca/repos/sg3_utils/trunk@617 6180dd3e-e324-4e3e-922d-17de1ae2f315
Diffstat (limited to 'src/sg_reset.c')
-rw-r--r--src/sg_reset.c37
1 files changed, 29 insertions, 8 deletions
diff --git a/src/sg_reset.c b/src/sg_reset.c
index 2e4bd240..708ac019 100644
--- a/src/sg_reset.c
+++ b/src/sg_reset.c
@@ -1,5 +1,5 @@
/* A utility program originally written for the Linux OS SCSI subsystem.
- * Copyright (C) 1999-2013 D. Gilbert
+ * Copyright (C) 1999-2014 D. Gilbert
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
@@ -28,7 +28,7 @@
#define ME "sg_reset: "
-static const char * version_str = "0.58 20130507";
+static const char * version_str = "0.59 20141024";
#ifndef SG_SCSI_RESET
#define SG_SCSI_RESET 0x2284
@@ -105,7 +105,7 @@ usage(int compat_mode)
int main(int argc, char * argv[])
{
- int c, sg_fd, res, k;
+ int c, sg_fd, res, k, hold_errno;
int do_device_reset = 0;
int do_bus_reset = 0;
int do_host_reset = 0;
@@ -226,22 +226,43 @@ int main(int argc, char * argv[])
}
if (no_escalate)
k += SG_SCSI_RESET_NO_ESCALATE;
+ if (verbose > 2)
+ fprintf(stderr, " third argument to ioctl(SG_SCSI_RESET) is "
+ "0x%x\n", k);
res = ioctl(sg_fd, SG_SCSI_RESET, &k);
if (res < 0) {
- if (EBUSY == errno)
+ hold_errno = errno;
+ switch (errno) {
+ case EBUSY:
fprintf(stderr, ME "BUSY, may be resetting now\n");
- else if (EIO == errno)
+ break;
+ case ENODEV:
+ fprintf(stderr, ME "'no device' error, may be temporary while "
+ "device is resetting\n");
+ break;
+ case EAGAIN:
+ fprintf(stderr, ME "try again later, may be resetting now\n");
+ break;
+ case EIO:
fprintf(stderr, ME "reset (for value=0x%x) may not be "
"available\n", k);
- else if (EACCES == errno)
+ break;
+ case EPERM:
+ case EACCES:
fprintf(stderr, ME "reset requires CAP_SYS_ADMIN (root) "
"permission\n");
- else if (EINVAL == errno)
+ break;
+ case EINVAL:
fprintf(stderr, ME "SG_SCSI_RESET not supported (for "
"value=0x%x)\n", k);
- else
+ default:
perror(ME "SG_SCSI_RESET failed");
+ break;
+ }
+ if (verbose > 1)
+ fprintf(stderr, ME "ioctl(SG_SCSI_RESET) returned %d, errno=%d\n",
+ res, hold_errno);
close(sg_fd);
return 1;
}