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. | |||
| 2 | The driver is currently maintained by Kai Mäkisara (email | 2 | The driver is currently maintained by Kai Mäkisara (email |
| 3 | Kai.Makisara@kolumbus.fi) | 3 | Kai.Makisara@kolumbus.fi) |
| 4 | 4 | ||
| 5 | Last modified: Sun Feb 24 21:59:07 2008 by kai.makisara | 5 | Last modified: Sun Aug 29 18:25:47 2010 by kai.makisara |
| 6 | 6 | ||
| 7 | 7 | ||
| 8 | BASICS | 8 | BASICS |
| @@ -85,6 +85,17 @@ writing and the last operation has been a write. Two filemarks can be | |||
| 85 | optionally written. In both cases end of data is signified by | 85 | optionally written. In both cases end of data is signified by |
| 86 | returning zero bytes for two consecutive reads. | 86 | returning zero bytes for two consecutive reads. |
| 87 | 87 | ||
| 88 | Writing filemarks without the immediate bit set in the SCSI command block acts | ||
| 89 | as a synchronization point, i.e., all remaining data form the drive buffers is | ||
| 90 | written to tape before the command returns. This makes sure that write errors | ||
| 91 | are caught at that point, but this takes time. In some applications, several | ||
| 92 | consecutive files must be written fast. The MTWEOFI operation can be used to | ||
| 93 | write the filemarks without flushing the drive buffer. Writing filemark at | ||
| 94 | close() is always flushing the drive buffers. However, if the previous | ||
| 95 | operation is MTWEOFI, close() does not write a filemark. This can be used if | ||
| 96 | the program wants to close/open the tape device between files and wants to | ||
| 97 | skip waiting. | ||
| 98 | |||
| 88 | If rewind, offline, bsf, or seek is done and previous tape operation was | 99 | If rewind, offline, bsf, or seek is done and previous tape operation was |
| 89 | write, a filemark is written before moving tape. | 100 | write, a filemark is written before moving tape. |
| 90 | 101 | ||
| @@ -301,6 +312,8 @@ MTBSR Space backward over count records. | |||
| 301 | MTFSS Space forward over count setmarks. | 312 | MTFSS Space forward over count setmarks. |
| 302 | MTBSS Space backward over count setmarks. | 313 | MTBSS Space backward over count setmarks. |
| 303 | MTWEOF Write count filemarks. | 314 | MTWEOF Write count filemarks. |
| 315 | MTWEOFI Write count filemarks with immediate bit set (i.e., does not | ||
| 316 | wait until data is on tape) | ||
| 304 | MTWSM Write count setmarks. | 317 | MTWSM Write count setmarks. |
| 305 | MTREW Rewind tape. | 318 | MTREW Rewind tape. |
| 306 | MTOFFL Set device off line (often rewind plus eject). | 319 | 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 @@ | |||
| 9 | Steve Hirsch, Andreas Koppenh"ofer, Michael Leodolter, Eyal Lebedinsky, | 9 | Steve Hirsch, Andreas Koppenh"ofer, Michael Leodolter, Eyal Lebedinsky, |
| 10 | Michael Schaefer, J"org Weule, and Eric Youngdale. | 10 | Michael Schaefer, J"org Weule, and Eric Youngdale. |
| 11 | 11 | ||
| 12 | Copyright 1992 - 2008 Kai Makisara | 12 | Copyright 1992 - 2010 Kai Makisara |
| 13 | email Kai.Makisara@kolumbus.fi | 13 | email Kai.Makisara@kolumbus.fi |
| 14 | 14 | ||
| 15 | Some small formal changes - aeb, 950809 | 15 | Some small formal changes - aeb, 950809 |
| @@ -17,7 +17,7 @@ | |||
| 17 | Last modified: 18-JAN-1998 Richard Gooch <rgooch@atnf.csiro.au> Devfs support | 17 | Last modified: 18-JAN-1998 Richard Gooch <rgooch@atnf.csiro.au> Devfs support |
| 18 | */ | 18 | */ |
| 19 | 19 | ||
| 20 | static const char *verstr = "20081215"; | 20 | static const char *verstr = "20100829"; |
| 21 | 21 | ||
| 22 | #include <linux/module.h> | 22 | #include <linux/module.h> |
| 23 | 23 | ||
| @@ -2696,18 +2696,21 @@ static int st_int_ioctl(struct scsi_tape *STp, unsigned int cmd_in, unsigned lon | |||
| 2696 | } | 2696 | } |
| 2697 | break; | 2697 | break; |
| 2698 | case MTWEOF: | 2698 | case MTWEOF: |
| 2699 | case MTWEOFI: | ||
| 2699 | case MTWSM: | 2700 | case MTWSM: |
| 2700 | if (STp->write_prot) | 2701 | if (STp->write_prot) |
| 2701 | return (-EACCES); | 2702 | return (-EACCES); |
| 2702 | cmd[0] = WRITE_FILEMARKS; | 2703 | cmd[0] = WRITE_FILEMARKS; |
| 2703 | if (cmd_in == MTWSM) | 2704 | if (cmd_in == MTWSM) |
| 2704 | cmd[1] = 2; | 2705 | cmd[1] = 2; |
| 2706 | if (cmd_in == MTWEOFI) | ||
| 2707 | cmd[1] |= 1; | ||
| 2705 | cmd[2] = (arg >> 16); | 2708 | cmd[2] = (arg >> 16); |
| 2706 | cmd[3] = (arg >> 8); | 2709 | cmd[3] = (arg >> 8); |
| 2707 | cmd[4] = arg; | 2710 | cmd[4] = arg; |
| 2708 | timeout = STp->device->request_queue->rq_timeout; | 2711 | timeout = STp->device->request_queue->rq_timeout; |
| 2709 | DEBC( | 2712 | DEBC( |
| 2710 | if (cmd_in == MTWEOF) | 2713 | if (cmd_in != MTWSM) |
| 2711 | printk(ST_DEB_MSG "%s: Writing %d filemarks.\n", name, | 2714 | printk(ST_DEB_MSG "%s: Writing %d filemarks.\n", name, |
| 2712 | cmd[2] * 65536 + cmd[3] * 256 + cmd[4]); | 2715 | cmd[2] * 65536 + cmd[3] * 256 + cmd[4]); |
| 2713 | else | 2716 | else |
| @@ -2883,8 +2886,8 @@ static int st_int_ioctl(struct scsi_tape *STp, unsigned int cmd_in, unsigned lon | |||
| 2883 | else if (chg_eof) | 2886 | else if (chg_eof) |
| 2884 | STps->eof = ST_NOEOF; | 2887 | STps->eof = ST_NOEOF; |
| 2885 | 2888 | ||
| 2886 | if (cmd_in == MTWEOF) | 2889 | if (cmd_in == MTWEOF || cmd_in == MTWEOFI) |
| 2887 | STps->rw = ST_IDLE; | 2890 | STps->rw = ST_IDLE; /* prevent automatic WEOF at close */ |
| 2888 | } else { /* SCSI command was not completely successful. Don't return | 2891 | } else { /* SCSI command was not completely successful. Don't return |
| 2889 | from this block without releasing the SCSI command block! */ | 2892 | from this block without releasing the SCSI command block! */ |
| 2890 | struct st_cmdstatus *cmdstatp = &STp->buffer->cmdstat; | 2893 | 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 | |||
| 2901 | else | 2904 | else |
| 2902 | undone = 0; | 2905 | undone = 0; |
| 2903 | 2906 | ||
| 2904 | if (cmd_in == MTWEOF && | 2907 | if ((cmd_in == MTWEOF || cmd_in == MTWEOFI) && |
| 2905 | cmdstatp->have_sense && | 2908 | cmdstatp->have_sense && |
| 2906 | (cmdstatp->flags & SENSE_EOM)) { | 2909 | (cmdstatp->flags & SENSE_EOM)) { |
| 2907 | if (cmdstatp->sense_hdr.sense_key == NO_SENSE || | 2910 | 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 { | |||
| 63 | #define MTCOMPRESSION 32/* control compression with SCSI mode page 15 */ | 63 | #define MTCOMPRESSION 32/* control compression with SCSI mode page 15 */ |
| 64 | #define MTSETPART 33 /* Change the active tape partition */ | 64 | #define MTSETPART 33 /* Change the active tape partition */ |
| 65 | #define MTMKPART 34 /* Format the tape with one or two partitions */ | 65 | #define MTMKPART 34 /* Format the tape with one or two partitions */ |
| 66 | #define MTWEOFI 35 /* write an end-of-file record (mark) in immediate mode */ | ||
| 66 | 67 | ||
| 67 | /* structure for MTIOCGET - mag tape get status command */ | 68 | /* structure for MTIOCGET - mag tape get status command */ |
| 68 | 69 | ||
