Skip to content

Commit

Permalink
When running a "chio return" operation using a physical source unit
Browse files Browse the repository at this point in the history
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
  • Loading branch information
joerg authored and joerg committed Oct 30, 2008
1 parent 13ab69b commit 8799893
Showing 1 changed file with 6 additions and 4 deletions.
10 changes: 6 additions & 4 deletions bin/chio/chio.c
Original file line number Diff line number Diff line change
Expand Up @@ -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 **);
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -1004,7 +1005,7 @@ do_return(const char *cname, int argc, char **argv)
* 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;
Expand All @@ -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) {
Expand Down

0 comments on commit 8799893

Please sign in to comment.