diff options
| -rw-r--r-- | Documentation/scsi/st.txt | 15 | ||||
| -rw-r--r-- | drivers/scsi/st.c | 15 | ||||
| -rw-r--r-- | include/linux/mtio.h | 1 | 
3 files changed, 24 insertions, 7 deletions
diff --git a/Documentation/scsi/st.txt b/Documentation/scsi/st.txt index 40752602c050..691ca292c24d 100644 --- a/Documentation/scsi/st.txt +++ b/Documentation/scsi/st.txt @@ -2,7 +2,7 @@ This file contains brief information about the SCSI tape driver.  The driver is currently maintained by Kai Mäkisara (email  Kai.Makisara@kolumbus.fi) -Last modified: Sun Feb 24 21:59:07 2008 by kai.makisara +Last modified: Sun Aug 29 18:25:47 2010 by kai.makisara  BASICS @@ -85,6 +85,17 @@ writing and the last operation has been a write. Two filemarks can be  optionally written. In both cases end of data is signified by  returning zero bytes for two consecutive reads. +Writing filemarks without the immediate bit set in the SCSI command block acts +as a synchronization point, i.e., all remaining data form the drive buffers is +written to tape before the command returns. This makes sure that write errors +are caught at that point, but this takes time. In some applications, several +consecutive files must be written fast. The MTWEOFI operation can be used to +write the filemarks without flushing the drive buffer. Writing filemark at +close() is always flushing the drive buffers. However, if the previous +operation is MTWEOFI, close() does not write a filemark. This can be used if +the program wants to close/open the tape device between files and wants to +skip waiting. +  If rewind, offline, bsf, or seek is done and previous tape operation was  write, a filemark is written before moving tape. @@ -301,6 +312,8 @@ MTBSR   Space backward over count records.  MTFSS   Space forward over count setmarks.  MTBSS   Space backward over count setmarks.  MTWEOF  Write count filemarks. +MTWEOFI	Write count filemarks with immediate bit set (i.e., does not +	wait until data is on tape)  MTWSM   Write count setmarks.  MTREW   Rewind tape.  MTOFFL  Set device off line (often rewind plus eject). diff --git a/drivers/scsi/st.c b/drivers/scsi/st.c index 24211d0efa6d..9e2c3a72ff4d 100644 --- a/drivers/scsi/st.c +++ b/drivers/scsi/st.c @@ -9,7 +9,7 @@     Steve Hirsch, Andreas Koppenh"ofer, Michael Leodolter, Eyal Lebedinsky,     Michael Schaefer, J"org Weule, and Eric Youngdale. -   Copyright 1992 - 2008 Kai Makisara +   Copyright 1992 - 2010 Kai Makisara     email Kai.Makisara@kolumbus.fi     Some small formal changes - aeb, 950809 @@ -17,7 +17,7 @@     Last modified: 18-JAN-1998 Richard Gooch <rgooch@atnf.csiro.au> Devfs support   */ -static const char *verstr = "20081215"; +static const char *verstr = "20100829";  #include <linux/module.h> @@ -2696,18 +2696,21 @@ static int st_int_ioctl(struct scsi_tape *STp, unsigned int cmd_in, unsigned lon  		}  		break;  	case MTWEOF: +	case MTWEOFI:  	case MTWSM:  		if (STp->write_prot)  			return (-EACCES);  		cmd[0] = WRITE_FILEMARKS;  		if (cmd_in == MTWSM)  			cmd[1] = 2; +		if (cmd_in == MTWEOFI) +			cmd[1] |= 1;  		cmd[2] = (arg >> 16);  		cmd[3] = (arg >> 8);  		cmd[4] = arg;  		timeout = STp->device->request_queue->rq_timeout;                  DEBC( -                     if (cmd_in == MTWEOF) +		     if (cmd_in != MTWSM)                                 printk(ST_DEB_MSG "%s: Writing %d filemarks.\n", name,  				 cmd[2] * 65536 + cmd[3] * 256 + cmd[4]);                       else @@ -2883,8 +2886,8 @@ static int st_int_ioctl(struct scsi_tape *STp, unsigned int cmd_in, unsigned lon  		else if (chg_eof)  			STps->eof = ST_NOEOF; -		if (cmd_in == MTWEOF) -			STps->rw = ST_IDLE; +		if (cmd_in == MTWEOF || cmd_in == MTWEOFI) +			STps->rw = ST_IDLE;  /* prevent automatic WEOF at close */  	} else { /* SCSI command was not completely successful. Don't return                      from this block without releasing the SCSI command block! */  		struct st_cmdstatus *cmdstatp = &STp->buffer->cmdstat; @@ -2901,7 +2904,7 @@ static int st_int_ioctl(struct scsi_tape *STp, unsigned int cmd_in, unsigned lon  		else  			undone = 0; -		if (cmd_in == MTWEOF && +		if ((cmd_in == MTWEOF || cmd_in == MTWEOFI) &&  		    cmdstatp->have_sense &&  		    (cmdstatp->flags & SENSE_EOM)) {  			if (cmdstatp->sense_hdr.sense_key == NO_SENSE || diff --git a/include/linux/mtio.h b/include/linux/mtio.h index ef01d6aa5934..8f825756c459 100644 --- a/include/linux/mtio.h +++ b/include/linux/mtio.h @@ -63,6 +63,7 @@ struct	mtop {  #define MTCOMPRESSION 32/* control compression with SCSI mode page 15 */  #define MTSETPART 33	/* Change the active tape partition */  #define MTMKPART  34	/* Format the tape with one or two partitions */ +#define MTWEOFI	35	/* write an end-of-file record (mark) in immediate mode */  /* structure for MTIOCGET - mag tape get status command */  | 
