diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/scsi/st.c | 21 | ||||
-rw-r--r-- | drivers/scsi/st.h | 1 |
2 files changed, 19 insertions, 3 deletions
diff --git a/drivers/scsi/st.c b/drivers/scsi/st.c index 9262cdfa4b23..8c663e16fd02 100644 --- a/drivers/scsi/st.c +++ b/drivers/scsi/st.c | |||
@@ -1106,6 +1106,12 @@ static int check_tape(struct scsi_tape *STp, struct file *filp) | |||
1106 | STp->drv_buffer)); | 1106 | STp->drv_buffer)); |
1107 | } | 1107 | } |
1108 | STp->drv_write_prot = ((STp->buffer)->b_data[2] & 0x80) != 0; | 1108 | STp->drv_write_prot = ((STp->buffer)->b_data[2] & 0x80) != 0; |
1109 | if (!STp->drv_buffer && STp->immediate_filemark) { | ||
1110 | printk(KERN_WARNING | ||
1111 | "%s: non-buffered tape: disabling writing immediate filemarks\n", | ||
1112 | name); | ||
1113 | STp->immediate_filemark = 0; | ||
1114 | } | ||
1109 | } | 1115 | } |
1110 | st_release_request(SRpnt); | 1116 | st_release_request(SRpnt); |
1111 | SRpnt = NULL; | 1117 | SRpnt = NULL; |
@@ -1314,6 +1320,8 @@ static int st_flush(struct file *filp, fl_owner_t id) | |||
1314 | 1320 | ||
1315 | memset(cmd, 0, MAX_COMMAND_SIZE); | 1321 | memset(cmd, 0, MAX_COMMAND_SIZE); |
1316 | cmd[0] = WRITE_FILEMARKS; | 1322 | cmd[0] = WRITE_FILEMARKS; |
1323 | if (STp->immediate_filemark) | ||
1324 | cmd[1] = 1; | ||
1317 | cmd[4] = 1 + STp->two_fm; | 1325 | cmd[4] = 1 + STp->two_fm; |
1318 | 1326 | ||
1319 | SRpnt = st_do_scsi(NULL, STp, cmd, 0, DMA_NONE, | 1327 | SRpnt = st_do_scsi(NULL, STp, cmd, 0, DMA_NONE, |
@@ -2181,8 +2189,9 @@ static void st_log_options(struct scsi_tape * STp, struct st_modedef * STm, char | |||
2181 | name, STm->defaults_for_writes, STp->omit_blklims, STp->can_partitions, | 2189 | name, STm->defaults_for_writes, STp->omit_blklims, STp->can_partitions, |
2182 | STp->scsi2_logical); | 2190 | STp->scsi2_logical); |
2183 | printk(KERN_INFO | 2191 | printk(KERN_INFO |
2184 | "%s: sysv: %d nowait: %d sili: %d\n", name, STm->sysv, STp->immediate, | 2192 | "%s: sysv: %d nowait: %d sili: %d nowait_filemark: %d\n", |
2185 | STp->sili); | 2193 | name, STm->sysv, STp->immediate, STp->sili, |
2194 | STp->immediate_filemark); | ||
2186 | printk(KERN_INFO "%s: debugging: %d\n", | 2195 | printk(KERN_INFO "%s: debugging: %d\n", |
2187 | name, debugging); | 2196 | name, debugging); |
2188 | } | 2197 | } |
@@ -2224,6 +2233,7 @@ static int st_set_options(struct scsi_tape *STp, long options) | |||
2224 | STp->can_partitions = (options & MT_ST_CAN_PARTITIONS) != 0; | 2233 | STp->can_partitions = (options & MT_ST_CAN_PARTITIONS) != 0; |
2225 | STp->scsi2_logical = (options & MT_ST_SCSI2LOGICAL) != 0; | 2234 | STp->scsi2_logical = (options & MT_ST_SCSI2LOGICAL) != 0; |
2226 | STp->immediate = (options & MT_ST_NOWAIT) != 0; | 2235 | STp->immediate = (options & MT_ST_NOWAIT) != 0; |
2236 | STp->immediate_filemark = (options & MT_ST_NOWAIT_EOF) != 0; | ||
2227 | STm->sysv = (options & MT_ST_SYSV) != 0; | 2237 | STm->sysv = (options & MT_ST_SYSV) != 0; |
2228 | STp->sili = (options & MT_ST_SILI) != 0; | 2238 | STp->sili = (options & MT_ST_SILI) != 0; |
2229 | DEB( debugging = (options & MT_ST_DEBUGGING) != 0; | 2239 | DEB( debugging = (options & MT_ST_DEBUGGING) != 0; |
@@ -2255,6 +2265,8 @@ static int st_set_options(struct scsi_tape *STp, long options) | |||
2255 | STp->scsi2_logical = value; | 2265 | STp->scsi2_logical = value; |
2256 | if ((options & MT_ST_NOWAIT) != 0) | 2266 | if ((options & MT_ST_NOWAIT) != 0) |
2257 | STp->immediate = value; | 2267 | STp->immediate = value; |
2268 | if ((options & MT_ST_NOWAIT_EOF) != 0) | ||
2269 | STp->immediate_filemark = value; | ||
2258 | if ((options & MT_ST_SYSV) != 0) | 2270 | if ((options & MT_ST_SYSV) != 0) |
2259 | STm->sysv = value; | 2271 | STm->sysv = value; |
2260 | if ((options & MT_ST_SILI) != 0) | 2272 | if ((options & MT_ST_SILI) != 0) |
@@ -2714,7 +2726,8 @@ static int st_int_ioctl(struct scsi_tape *STp, unsigned int cmd_in, unsigned lon | |||
2714 | cmd[0] = WRITE_FILEMARKS; | 2726 | cmd[0] = WRITE_FILEMARKS; |
2715 | if (cmd_in == MTWSM) | 2727 | if (cmd_in == MTWSM) |
2716 | cmd[1] = 2; | 2728 | cmd[1] = 2; |
2717 | if (cmd_in == MTWEOFI) | 2729 | if (cmd_in == MTWEOFI || |
2730 | (cmd_in == MTWEOF && STp->immediate_filemark)) | ||
2718 | cmd[1] |= 1; | 2731 | cmd[1] |= 1; |
2719 | cmd[2] = (arg >> 16); | 2732 | cmd[2] = (arg >> 16); |
2720 | cmd[3] = (arg >> 8); | 2733 | cmd[3] = (arg >> 8); |
@@ -4093,6 +4106,7 @@ static int st_probe(struct device *dev) | |||
4093 | tpnt->scsi2_logical = ST_SCSI2LOGICAL; | 4106 | tpnt->scsi2_logical = ST_SCSI2LOGICAL; |
4094 | tpnt->sili = ST_SILI; | 4107 | tpnt->sili = ST_SILI; |
4095 | tpnt->immediate = ST_NOWAIT; | 4108 | tpnt->immediate = ST_NOWAIT; |
4109 | tpnt->immediate_filemark = 0; | ||
4096 | tpnt->default_drvbuffer = 0xff; /* No forced buffering */ | 4110 | tpnt->default_drvbuffer = 0xff; /* No forced buffering */ |
4097 | tpnt->partition = 0; | 4111 | tpnt->partition = 0; |
4098 | tpnt->new_partition = 0; | 4112 | tpnt->new_partition = 0; |
@@ -4478,6 +4492,7 @@ st_options_show(struct device *dev, struct device_attribute *attr, char *buf) | |||
4478 | options |= STp->scsi2_logical ? MT_ST_SCSI2LOGICAL : 0; | 4492 | options |= STp->scsi2_logical ? MT_ST_SCSI2LOGICAL : 0; |
4479 | options |= STm->sysv ? MT_ST_SYSV : 0; | 4493 | options |= STm->sysv ? MT_ST_SYSV : 0; |
4480 | options |= STp->immediate ? MT_ST_NOWAIT : 0; | 4494 | options |= STp->immediate ? MT_ST_NOWAIT : 0; |
4495 | options |= STp->immediate_filemark ? MT_ST_NOWAIT_EOF : 0; | ||
4481 | options |= STp->sili ? MT_ST_SILI : 0; | 4496 | options |= STp->sili ? MT_ST_SILI : 0; |
4482 | 4497 | ||
4483 | l = snprintf(buf, PAGE_SIZE, "0x%08x\n", options); | 4498 | l = snprintf(buf, PAGE_SIZE, "0x%08x\n", options); |
diff --git a/drivers/scsi/st.h b/drivers/scsi/st.h index f91a67c6d968..ea35632b986c 100644 --- a/drivers/scsi/st.h +++ b/drivers/scsi/st.h | |||
@@ -120,6 +120,7 @@ struct scsi_tape { | |||
120 | unsigned char c_algo; /* compression algorithm */ | 120 | unsigned char c_algo; /* compression algorithm */ |
121 | unsigned char pos_unknown; /* after reset position unknown */ | 121 | unsigned char pos_unknown; /* after reset position unknown */ |
122 | unsigned char sili; /* use SILI when reading in variable b mode */ | 122 | unsigned char sili; /* use SILI when reading in variable b mode */ |
123 | unsigned char immediate_filemark; /* write filemark immediately */ | ||
123 | int tape_type; | 124 | int tape_type; |
124 | int long_timeout; /* timeout for commands known to take long time */ | 125 | int long_timeout; /* timeout for commands known to take long time */ |
125 | 126 | ||