Linux SCSI subsystem development
 help / color / mirror / Atom feed
* [PATCH 0/3] scsi: sg: minor bugfix and cleanup
@ 2026-01-26 13:27 Yang Erkun
  2026-01-26 13:27 ` [PATCH 1/3] scsi: sg: Fix sysctl sg-big-buff register during sg_init Yang Erkun
                   ` (2 more replies)
  0 siblings, 3 replies; 8+ messages in thread
From: Yang Erkun @ 2026-01-26 13:27 UTC (permalink / raw)
  To: dgilbert, James.Bottomley, martin.petersen, linux-scsi
  Cc: yangerkun, yangerkun

Yang Erkun (3):
  scsi: sg: Fix sysctl sg-big-buff register during sg_init
  scsi: sg: Resolve soft lockup issue when opening /dev/sgX
  scsi: sg: Remove deprecated sg-big-buff

 drivers/scsi/sg.c | 88 ++++++++++++++++++++---------------------------
 1 file changed, 38 insertions(+), 50 deletions(-)

-- 
2.39.2


^ permalink raw reply	[flat|nested] 8+ messages in thread

* [PATCH 1/3] scsi: sg: Fix sysctl sg-big-buff register during sg_init
  2026-01-26 13:27 [PATCH 0/3] scsi: sg: minor bugfix and cleanup Yang Erkun
@ 2026-01-26 13:27 ` Yang Erkun
  2026-01-26 16:45   ` Bart Van Assche
  2026-01-26 13:27 ` [PATCH 2/3] scsi: sg: Resolve soft lockup issue when opening /dev/sgX Yang Erkun
  2026-01-26 13:27 ` [PATCH 3/3] scsi: sg: Remove deprecated sg-big-buff Yang Erkun
  2 siblings, 1 reply; 8+ messages in thread
From: Yang Erkun @ 2026-01-26 13:27 UTC (permalink / raw)
  To: dgilbert, James.Bottomley, martin.petersen, linux-scsi
  Cc: yangerkun, yangerkun

The sysctl interface sg-big-buff will no longer be available after this
commit. I believe this is a mistake, so fix it by invoking
register_sg_sysctls when everything is proceeding correctly.

Fixes: 26d1c80fd61e5 ("scsi/sg: move sg-big-buff sysctl to scsi/sg.c")
Signed-off-by: Yang Erkun <yangerkun@huawei.com>
---
 drivers/scsi/sg.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/scsi/sg.c b/drivers/scsi/sg.c
index 57fba34832ad..c93cc9323f56 100644
--- a/drivers/scsi/sg.c
+++ b/drivers/scsi/sg.c
@@ -1689,13 +1689,13 @@ init_sg(void)
 	sg_sysfs_valid = 1;
 	rc = scsi_register_interface(&sg_interface);
 	if (0 == rc) {
+		register_sg_sysctls();
 #ifdef CONFIG_SCSI_PROC_FS
 		sg_proc_init();
 #endif				/* CONFIG_SCSI_PROC_FS */
 		return 0;
 	}
 	class_unregister(&sg_sysfs_class);
-	register_sg_sysctls();
 err_out:
 	unregister_chrdev_region(MKDEV(SCSI_GENERIC_MAJOR, 0), SG_MAX_DEVS);
 	return rc;
-- 
2.39.2


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH 2/3] scsi: sg: Resolve soft lockup issue when opening /dev/sgX
  2026-01-26 13:27 [PATCH 0/3] scsi: sg: minor bugfix and cleanup Yang Erkun
  2026-01-26 13:27 ` [PATCH 1/3] scsi: sg: Fix sysctl sg-big-buff register during sg_init Yang Erkun
@ 2026-01-26 13:27 ` Yang Erkun
  2026-01-26 17:04   ` Bart Van Assche
  2026-01-26 13:27 ` [PATCH 3/3] scsi: sg: Remove deprecated sg-big-buff Yang Erkun
  2 siblings, 1 reply; 8+ messages in thread
From: Yang Erkun @ 2026-01-26 13:27 UTC (permalink / raw)
  To: dgilbert, James.Bottomley, martin.petersen, linux-scsi
  Cc: yangerkun, yangerkun

A soft lockup occurs after executing the following commands:

echo -1 > /sys/module/sg/parameters/def_reserved_size
exec 4<> /dev/sg0

watchdog: BUG: soft lockup - CPU#5 stuck for 26 seconds! [bash:537]
Modules loaded:
CPU: 5 UID: 0 PID: 537 Command: bash, kernel version 6.19.0-rc3+ #134,
PREEMPT disabled
Hardware: QEMU Standard PC (i440FX + PIIX, 1996), BIOS version
1.16.1-2.fc37 dated 04/01/2014
...
Call Trace:

  sg_build_reserve+0x5c/0xa0
  sg_add_sfp+0x168/0x270
  sg_open+0x16e/0x340
  chrdev_open+0xbe/0x230
  do_dentry_open+0x175/0x480
  vfs_open+0x34/0xf0
  do_open+0x265/0x3d0
  path_openat+0x110/0x290
  do_filp_open+0xc3/0x170
  do_sys_openat2+0x71/0xe0
  __x64_sys_openat+0x6d/0xa0
  do_syscall_64+0x62/0x310
  entry_SYSCALL_64_after_hwframe+0x76/0x7e

The solution is to use module_param_cb to validate and reject invalid
values for def_reserved_size.

Fixes: 6460e75a104d ("[SCSI] sg: fixes for large page_size")
Signed-off-by: Yang Erkun <yangerkun@huawei.com>
---
 drivers/scsi/sg.c | 29 +++++++++++++++++++++++++++--
 1 file changed, 27 insertions(+), 2 deletions(-)

diff --git a/drivers/scsi/sg.c b/drivers/scsi/sg.c
index c93cc9323f56..9e42618e20d5 100644
--- a/drivers/scsi/sg.c
+++ b/drivers/scsi/sg.c
@@ -1621,10 +1621,35 @@ sg_remove_device(struct device *cl_dev)
 }
 
 module_param_named(scatter_elem_sz, scatter_elem_sz, int, S_IRUGO | S_IWUSR);
-module_param_named(def_reserved_size, def_reserved_size, int,
-		   S_IRUGO | S_IWUSR);
 module_param_named(allow_dio, sg_allow_dio, int, S_IRUGO | S_IWUSR);
 
+static int def_reserved_size_set(const char *val, const struct kernel_param *kp)
+{
+	int size, ret;
+
+	if (!val)
+		return -EINVAL;
+
+	ret = kstrtoint(val, 0, &size);
+	if (ret)
+		return ret;
+
+	/* limit "big buff" to 1 MB */
+	if (size < 0 || size > 1048576)
+		return -ERANGE;
+
+	def_reserved_size = size;
+	return 0;
+}
+
+static const struct kernel_param_ops def_reserved_size_ops = {
+	.set	= def_reserved_size_set,
+	.get	= param_get_int,
+};
+
+module_param_cb(def_reserved_size, &def_reserved_size_ops, &def_reserved_size,
+		   S_IRUGO | S_IWUSR);
+
 MODULE_AUTHOR("Douglas Gilbert");
 MODULE_DESCRIPTION("SCSI generic (sg) driver");
 MODULE_LICENSE("GPL");
-- 
2.39.2


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH 3/3] scsi: sg: Remove deprecated sg-big-buff
  2026-01-26 13:27 [PATCH 0/3] scsi: sg: minor bugfix and cleanup Yang Erkun
  2026-01-26 13:27 ` [PATCH 1/3] scsi: sg: Fix sysctl sg-big-buff register during sg_init Yang Erkun
  2026-01-26 13:27 ` [PATCH 2/3] scsi: sg: Resolve soft lockup issue when opening /dev/sgX Yang Erkun
@ 2026-01-26 13:27 ` Yang Erkun
  2026-01-26 17:06   ` Bart Van Assche
  2 siblings, 1 reply; 8+ messages in thread
From: Yang Erkun @ 2026-01-26 13:27 UTC (permalink / raw)
  To: dgilbert, James.Bottomley, martin.petersen, linux-scsi
  Cc: yangerkun, yangerkun

These deprecated sysctl has been gone since commit 26d1c80fd61e5
("scsi/sg: move sg-big-buff sysctl to scsi/sg.c") and nobody has found
this. I believe it's time to remove them, which will allow us to clean
up a significant amount of code.

Signed-off-by: Yang Erkun <yangerkun@huawei.com>
---
 drivers/scsi/sg.c | 59 +++++++++--------------------------------------
 1 file changed, 11 insertions(+), 48 deletions(-)

diff --git a/drivers/scsi/sg.c b/drivers/scsi/sg.c
index 9e42618e20d5..b3bc95f6c2f7 100644
--- a/drivers/scsi/sg.c
+++ b/drivers/scsi/sg.c
@@ -81,14 +81,14 @@ static int sg_proc_init(void);
 
 #define SG_DEFAULT_TIMEOUT mult_frac(SG_DEFAULT_TIMEOUT_USER, HZ, USER_HZ)
 
-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
-   for use by this file descriptor. [Deprecated usage: this variable is also
-   readable via /proc/sys/kernel/sg-big-buff if the sg driver is built into
-   the kernel (i.e. it is not a module).] */
-static int def_reserved_size = -1;	/* picks up init parameter */
+ * /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
+ * for use by this file descriptor.
+ */
+
+/* picks up init parameter */
+static int def_reserved_size = SG_DEF_RESERVED_SIZE;
 static int sg_allow_dio = SG_ALLOW_DIO_DEF;
 
 static int scatter_elem_sz = SG_SCATTER_SZ;
@@ -1661,35 +1661,6 @@ 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 const 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)
-{
-	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)
 {
@@ -1699,10 +1670,6 @@ init_sg(void)
 		scatter_elem_sz = PAGE_SIZE;
 		scatter_elem_sz_prev = scatter_elem_sz;
 	}
-	if (def_reserved_size >= 0)
-		sg_big_buff = def_reserved_size;
-	else
-		def_reserved_size = sg_big_buff;
 
 	rc = register_chrdev_region(MKDEV(SCSI_GENERIC_MAJOR, 0), 
 				    SG_MAX_DEVS, "sg");
@@ -1714,7 +1681,6 @@ init_sg(void)
 	sg_sysfs_valid = 1;
 	rc = scsi_register_interface(&sg_interface);
 	if (0 == rc) {
-		register_sg_sysctls();
 #ifdef CONFIG_SCSI_PROC_FS
 		sg_proc_init();
 #endif				/* CONFIG_SCSI_PROC_FS */
@@ -1729,7 +1695,6 @@ init_sg(void)
 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 */
@@ -2205,10 +2170,8 @@ sg_add_sfp(Sg_device * sdp)
 	write_unlock_irqrestore(&sdp->sfd_lock, iflags);
 	SCSI_LOG_TIMEOUT(3, sg_printk(KERN_INFO, sdp,
 				      "sg_add_sfp: sfp=0x%p\n", sfp));
-	if (unlikely(sg_big_buff != def_reserved_size))
-		sg_big_buff = def_reserved_size;
 
-	bufflen = min_t(int, sg_big_buff,
+	bufflen = min_t(int, def_reserved_size,
 			max_sectors_bytes(sdp->device->request_queue));
 	sg_build_reserve(sfp, bufflen);
 	SCSI_LOG_TIMEOUT(3, sg_printk(KERN_INFO, sdp,
@@ -2436,7 +2399,7 @@ sg_proc_write_adio(struct file *filp, const char __user *buffer,
 
 static int sg_proc_single_open_dressz(struct inode *inode, struct file *file)
 {
-	return single_open(file, sg_proc_seq_show_int, &sg_big_buff);
+	return single_open(file, sg_proc_seq_show_int, &def_reserved_size);
 }
 
 static ssize_t 
@@ -2453,7 +2416,7 @@ sg_proc_write_dressz(struct file *filp, const char __user *buffer,
 	if (err)
 		return err;
 	if (k <= 1048576) {	/* limit "big buff" to 1 MB */
-		sg_big_buff = k;
+		def_reserved_size = k;
 		return count;
 	}
 	return -ERANGE;
@@ -2626,7 +2589,7 @@ static int sg_proc_seq_show_debug(struct seq_file *s, void *v)
 
 	if (it && (0 == it->index))
 		seq_printf(s, "max_active_device=%d  def_reserved_size=%d\n",
-			   (int)it->max, sg_big_buff);
+			   (int)it->max, def_reserved_size);
 
 	read_lock_irqsave(&sg_index_lock, iflags);
 	sdp = it ? sg_lookup_dev(it->index) : NULL;
-- 
2.39.2


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* Re: [PATCH 1/3] scsi: sg: Fix sysctl sg-big-buff register during sg_init
  2026-01-26 13:27 ` [PATCH 1/3] scsi: sg: Fix sysctl sg-big-buff register during sg_init Yang Erkun
@ 2026-01-26 16:45   ` Bart Van Assche
  0 siblings, 0 replies; 8+ messages in thread
From: Bart Van Assche @ 2026-01-26 16:45 UTC (permalink / raw)
  To: Yang Erkun, dgilbert, James.Bottomley, martin.petersen,
	linux-scsi
  Cc: yangerkun

On 1/26/26 5:27 AM, Yang Erkun wrote:
> The sysctl interface sg-big-buff will no longer be available after this
> commit.

This patch restores the sg-big-buff ioctl functionality, isn't it? The
above sentence says something completely different. Please fix.

Thanks,

Bart.

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH 2/3] scsi: sg: Resolve soft lockup issue when opening /dev/sgX
  2026-01-26 13:27 ` [PATCH 2/3] scsi: sg: Resolve soft lockup issue when opening /dev/sgX Yang Erkun
@ 2026-01-26 17:04   ` Bart Van Assche
  2026-01-27  1:28     ` yangerkun
  0 siblings, 1 reply; 8+ messages in thread
From: Bart Van Assche @ 2026-01-26 17:04 UTC (permalink / raw)
  To: Yang Erkun, dgilbert, James.Bottomley, martin.petersen,
	linux-scsi
  Cc: yangerkun

On 1/26/26 5:27 AM, Yang Erkun wrote:
> +	/* limit "big buff" to 1 MB */
> +	if (size < 0 || size > 1048576)
> +		return -ERANGE;

Why 1 MB? Please explain this in the patch description.

Thanks,

Bart.

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH 3/3] scsi: sg: Remove deprecated sg-big-buff
  2026-01-26 13:27 ` [PATCH 3/3] scsi: sg: Remove deprecated sg-big-buff Yang Erkun
@ 2026-01-26 17:06   ` Bart Van Assche
  0 siblings, 0 replies; 8+ messages in thread
From: Bart Van Assche @ 2026-01-26 17:06 UTC (permalink / raw)
  To: Yang Erkun, dgilbert, James.Bottomley, martin.petersen,
	linux-scsi
  Cc: yangerkun

On 1/26/26 5:27 AM, Yang Erkun wrote:
> These deprecated sysctl has been gone since commit 26d1c80fd61e5

gone -> broken

> ("scsi/sg: move sg-big-buff sysctl to scsi/sg.c") and nobody has found
> this. I believe it's time to remove them, which will allow us to clean

them -> it

> up a significant amount of code.

Thanks,

Bart.

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH 2/3] scsi: sg: Resolve soft lockup issue when opening /dev/sgX
  2026-01-26 17:04   ` Bart Van Assche
@ 2026-01-27  1:28     ` yangerkun
  0 siblings, 0 replies; 8+ messages in thread
From: yangerkun @ 2026-01-27  1:28 UTC (permalink / raw)
  To: Bart Van Assche, dgilbert, James.Bottomley, martin.petersen,
	linux-scsi
  Cc: yangerkun



在 2026/1/27 1:04, Bart Van Assche 写道:
> On 1/26/26 5:27 AM, Yang Erkun wrote:
>> +    /* limit "big buff" to 1 MB */
>> +    if (size < 0 || size > 1048576)
>> +        return -ERANGE;
> 
> Why 1 MB? Please explain this in the patch description.

Hi,

Thank you very much for your review! I obtained this limit from the
function sg_proc_write_dressz, which states to "limit 'big buff' to 1
MB." Additionally, https://tldp.org/HOWTO/SCSI-Generic-HOWTO/proc.html
also mentions that "values between 0 and 1,048,576 (which is 2 ** 20)
are accepted."

Thanks again for your feedback! All your suggestions will be update in
the next version.

Thanks,
Erkun.

> 
> Thanks,
> 
> Bart.

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2026-01-27  1:28 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-01-26 13:27 [PATCH 0/3] scsi: sg: minor bugfix and cleanup Yang Erkun
2026-01-26 13:27 ` [PATCH 1/3] scsi: sg: Fix sysctl sg-big-buff register during sg_init Yang Erkun
2026-01-26 16:45   ` Bart Van Assche
2026-01-26 13:27 ` [PATCH 2/3] scsi: sg: Resolve soft lockup issue when opening /dev/sgX Yang Erkun
2026-01-26 17:04   ` Bart Van Assche
2026-01-27  1:28     ` yangerkun
2026-01-26 13:27 ` [PATCH 3/3] scsi: sg: Remove deprecated sg-big-buff Yang Erkun
2026-01-26 17:06   ` Bart Van Assche

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox