Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 11 Dec 1997 11:19:29 -0800 (PST)
From:      Matt Dillon <dillon@best.net>
To:        FreeBSD-gnats-submit@FreeBSD.ORG
Subject:   kern/5274: SCSI tape compression setting fails (with fix)
Message-ID:  <199712111919.LAA05901@flea.best.net>
Resent-Message-ID: <199712111920.LAA06802@hub.freebsd.org>

next in thread | raw e-mail | index | archive | help

>Number:         5274
>Category:       kern
>Synopsis:       mt comp 0/1 does not work, with fix
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    freebsd-bugs
>State:          open
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Thu Dec 11 11:20:01 PST 1997
>Last-Modified:
>Originator:     Matt Dillon
>Organization:
BEST Internet Communications
>Release:        FreeBSD 2.2.5-STABLE i386
>Environment:

	FreeBSD 2.2.5, SCSI-II tape library / Exabyte tapes

>Description:

	The 'mt comp 0/1' command fails because it is sending a SCSI-II
	page without setting the PF bit in byte2, causing the tape unit 
	to interpret the command as SCSI-I.

	Note: my fix below does not double-check that the SCSI tape unit
	is returning a SCSI-II page for the mode sense of the configuration
	page, but compression didn't work at all before so this should be
	an improvement.

>How-To-Repeat:

	Attempt to turn on or off compression on a SCSI tape unit.

>Fix:
	

*** LINK/st.c	Wed Sep 17 15:09:25 1997
--- st.c	Thu Dec 11 11:09:21 1997
***************
*** 81,87 ****
  static errval	st_write_filemarks __P((u_int32_t unit, int32_t number, u_int32_t flags));
  static errval	st_load __P((u_int32_t unit, u_int32_t type, u_int32_t flags));
  static errval	st_mode_select __P((u_int32_t unit, u_int32_t flags, \
! 	struct tape_pages *page, u_int32_t pagelen));
  static errval	st_comp __P((u_int32_t unit, u_int32_t mode));
  static int32_t	st_chkeod __P((u_int32_t unit, boolean position, int32_t *nmarks,
  	u_int32_t flags));
--- 81,87 ----
  static errval	st_write_filemarks __P((u_int32_t unit, int32_t number, u_int32_t flags));
  static errval	st_load __P((u_int32_t unit, u_int32_t type, u_int32_t flags));
  static errval	st_mode_select __P((u_int32_t unit, u_int32_t flags, \
! 	struct tape_pages *page, u_int32_t pagelen, u_int32_t byte2));
  static errval	st_comp __P((u_int32_t unit, u_int32_t mode));
  static int32_t	st_chkeod __P((u_int32_t unit, boolean position, int32_t *nmarks,
  	u_int32_t flags));
***************
*** 579,585 ****
  			return errno;
  		}
  	}
! 	if ( (errno = st_mode_select(unit, 0, NULL, 0)) ) {
  		printf("st%ld: Cannot set selected mode", unit);
  		return errno;
  	}
--- 579,585 ----
  			return errno;
  		}
  	}
! 	if ( (errno = st_mode_select(unit, 0, NULL, 0, 0)) ) {
  		printf("st%ld: Cannot set selected mode", unit);
  		return errno;
  	}
***************
*** 1148,1154 ****
  	 * Check that the mode being asked for is aggreeable to the
  	 * drive. If not, put it back the way it was.
  	 */
! 	if ( (errcode = st_mode_select(unit, 0, NULL, 0)) ) {	/* put back as it was */
  		printf("st%ld: Cannot set selected mode", unit);
  		st->density = hold_density;
  		st->blksiz = hold_blksiz;
--- 1148,1154 ----
  	 * Check that the mode being asked for is aggreeable to the
  	 * drive. If not, put it back the way it was.
  	 */
! 	if ( (errcode = st_mode_select(unit, 0, NULL, 0, 0)) ) {	/* put back as it was */
  		printf("st%ld: Cannot set selected mode", unit);
  		st->density = hold_density;
  		st->blksiz = hold_blksiz;
***************
*** 1371,1380 ****
   * set it into the desire modes etc.
   */
  static	errval
! st_mode_select(unit, flags, page, pagelen)
  	u_int32_t unit, flags;
  	struct tape_pages *page;
  	u_int32_t pagelen;
  {
  	u_int32_t dat_len;
  	struct scsi_mode_select scsi_cmd;
--- 1371,1381 ----
   * set it into the desire modes etc.
   */
  static	errval
! st_mode_select(unit, flags, page, pagelen, byte2)
  	u_int32_t unit, flags;
  	struct tape_pages *page;
  	u_int32_t pagelen;
+ 	u_int32_t byte2;
  {
  	u_int32_t dat_len;
  	struct scsi_mode_select scsi_cmd;
***************
*** 1407,1412 ****
--- 1408,1414 ----
  	bzero(&scsi_cmd, sizeof(scsi_cmd));
  	scsi_cmd.op_code = MODE_SELECT;
  	scsi_cmd.length = dat_len;
+ 	scsi_cmd.byte2 = (u_char)byte2;
  	dat.header.blk_desc_len = sizeof(struct blk_desc);
  	dat.header.dev_spec |= SMH_DSP_BUFF_MODE_ON;
  	dat.blk_desc.density = st->density;
***************
*** 1475,1481 ****
  		printf("st%ld: bad value for compression mode\n",unit);
  		return EINVAL;
  	}
! 	if ( (retval = st_mode_select(unit, 0, &page, pagesize)) )
  	{
  		printf("select returned an error of %d\n",retval);
  		return retval;
--- 1477,1489 ----
  		printf("st%ld: bad value for compression mode\n",unit);
  		return EINVAL;
  	}
! 
! 	/*
! 	 * send ST_PAGE_CONFIGURATION page as SCSI-II command because it
! 	 * is a SCSI-II structure.  This requires the PF bit (0x10) to be
! 	 * set for byte2.
! 	 */
! 	if ( (retval = st_mode_select(unit, 0, &page, pagesize, 0x10)) )
  	{
  		printf("select returned an error of %d\n",retval);
  		return retval;
***************
*** 1934,1940 ****
  		default:
  			readsiz = 1;
  			st->flags &= ~ST_FIXEDBLOCKS;
! 		} if ( (errno = st_mode_select(unit, 0, NULL, 0)) ) {
  			goto bad;
  		}
  		st_read(unit, buf, readsiz, SCSI_SILENT);
--- 1942,1948 ----
  		default:
  			readsiz = 1;
  			st->flags &= ~ST_FIXEDBLOCKS;
! 		} if ( (errno = st_mode_select(unit, 0, NULL, 0, 0)) ) {
  			goto bad;
  		}
  		st_read(unit, buf, readsiz, SCSI_SILENT);
>Audit-Trail:
>Unformatted:



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199712111919.LAA05901>