[SCSI] st: add MTWEOFI to write filemarks without flushing drive buffer
This patch adds a new MTIOCTOP operation MTWEOFI that writes filemarks with immediate bit set. This means that the drive does not flush its buffer and the next file can be started immediately. This speeds up writing in applications that have to write multiple small files. Signed-off-by: Kai Makisara <kai.makisara@kolumbus.fi> Signed-off-by: James Bottomley <James.Bottomley@suse.de>
This commit is contained in:
parent
56dd2c0691
commit
3e51d3c924
3 changed files with 24 additions and 7 deletions
|
@ -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).
|
||||
|
|
|
@ -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 ||
|
||||
|
|
|
@ -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 */
|
||||
|
||||
|
|
Loading…
Reference in a new issue