Skip to contentSkip to conversation

scsi proc_info called unconditionally

DISCUSSION Olaf Hering 3 participants 7 messages Aug 16, 2003 – Aug 17, 2003 SCSI

lore
Share & tools
lore
#0 lore raw

Why is ->proc_info() called when the function pointer is NULL?

(none):/# mount proc
(none):/# cat /proc/scsi/
53c94        device_info  scsi
(none):/# cat /proc/scsi/53c94/0
proc_scsi_read: 00000000 called
Oops: kernel access of bad area, sig: 11 [#1]
NIP: 00000000 LR: C00EC6C8 SP: C03BBE90 REGS: c03bbde0 TRAP: 0401    Not tainted
MSR: 40009030 EE: 1 PR: 0 FP: 0 ME: 1 IR/DR: 11
TASK = c027b7e0[16] 'cat' Last syscall: 3
GPR00: C00EC6A0 C03BBE90 C027B7E0 C4705400 C43B5000 C03BBEC8 00000000 00000C00
GPR08: 00000000 00000000 C01C6E8F C01B0000 0000000D
Call trace:
 [c007a254] proc_file_read+0xb8/0x2cc
 [c004d97c] vfs_read+0xdc/0x128
 [c004dbe8] sys_read+0x40/0x74
 [c000780c] ret_from_syscall+0x0/0x4c
Segmentation fault
Signature · 3 lines
USB is for mice, FireWire is for men!

sUse lINUX ag, nÜRNBERG
#1 lore raw
Quoted 2 lines · Olaf Hering

Why is ->proc_info() called when the function pointer is NULL?

Looks like the check for it's presence got lost in

[PATCH] Correct removal of procfs host enteries [1/2]

Here's a trivial patch to get it back:

drivers/scsi/scsi_proc.c +6 -0
@@ -81,6 +81,9 @@
 
 void scsi_proc_hostdir_add(struct scsi_host_template *sht)
 {
+	if (!sht->proc_info)
+		return;
+
 	down(&global_host_template_sem);
 	if (!sht->present++) {
 		sht->proc_dir = proc_mkdir(sht->proc_name, proc_scsi);
@@ -96,6 +99,9 @@
 
 void scsi_proc_hostdir_rm(struct scsi_host_template *sht)
 {
+	if (!sht->proc_info)
+		return;
+
 	down(&global_host_template_sem);
 	if (!--sht->present && sht->proc_dir) {
 		remove_proc_entry(sht->proc_name, proc_scsi);
#2 lore raw
In reply to Olaf Hering
Quoted 3 lines · Olaf Hering

Why is ->proc_info() called when the function pointer is NULL?

(none):/# mount proc

Because proc_info is mandatory ?

#3 lore raw
Quoted 6 lines · Alan Cox
Quoted 3 lines · Olaf Hering

Why is ->proc_info() called when the function pointer is NULL?

(none):/# mount proc

Because proc_info is mandatory ?

Paul, do you want to fill in some content in that proc file?

drivers/scsi/mac53c94.c +7 -0
@@ -614,8 +614,15 @@ data_goes_out(Scsi_Cmnd *cmd)
 	}
 }
 
+int mac53c94_proc_info(struct Scsi_Host *host, char *buffer, char **start, off_t offset,
+		  int length, int inout)
+{
+	return 0;
+}
+
 static Scsi_Host_Template driver_template = {
 	.proc_name	= "53c94",
+	.proc_info	= mac53c94_proc_info,
 	.name		= "53C94",
 	.detect		= mac53c94_detect,
 	.release	= mac53c94_release,
Signature · 3 lines
USB is for mice, FireWire is for men!

sUse lINUX ag, nÜRNBERG
#4 lore raw
Quoted 1 line · Olaf Hering

Paul, do you want to fill in some content in that proc file?

No! proc_info is deprecated in 2.6 and you should not add a new implementation. If you want to expose information to userland use sysfs.

#5 lore raw
Quoted 3 lines · Christoph Hellwig

No! proc_info is deprecated in 2.6 and you should not add a new implementation. If you want to expose information to userland use sysfs.

It probably should give the driver name and version. Christoph is right in the longer term but in the real world people still expect /proc/scsi/* to contain at least that info.

Possibly for 2.7.x /proc/scsi/* should become an fs or entirely sysfs

#6 lore raw
Quoted 3 lines · Alan Cox

It probably should give the driver name and version. Christoph is right in the longer term but in the real world people still expect /proc/scsi/* to contain at least that info.

/proc/scsi/* is not standardized so even if you add a name no userspace tool can sanely parse it without knowing all drivers. sysfs OTOH can do this sanely.

So, no it does not make sense to add anything here for a 2.6 driver.

Quoted 1 line

Possibly for 2.7.x /proc/scsi/* should become an fs or entirely sysfs

/proc/scsi/ will be optional and marked deprecated with with one of my next patches and go away in 2.9.