diff options
Diffstat (limited to 'drivers/scsi/osst.c')
| -rw-r--r-- | drivers/scsi/osst.c | 23 | 
1 files changed, 15 insertions, 8 deletions
| diff --git a/drivers/scsi/osst.c b/drivers/scsi/osst.c index b219118f8bd..d64b7178fa0 100644 --- a/drivers/scsi/osst.c +++ b/drivers/scsi/osst.c @@ -3587,7 +3587,7 @@ if (SRpnt) printk(KERN_ERR "%s:A: Not supposed to have SRpnt at line %d\n", name  		if (i == (-ENOSPC)) {  			transfer = STp->buffer->writing;	/* FIXME -- check this logic */  			if (transfer <= do_count) { -				filp->f_pos += do_count - transfer; +				*ppos += do_count - transfer;  				count -= do_count - transfer;  				if (STps->drv_block >= 0) {  					STps->drv_block += (do_count - transfer) / STp->block_size; @@ -3625,7 +3625,7 @@ if (SRpnt) printk(KERN_ERR "%s:A: Not supposed to have SRpnt at line %d\n", name  			goto out;  		} -		filp->f_pos += do_count; +		*ppos += do_count;  		b_point += do_count;  		count -= do_count;  		if (STps->drv_block >= 0) { @@ -3647,7 +3647,7 @@ if (SRpnt) printk(KERN_ERR "%s:A: Not supposed to have SRpnt at line %d\n", name  		if (STps->drv_block >= 0) {  			STps->drv_block += blks;  		} -		filp->f_pos += count; +		*ppos += count;  		count = 0;  	} @@ -3823,7 +3823,7 @@ static ssize_t osst_read(struct file * filp, char __user * buf, size_t count, lo  			}  			STp->logical_blk_num += transfer / STp->block_size;  			STps->drv_block      += transfer / STp->block_size; -			filp->f_pos          += transfer; +			*ppos          += transfer;  			buf                  += transfer;  			total                += transfer;  		} @@ -4932,7 +4932,7 @@ static int os_scsi_tape_close(struct inode * inode, struct file * filp)  /* The ioctl command */ -static int osst_ioctl(struct inode * inode,struct file * file, +static long osst_ioctl(struct file * file,  	 unsigned int cmd_in, unsigned long arg)  {  	int		      i, cmd_nr, cmd_type, blk, retval = 0; @@ -4943,8 +4943,11 @@ static int osst_ioctl(struct inode * inode,struct file * file,  	char		    * name  = tape_name(STp);  	void	    __user  * p     = (void __user *)arg; -	if (mutex_lock_interruptible(&STp->lock)) +	lock_kernel(); +	if (mutex_lock_interruptible(&STp->lock)) { +		unlock_kernel();  		return -ERESTARTSYS; +	}  #if DEBUG  	if (debugging && !STp->in_use) { @@ -5256,12 +5259,15 @@ static int osst_ioctl(struct inode * inode,struct file * file,  	mutex_unlock(&STp->lock); -	return scsi_ioctl(STp->device, cmd_in, p); +	retval = scsi_ioctl(STp->device, cmd_in, p); +	unlock_kernel(); +	return retval;  out:  	if (SRpnt) osst_release_request(SRpnt);  	mutex_unlock(&STp->lock); +	unlock_kernel();  	return retval;  } @@ -5613,13 +5619,14 @@ static const struct file_operations osst_fops = {  	.owner =        THIS_MODULE,  	.read =         osst_read,  	.write =        osst_write, -	.ioctl =        osst_ioctl, +	.unlocked_ioctl = osst_ioctl,  #ifdef CONFIG_COMPAT  	.compat_ioctl = osst_compat_ioctl,  #endif  	.open =         os_scsi_tape_open,  	.flush =        os_scsi_tape_flush,  	.release =      os_scsi_tape_close, +	.llseek =	noop_llseek,  };  static int osst_supports(struct scsi_device * SDp) | 
