diff options
Diffstat (limited to 'drivers/scsi/st.c')
| -rw-r--r-- | drivers/scsi/st.c | 22 | 
1 files changed, 18 insertions, 4 deletions
diff --git a/drivers/scsi/st.c b/drivers/scsi/st.c index 9262cdfa4b2..e41998cb098 100644 --- a/drivers/scsi/st.c +++ b/drivers/scsi/st.c @@ -42,7 +42,6 @@ static const char *verstr = "20101219";  #include <asm/uaccess.h>  #include <asm/dma.h> -#include <asm/system.h>  #include <scsi/scsi.h>  #include <scsi/scsi_dbg.h> @@ -1106,6 +1105,12 @@ static int check_tape(struct scsi_tape *STp, struct file *filp)                                      STp->drv_buffer));  		}  		STp->drv_write_prot = ((STp->buffer)->b_data[2] & 0x80) != 0; +		if (!STp->drv_buffer && STp->immediate_filemark) { +			printk(KERN_WARNING +			    "%s: non-buffered tape: disabling writing immediate filemarks\n", +			    name); +			STp->immediate_filemark = 0; +		}  	}  	st_release_request(SRpnt);  	SRpnt = NULL; @@ -1314,6 +1319,8 @@ static int st_flush(struct file *filp, fl_owner_t id)  		memset(cmd, 0, MAX_COMMAND_SIZE);  		cmd[0] = WRITE_FILEMARKS; +		if (STp->immediate_filemark) +			cmd[1] = 1;  		cmd[4] = 1 + STp->two_fm;  		SRpnt = st_do_scsi(NULL, STp, cmd, 0, DMA_NONE, @@ -2181,8 +2188,9 @@ static void st_log_options(struct scsi_tape * STp, struct st_modedef * STm, char  		       name, STm->defaults_for_writes, STp->omit_blklims, STp->can_partitions,  		       STp->scsi2_logical);  		printk(KERN_INFO -		       "%s:    sysv: %d nowait: %d sili: %d\n", name, STm->sysv, STp->immediate, -			STp->sili); +		       "%s:    sysv: %d nowait: %d sili: %d nowait_filemark: %d\n", +		       name, STm->sysv, STp->immediate, STp->sili, +		       STp->immediate_filemark);  		printk(KERN_INFO "%s:    debugging: %d\n",  		       name, debugging);  	} @@ -2224,6 +2232,7 @@ static int st_set_options(struct scsi_tape *STp, long options)  			STp->can_partitions = (options & MT_ST_CAN_PARTITIONS) != 0;  		STp->scsi2_logical = (options & MT_ST_SCSI2LOGICAL) != 0;  		STp->immediate = (options & MT_ST_NOWAIT) != 0; +		STp->immediate_filemark = (options & MT_ST_NOWAIT_EOF) != 0;  		STm->sysv = (options & MT_ST_SYSV) != 0;  		STp->sili = (options & MT_ST_SILI) != 0;  		DEB( debugging = (options & MT_ST_DEBUGGING) != 0; @@ -2255,6 +2264,8 @@ static int st_set_options(struct scsi_tape *STp, long options)  			STp->scsi2_logical = value;  		if ((options & MT_ST_NOWAIT) != 0)  			STp->immediate = value; +		if ((options & MT_ST_NOWAIT_EOF) != 0) +			STp->immediate_filemark = value;  		if ((options & MT_ST_SYSV) != 0)  			STm->sysv = value;  		if ((options & MT_ST_SILI) != 0) @@ -2714,7 +2725,8 @@ static int st_int_ioctl(struct scsi_tape *STp, unsigned int cmd_in, unsigned lon  		cmd[0] = WRITE_FILEMARKS;  		if (cmd_in == MTWSM)  			cmd[1] = 2; -		if (cmd_in == MTWEOFI) +		if (cmd_in == MTWEOFI || +		    (cmd_in == MTWEOF && STp->immediate_filemark))  			cmd[1] |= 1;  		cmd[2] = (arg >> 16);  		cmd[3] = (arg >> 8); @@ -4093,6 +4105,7 @@ static int st_probe(struct device *dev)  	tpnt->scsi2_logical = ST_SCSI2LOGICAL;  	tpnt->sili = ST_SILI;  	tpnt->immediate = ST_NOWAIT; +	tpnt->immediate_filemark = 0;  	tpnt->default_drvbuffer = 0xff;		/* No forced buffering */  	tpnt->partition = 0;  	tpnt->new_partition = 0; @@ -4478,6 +4491,7 @@ st_options_show(struct device *dev, struct device_attribute *attr, char *buf)  	options |= STp->scsi2_logical ? MT_ST_SCSI2LOGICAL : 0;  	options |= STm->sysv ? MT_ST_SYSV : 0;  	options |= STp->immediate ? MT_ST_NOWAIT : 0; +	options |= STp->immediate_filemark ? MT_ST_NOWAIT_EOF : 0;  	options |= STp->sili ? MT_ST_SILI : 0;  	l = snprintf(buf, PAGE_SIZE, "0x%08x\n", options);  |