diff options
Diffstat (limited to 'drivers/scsi/sg.c')
| -rw-r--r-- | drivers/scsi/sg.c | 41 | 
1 files changed, 37 insertions, 4 deletions
diff --git a/drivers/scsi/sg.c b/drivers/scsi/sg.c index 141099ab9092..6b43e97bd417 100644 --- a/drivers/scsi/sg.c +++ b/drivers/scsi/sg.c @@ -77,7 +77,7 @@ static int sg_proc_init(void);  #define SG_DEFAULT_TIMEOUT mult_frac(SG_DEFAULT_TIMEOUT_USER, HZ, USER_HZ) -int sg_big_buff = SG_DEF_RESERVED_SIZE; +static int sg_big_buff = SG_DEF_RESERVED_SIZE;  /* N.B. This variable is readable and writeable via     /proc/scsi/sg/def_reserved_size . Each time sg_open() is called a buffer     of this size (or less if there is not enough memory) will be reserved @@ -833,7 +833,7 @@ sg_common_write(Sg_fd * sfp, Sg_request * srp,  	srp->rq->timeout = timeout;  	kref_get(&sfp->f_ref); /* sg_rq_end_io() does kref_put(). */ -	blk_execute_rq_nowait(NULL, srp->rq, at_head, sg_rq_end_io); +	blk_execute_rq_nowait(srp->rq, at_head, sg_rq_end_io);  	return 0;  } @@ -1109,7 +1109,7 @@ sg_ioctl_common(struct file *filp, Sg_device *sdp, Sg_fd *sfp,  	case SCSI_IOCTL_SEND_COMMAND:  		if (atomic_read(&sdp->detaching))  			return -ENODEV; -		return scsi_ioctl(sdp->device, NULL, filp->f_mode, cmd_in, p); +		return scsi_ioctl(sdp->device, filp->f_mode, cmd_in, p);  	case SG_SET_DEBUG:  		result = get_user(val, ip);  		if (result) @@ -1165,7 +1165,7 @@ sg_ioctl(struct file *filp, unsigned int cmd_in, unsigned long arg)  	ret = sg_ioctl_common(filp, sdp, sfp, cmd_in, p);  	if (ret != -ENOIOCTLCMD)  		return ret; -	return scsi_ioctl(sdp->device, NULL, filp->f_mode, cmd_in, p); +	return scsi_ioctl(sdp->device, filp->f_mode, cmd_in, p);  }  static __poll_t @@ -1634,6 +1634,37 @@ MODULE_PARM_DESC(scatter_elem_sz, "scatter gather element "  MODULE_PARM_DESC(def_reserved_size, "size of buffer reserved for each fd");  MODULE_PARM_DESC(allow_dio, "allow direct I/O (default: 0 (disallow))"); +#ifdef CONFIG_SYSCTL +#include <linux/sysctl.h> + +static struct ctl_table sg_sysctls[] = { +	{ +		.procname	= "sg-big-buff", +		.data		= &sg_big_buff, +		.maxlen		= sizeof(int), +		.mode		= 0444, +		.proc_handler	= proc_dointvec, +	}, +	{} +}; + +static struct ctl_table_header *hdr; +static void register_sg_sysctls(void) +{ +	if (!hdr) +		hdr = register_sysctl("kernel", sg_sysctls); +} + +static void unregister_sg_sysctls(void) +{ +	if (hdr) +		unregister_sysctl_table(hdr); +} +#else +#define register_sg_sysctls() do { } while (0) +#define unregister_sg_sysctls() do { } while (0) +#endif /* CONFIG_SYSCTL */ +  static int __init  init_sg(void)  { @@ -1666,6 +1697,7 @@ init_sg(void)  		return 0;  	}  	class_destroy(sg_sysfs_class); +	register_sg_sysctls();  err_out:  	unregister_chrdev_region(MKDEV(SCSI_GENERIC_MAJOR, 0), SG_MAX_DEVS);  	return rc; @@ -1674,6 +1706,7 @@ err_out:  static void __exit  exit_sg(void)  { +	unregister_sg_sysctls();  #ifdef CONFIG_SCSI_PROC_FS  	remove_proc_subtree("scsi/sg", NULL);  #endif				/* CONFIG_SCSI_PROC_FS */  |