summaryrefslogtreecommitdiffstats
path: root/bin/chio
diff options
context:
space:
mode:
authorjoerg <joerg@FreeBSD.org>2008-10-30 19:51:02 +0000
committerjoerg <joerg@FreeBSD.org>2008-10-30 19:51:02 +0000
commit8799893942bb6a1f9b0c146d762b16f3455444cb (patch)
tree431e60e87318892ead00b945105b19b8dde05cf8 /bin/chio
parent13ab69b4feb47b56b8e9592c7913801bd3c95548 (diff)
downloadFreeBSD-src-8799893942bb6a1f9b0c146d762b16f3455444cb.zip
FreeBSD-src-8799893942bb6a1f9b0c146d762b16f3455444cb.tar.gz
When running a "chio return" operation using a physical source unit
rather than a voltag name, do not set the CESR_VOLTAGS flags in the CHIOGSTATUS command requesting the current status. As voltags are an optional feature that must be handled as "reserved" by media changers not implementing the feature, always setting CESR_VOLTAGS resulted in the command being aborted with an `Invalid field in CDB', and consequently the "chio return" failed, for media changers that do not support voltags. MFC after: 1 week
Diffstat (limited to 'bin/chio')
-rw-r--r--bin/chio/chio.c10
1 files changed, 6 insertions, 4 deletions
diff --git a/bin/chio/chio.c b/bin/chio/chio.c
index cdfcf82..aaddb68 100644
--- a/bin/chio/chio.c
+++ b/bin/chio/chio.c
@@ -69,7 +69,7 @@ static const char *bits_to_string(ces_status_flags, const char *);
static void find_element(char *, uint16_t *, uint16_t *);
static struct changer_element_status *get_element_status
- (unsigned int, unsigned int);
+ (unsigned int, unsigned int, int);
static int do_move(const char *, int, char **);
static int do_exchange(const char *, int, char **);
@@ -969,7 +969,8 @@ do_return(const char *cname, int argc, char **argv)
++argv; --argc;
/* Get the status */
- ces = get_element_status((unsigned int)type, (unsigned int)element);
+ ces = get_element_status((unsigned int)type, (unsigned int)element,
+ CHET_VT == type);
if (NULL == ces)
errx(1, "%s: null element status pointer", cname);
@@ -1004,7 +1005,7 @@ usage:
* should free() it when done.
*/
static struct changer_element_status *
-get_element_status(unsigned int type, unsigned int element)
+get_element_status(unsigned int type, unsigned int element, int use_voltags)
{
struct changer_element_status_request cesr;
struct changer_element_status *ces;
@@ -1020,7 +1021,8 @@ get_element_status(unsigned int type, unsigned int element)
cesr.cesr_element_type = (uint16_t)type;
cesr.cesr_element_base = (uint16_t)element;
cesr.cesr_element_count = 1; /* Only this one element */
- cesr.cesr_flags |= CESR_VOLTAGS; /* Grab voltags as well */
+ if (use_voltags)
+ cesr.cesr_flags |= CESR_VOLTAGS; /* Grab voltags as well */
cesr.cesr_element_status = ces;
if (ioctl(changer_fd, CHIOGSTATUS, (char *)&cesr) == -1) {
OpenPOWER on IntegriCloud