diff options
author | Douglas Gilbert <dgilbert@interlog.com> | 2014-10-24 22:37:54 +0000 |
---|---|---|
committer | Douglas Gilbert <dgilbert@interlog.com> | 2014-10-24 22:37:54 +0000 |
commit | d4fa3af08dabe55f9c21c7410699cdefd5afc0ab (patch) | |
tree | 709895cdb236b7017678861154d504f6c7a7f8c7 /src/sg_reset.c | |
parent | 649a5fc19092ea6141f0dddfd940a44a845b0778 (diff) | |
download | sg3_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.c | 37 |
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; } |