diff options
Diffstat (limited to 'drivers/scsi/st.c')
| -rw-r--r-- | drivers/scsi/st.c | 47 | 
1 files changed, 30 insertions, 17 deletions
diff --git a/drivers/scsi/st.c b/drivers/scsi/st.c index 4daa372ed381..128d3b55bdd9 100644 --- a/drivers/scsi/st.c +++ b/drivers/scsi/st.c @@ -56,7 +56,8 @@ static const char *verstr = "20101219";  /* The driver prints some debugging information on the console if DEBUG     is defined and non-zero. */ -#define DEBUG 0 +#define DEBUG 1 +#define NO_DEBUG 0  #define ST_DEB_MSG  KERN_NOTICE  #if DEBUG @@ -80,6 +81,7 @@ static int max_sg_segs;  static int try_direct_io = TRY_DIRECT_IO;  static int try_rdio = 1;  static int try_wdio = 1; +static int debug_flag;  static struct class st_sysfs_class;  static const struct attribute_group *st_dev_groups[]; @@ -100,6 +102,9 @@ module_param_named(max_sg_segs, max_sg_segs, int, 0);  MODULE_PARM_DESC(max_sg_segs, "Maximum number of scatter/gather segments to use (256)");  module_param_named(try_direct_io, try_direct_io, int, 0);  MODULE_PARM_DESC(try_direct_io, "Try direct I/O between user buffer and tape drive (1)"); +module_param_named(debug_flag, debug_flag, int, 0); +MODULE_PARM_DESC(debug_flag, "Enable DEBUG, same as setting debugging=1"); +  /* Extra parameters for testing */  module_param_named(try_rdio, try_rdio, int, 0); @@ -124,6 +129,9 @@ static struct st_dev_parm {  	},  	{  		"try_direct_io", &try_direct_io +	}, +	{ +		"debug_flag", &debug_flag  	}  };  #endif @@ -194,9 +202,9 @@ static int do_create_sysfs_files(void);  static void do_remove_sysfs_files(void);  static struct scsi_driver st_template = { -	.owner			= THIS_MODULE,  	.gendrv = {  		.name		= "st", +		.owner		= THIS_MODULE,  		.probe		= st_probe,  		.remove		= st_remove,  	}, @@ -306,8 +314,7 @@ static inline char *tape_name(struct scsi_tape *tape)  }  #define st_printk(prefix, t, fmt, a...) \ -	sdev_printk(prefix, (t)->device, "%s: " fmt, \ -		    tape_name(t), ##a) +	sdev_prefix_printk(prefix, (t)->device, tape_name(t), fmt, ##a)  #ifdef DEBUG  #define DEBC_printk(t, fmt, a...) \  	if (debugging) { st_printk(ST_DEB_MSG, t, fmt, ##a ); } @@ -374,7 +381,8 @@ static int st_chk_result(struct scsi_tape *STp, struct st_request * SRpnt)  			    SRpnt->cmd[0], SRpnt->cmd[1], SRpnt->cmd[2],  			    SRpnt->cmd[3], SRpnt->cmd[4], SRpnt->cmd[5]);  		if (cmdstatp->have_sense) -			 __scsi_print_sense(name, SRpnt->sense, SCSI_SENSE_BUFFERSIZE); +			__scsi_print_sense(STp->device, name, +					   SRpnt->sense, SCSI_SENSE_BUFFERSIZE);  	} ) /* end DEB */  	if (!debugging) { /* Abnormal conditions for tape */  		if (!cmdstatp->have_sense) @@ -390,7 +398,8 @@ static int st_chk_result(struct scsi_tape *STp, struct st_request * SRpnt)  			 SRpnt->cmd[0] != MODE_SENSE &&  			 SRpnt->cmd[0] != TEST_UNIT_READY) { -			__scsi_print_sense(name, SRpnt->sense, SCSI_SENSE_BUFFERSIZE); +			__scsi_print_sense(STp->device, name, +					   SRpnt->sense, SCSI_SENSE_BUFFERSIZE);  		}  	} @@ -852,17 +861,16 @@ static int set_mode_densblk(struct scsi_tape * STp, struct st_modedef * STm)  /* Lock or unlock the drive door. Don't use when st_request allocated. */  static int do_door_lock(struct scsi_tape * STp, int do_lock)  { -	int retval, cmd; +	int retval; -	cmd = do_lock ? SCSI_IOCTL_DOORLOCK : SCSI_IOCTL_DOORUNLOCK;  	DEBC_printk(STp, "%socking drive door.\n", do_lock ? "L" : "Unl"); -	retval = scsi_ioctl(STp->device, cmd, NULL); -	if (!retval) { + +	retval = scsi_set_medium_removal(STp->device, +			do_lock ? SCSI_REMOVAL_PREVENT : SCSI_REMOVAL_ALLOW); +	if (!retval)  		STp->door_locked = do_lock ? ST_LOCKED_EXPLICIT : ST_UNLOCKED; -	} -	else { +	else  		STp->door_locked = ST_LOCK_FAILS; -	}  	return retval;  } @@ -3367,11 +3375,10 @@ static long st_ioctl(struct file *file, unsigned int cmd_in, unsigned long arg)  	 * may try and take the device offline, in which case all further  	 * access to the device is prohibited.  	 */ -	retval = scsi_nonblockable_ioctl(STp->device, cmd_in, p, -					file->f_flags & O_NDELAY); -	if (!scsi_block_when_processing_errors(STp->device) || retval != -ENODEV) +	retval = scsi_ioctl_block_when_processing_errors(STp->device, cmd_in, +			file->f_flags & O_NDELAY); +	if (retval)  		goto out; -	retval = 0;  	cmd_type = _IOC_TYPE(cmd_in);  	cmd_nr = _IOC_NR(cmd_in); @@ -4309,6 +4316,12 @@ static int __init init_st(void)  	printk(KERN_INFO "st: Version %s, fixed bufsize %d, s/g segs %d\n",  		verstr, st_fixed_buffer_size, st_max_sg_segs); +	debugging = (debug_flag > 0) ? debug_flag : NO_DEBUG; +	if (debugging) { +		printk(KERN_INFO "st: Debugging enabled debug_flag = %d\n", +			debugging); +	} +  	err = class_register(&st_sysfs_class);  	if (err) {  		pr_err("Unable register sysfs class for SCSI tapes\n");  |