linux-next.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* Missing driver-specific sysfs attributes of scsi_device [was: Re: [PATCH v4 00/46] Register SCSI sysfs attributes earlier]
       [not found] ` <163478764102.7011.9375895285870786953.b4-ty@oracle.com>
@ 2021-10-23 20:54   ` Steffen Maier
  2021-10-24  0:39     ` Steffen Maier
  0 siblings, 1 reply; 14+ messages in thread
From: Steffen Maier @ 2021-10-23 20:54 UTC (permalink / raw)
  To: Martin K. Petersen, Bart Van Assche
  Cc: linux-scsi, Linux-Next Mailing List, linux-s390, Benjamin Block

Hi Bart, hi Martin,

since Friday 2021-10-22 our CI reports errors with linux-next. It complains 
about missing zfcp-lun resources (although that's a follow-on error). Machines 
that have their root-fs on zfcp-attached SCSI disk(s) are stuck in boot. 
Looking at user visible effects, I see zfcp-specific sysfs attributes of 
scsi_device missing:

$ lszfcp -D
/usr/sbin/lszfcp: line 390: 
/sys/bus/ccw/drivers/zfcp/0.0.1780/host0/rport-0:0-0/target0:0:0/0:0:0:1089224725//hba_id: 
No such file or directory
/usr/sbin/lszfcp: line 391: 
/sys/bus/ccw/drivers/zfcp/0.0.1780/host0/rport-0:0-0/target0:0:0/0:0:0:1089224725//wwpn: 
No such file or directory
/usr/sbin/lszfcp: line 392: 
/sys/bus/ccw/drivers/zfcp/0.0.1780/host0/rport-0:0-0/target0:0:0/0:0:0:1089224725//fcp_lun: 
No such file or directory

That made me think of this patch series. It also happened so that Martin 
applied the series to 5.16/scsi-queue on 2021-10-21. Linux-next merged it on 
2021-10-22:

Merging scsi-mkp/for-next (83c3a7beaef7 scsi: lpfc: Update lpfc version to 
14.0.0.3)
$ git merge -m Merge branch 'for-next' of 
git://git.kernel.org/pub/scm/linux/kernel/git/mkp/scsi.git scsi-mkp/for-next
...
+ drivers/s390/scsi/zfcp_ext.h                    |   4 +-
+ drivers/s390/scsi/zfcp_fsf.c                    |   2 +-
+ drivers/s390/scsi/zfcp_scsi.c                   |   8 +-
+ drivers/s390/scsi/zfcp_sysfs.c                  |  52 ++--
[https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git/commit/?h=next-20211022&id=cf6c9d12750cf6f3f6aeffcd0bdb36b1ac993f44]

So this seems to match with the occurrence of problems for us.

I wonder if any of the other LLDDs see similar problems. I left those LLDD 
patches in the list below, that also were migrated from sdev_attrs to sdev_groups.

Guess it would be good to fix this before the v5.16 merge window opens 
(2021-11-08 after predicted v5.15 release? [http://phb-crystal-ball.org/]) so 
the error does not land in Linus' tree (which our CI also tests).

Not sure if I'll find time to dig deeper.

On 10/21/21 05:42, Martin K. Petersen wrote:
> On Tue, 12 Oct 2021 16:35:12 -0700, Bart Van Assche wrote:
> 
>> For certain user space software, e.g. udev, it is important that sysfs
>> attributes are registered before the KOBJ_ADD uevent is emitted. Hence
>> this patch series that removes the device_create_file() and
>> sysfs_create_groups() calls from the SCSI core. Please consider this
>> patch series for kernel v5.16.
>>
>> Thanks,
>>
>> [...]
> 
> Applied to 5.16/scsi-queue, thanks!
> 
> [01/46] scsi: core: Register sysfs attributes earlier
>          https://git.kernel.org/mkp/scsi/c/92c4b58b15c5
> [02/46] ata: Switch to attribute groups
>          https://git.kernel.org/mkp/scsi/c/c3f69c7f629f
> [03/46] firewire: sbp2: Switch to attribute groups
>          https://git.kernel.org/mkp/scsi/c/5e88e67b6f3b

> [06/46] scsi: zfcp: Switch to attribute groups
>          https://git.kernel.org/mkp/scsi/c/d8d7cf3f7d07

> [10/46] scsi: 53c700: Switch to attribute groups
>          https://git.kernel.org/mkp/scsi/c/90cb6538b5da
> [11/46] scsi: aacraid: Switch to attribute groups
>          https://git.kernel.org/mkp/scsi/c/bd16d71185c8

> [18/46] scsi: cxlflash: Switch to attribute groups
>          https://git.kernel.org/mkp/scsi/c/780c678912fb

> [21/46] scsi: hpsa: Switch to attribute groups
>          https://git.kernel.org/mkp/scsi/c/4cd16323b523

> [25/46] scsi: ipr: Switch to attribute groups
>          https://git.kernel.org/mkp/scsi/c/47d1e6ae0e1e

> [28/46] scsi: megaraid: Switch to attribute groups
>          https://git.kernel.org/mkp/scsi/c/09723bb252ca
> [29/46] scsi: mpt3sas: Switch to attribute groups
>          https://git.kernel.org/mkp/scsi/c/1bb3ca27d2ca

> [31/46] scsi: myrb: Switch to attribute groups
>          https://git.kernel.org/mkp/scsi/c/582c0360db90
> [32/46] scsi: myrs: Switch to attribute groups
>          https://git.kernel.org/mkp/scsi/c/087c3ace6337

> [42/46] scsi: smartpqi: Switch to attribute groups
>          https://git.kernel.org/mkp/scsi/c/64fc9015fbeb

> [45/46] scsi: usb: Switch to attribute groups
>          https://git.kernel.org/mkp/scsi/c/01e570febaaa
> [46/46] scsi: core: Remove two host template members that are no longer used
>          https://git.kernel.org/mkp/scsi/c/a47c6b713e89



-- 
Mit freundlichen Gruessen / Kind regards
Steffen Maier

Linux on IBM Z and LinuxONE

https://www.ibm.com/privacy/us/en/
IBM Deutschland Research & Development GmbH
Vorsitzender des Aufsichtsrats: Gregor Pillen
Geschaeftsfuehrung: Dirk Wittkopp
Sitz der Gesellschaft: Boeblingen
Registergericht: Amtsgericht Stuttgart, HRB 243294

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

* Re: Missing driver-specific sysfs attributes of scsi_device [was: Re: [PATCH v4 00/46] Register SCSI sysfs attributes earlier]
  2021-10-23 20:54   ` Missing driver-specific sysfs attributes of scsi_device [was: Re: [PATCH v4 00/46] Register SCSI sysfs attributes earlier] Steffen Maier
@ 2021-10-24  0:39     ` Steffen Maier
  2021-10-24  2:55       ` Bart Van Assche
  2021-10-24 11:18       ` [PATCH] scsi: core: Fix early registration of sysfs attributes for scsi_device Steffen Maier
  0 siblings, 2 replies; 14+ messages in thread
From: Steffen Maier @ 2021-10-24  0:39 UTC (permalink / raw)
  To: Martin K. Petersen, Bart Van Assche
  Cc: linux-scsi, Linux-Next Mailing List, linux-s390, Benjamin Block

On 10/23/21 22:54, Steffen Maier wrote:
> Hi Bart, hi Martin,
> 
> since Friday 2021-10-22 our CI reports errors with linux-next. It complains 
> about missing zfcp-lun resources (although that's a follow-on error). Machines 
> that have their root-fs on zfcp-attached SCSI disk(s) are stuck in boot. 
> Looking at user visible effects, I see zfcp-specific sysfs attributes of 
> scsi_device missing:
> 
> $ lszfcp -D
> /usr/sbin/lszfcp: line 390: 
> /sys/bus/ccw/drivers/zfcp/0.0.1780/host0/rport-0:0-0/target0:0:0/0:0:0:1089224725//hba_id: 
> No such file or directory

> That made me think of this patch series. It also happened so that Martin 
> applied the series to 5.16/scsi-queue on 2021-10-21. Linux-next merged it on 
> 2021-10-22:

> So this seems to match with the occurrence of problems for us.
> 
> I wonder if any of the other LLDDs see similar problems. I left those LLDD 
> patches in the list below, that also were migrated from sdev_attrs to sdev_groups.
> 
> Guess it would be good to fix this before the v5.16 merge window opens 
> (2021-11-08 after predicted v5.15 release? [http://phb-crystal-ball.org/]) so 
> the error does not land in Linus' tree (which our CI also tests).
> 
> Not sure if I'll find time to dig deeper.

v4.17 commit 86b87cde0b55 ("scsi: core: host template attribute groups")
introduced explicit sysfs_create_groups() in scsi_sysfs_add_sdev()
and sysfs_remove_groups() in __scsi_remove_device(), both for sdev_gendev,
based on a new field const struct attribute_group **sdev_groups
of struct scsi_host_template.

Commit 92c4b58b15c5 ("scsi: core: Register sysfs attributes earlier")
removed above explicit (de)registration of scsi_device attribute groups.
It also converted all scsi_device attributes and attribute_groups to
end up in a new field const struct attribute_group *gendev_attr_groups[6]
of struct scsi_device. However, that new field is not used anywhere.

I tried to fix it by assigning the pointer of that new field to the groups
field of sdev_gendev so the driver core gets our groups on devide_add().
Just like scsi_host_alloc() was changed by the same commit,
although scsi_host_alloc() already had assigned something to
shost_dev.groups so the necessary change was more obvious there.

However, that gave me:

> Oct 24 02:06:20 t3545002 kernel: scsi 1:0:2:1090207765: scsi scan: INQUIRY pass 1 length 36
> Oct 24 02:06:20 t3545002 kernel: scsi 1:0:2:1090207765: scsi scan: INQUIRY successful with code 0x0
> Oct 24 02:06:20 t3545002 kernel: scsi 1:0:2:1090207765: scsi scan: INQUIRY pass 2 length 164
> Oct 24 02:06:20 t3545002 kernel: scsi 1:0:2:1090207765: scsi scan: INQUIRY successful with code 0x0
> Oct 24 02:06:20 t3545002 kernel: scsi 1:0:2:1090207765: Direct-Access     IBM      2107900          2.19 PQ: 0 ANSI: 5
> Oct 24 02:06:20 t3545002 kernel: scsi 1:0:2:1090207765: alua: supports implicit TPGS
> Oct 24 02:06:20 t3545002 kernel: scsi 1:0:2:1090207765: alua: device naa.6005076309ffd43000000000000015fb port group 0 rel port 103
> Oct 24 02:06:20 t3545002 kernel: sysfs: cannot create duplicate filename '/devices/css0/0.0.0019/0.0.1880/host1/rport-1:0-2/target1:0:2/1:0:2:1090207765/device_blocked'
> Oct 24 02:06:20 t3545002 kernel: CPU: 1 PID: 1530 Comm: chzdev Not tainted 5.15.0-rc1sdevattr+ #29
> Oct 24 02:06:20 t3545002 kernel: Hardware name: IBM 8561 T01 703 (z/VM 7.2.0)
> Oct 24 02:06:20 t3545002 kernel: Call Trace:
> Oct 24 02:06:20 t3545002 kernel: [<00000000701c923e>] dump_stack_lvl+0x8e/0xc8 
> Oct 24 02:06:20 t3545002 kernel: [<000000006f991408>] sysfs_warn_dup+0x78/0x88 
> Oct 24 02:06:20 t3545002 kernel: [<000000006f990fb0>] sysfs_add_file_mode_ns+0x1c8/0x1e8 
> Oct 24 02:06:20 t3545002 kernel: [<000000006f991e3c>] create_files+0xb4/0x230 
> Oct 24 02:06:20 t3545002 kernel: [<000000006f992068>] internal_create_group+0xb0/0x1e8 
> Oct 24 02:06:20 t3545002 kernel: [<000000006f9928b0>] internal_create_groups.part.0+0x60/0xc8 
> Oct 24 02:06:20 t3545002 kernel: [<000000006fe807ca>] device_add_attrs+0x72/0x1d0 
> Oct 24 02:06:20 t3545002 kernel: [<000000006fe85168>] device_add+0x360/0x690 
> Oct 24 02:06:20 t3545002 kernel: [<000003ff801429b0>] scsi_sysfs_add_sdev+0x60/0x1a0 [scsi_mod] 
> Oct 24 02:06:20 t3545002 kernel: [<000003ff8013d870>] scsi_add_lun+0x3b0/0x5d0 [scsi_mod] 
> Oct 24 02:06:20 t3545002 kernel: [<000003ff8013e62c>] scsi_probe_and_add_lun+0x184/0x4a0 [scsi_mod] 
> Oct 24 02:06:20 t3545002 kernel: [<000003ff8013f4ec>] __scsi_scan_target+0x9c/0x240 [scsi_mod] 
> Oct 24 02:06:20 t3545002 kernel: [<000003ff8013f76a>] scsi_scan_target+0xda/0xf8 [scsi_mod] 
> Oct 24 02:06:20 t3545002 kernel: [<000003ff802d2a9c>] zfcp_unit_scsi_scan+0x6c/0x78 [zfcp] 
> Oct 24 02:06:20 t3545002 kernel: [<000003ff802d2e32>] zfcp_unit_add+0x1ea/0x220 [zfcp] 
> Oct 24 02:06:20 t3545002 kernel: [<000003ff802d0f3c>] zfcp_sysfs_unit_add_store+0x4c/0x70 [zfcp] 
> Oct 24 02:06:20 t3545002 kernel: [<000000006f98f946>] kernfs_fop_write_iter+0x13e/0x1e0 
> Oct 24 02:06:20 t3545002 kernel: [<000000006f899ff8>] new_sync_write+0x100/0x190 
> Oct 24 02:06:20 t3545002 kernel: [<000000006f89ced0>] vfs_write+0x230/0x2e0 
> Oct 24 02:06:20 t3545002 kernel: [<000000006f89d1ec>] ksys_write+0x6c/0xf8 
> Oct 24 02:06:20 t3545002 kernel: [<00000000701cc7ba>] __do_syscall+0x1c2/0x1f0 
> Oct 24 02:06:20 t3545002 kernel: [<00000000701df168>] system_call+0x78/0xa0 
> Oct 24 02:06:20 t3545002 kernel: 4 locks held by chzdev/1530:
> Oct 24 02:06:20 t3545002 kernel: #0: 0000000003711498 (sb_writers#3){.+.+}-{0:0}, at: ksys_write+0x6c/0xf8
> Oct 24 02:06:20 t3545002 kernel: #1: 000000000e77fa90 (&of->mutex){+.+.}-{3:3}, at: kernfs_fop_write_iter+0x102/0x1e0
> Oct 24 02:06:20 t3545002 kernel: #2: 0000000035754e10 (kn->active#83){++++}-{0:0}, at: kernfs_fop_write_iter+0x10e/0x1e0
> Oct 24 02:06:20 t3545002 kernel: #3: 0000000031bf90f0 (&shost->scan_mutex){+.+.}-{3:3}, at: scsi_scan_target+0x90/0xf8 [scsi_mod]
> Oct 24 02:06:20 t3545002 kernel: scsi 1:0:2:1090207765: failed to add device: -17

So I suspected that sdev_gendev is not a good idea and tried with its child 
sdev_dev instead. But now I'm back at square one with the attributes missing.

Where can I read about sdev_gendev vs. sdev_dev in a hopefully easy to 
understand way?

And how do we get to pass our scsi_device.gendev_attr_groups to the driver core 
to appear in sysfs?

> On 10/21/21 05:42, Martin K. Petersen wrote:
>> On Tue, 12 Oct 2021 16:35:12 -0700, Bart Van Assche wrote:
>>
>>> For certain user space software, e.g. udev, it is important that sysfs
>>> attributes are registered before the KOBJ_ADD uevent is emitted. Hence
>>> this patch series that removes the device_create_file() and
>>> sysfs_create_groups() calls from the SCSI core. Please consider this
>>> patch series for kernel v5.16.
>>>
>>> Thanks,
>>>
>>> [...]
>>
>> Applied to 5.16/scsi-queue, thanks!
>>
>> [01/46] scsi: core: Register sysfs attributes earlier
>>          https://git.kernel.org/mkp/scsi/c/92c4b58b15c5
>> [02/46] ata: Switch to attribute groups
>>          https://git.kernel.org/mkp/scsi/c/c3f69c7f629f
>> [03/46] firewire: sbp2: Switch to attribute groups
>>          https://git.kernel.org/mkp/scsi/c/5e88e67b6f3b
> 
>> [06/46] scsi: zfcp: Switch to attribute groups
>>          https://git.kernel.org/mkp/scsi/c/d8d7cf3f7d07
> 
>> [10/46] scsi: 53c700: Switch to attribute groups
>>          https://git.kernel.org/mkp/scsi/c/90cb6538b5da
>> [11/46] scsi: aacraid: Switch to attribute groups
>>          https://git.kernel.org/mkp/scsi/c/bd16d71185c8
> 
>> [18/46] scsi: cxlflash: Switch to attribute groups
>>          https://git.kernel.org/mkp/scsi/c/780c678912fb
> 
>> [21/46] scsi: hpsa: Switch to attribute groups
>>          https://git.kernel.org/mkp/scsi/c/4cd16323b523
> 
>> [25/46] scsi: ipr: Switch to attribute groups
>>          https://git.kernel.org/mkp/scsi/c/47d1e6ae0e1e
> 
>> [28/46] scsi: megaraid: Switch to attribute groups
>>          https://git.kernel.org/mkp/scsi/c/09723bb252ca
>> [29/46] scsi: mpt3sas: Switch to attribute groups
>>          https://git.kernel.org/mkp/scsi/c/1bb3ca27d2ca
> 
>> [31/46] scsi: myrb: Switch to attribute groups
>>          https://git.kernel.org/mkp/scsi/c/582c0360db90
>> [32/46] scsi: myrs: Switch to attribute groups
>>          https://git.kernel.org/mkp/scsi/c/087c3ace6337
> 
>> [42/46] scsi: smartpqi: Switch to attribute groups
>>          https://git.kernel.org/mkp/scsi/c/64fc9015fbeb
> 
>> [45/46] scsi: usb: Switch to attribute groups
>>          https://git.kernel.org/mkp/scsi/c/01e570febaaa
>> [46/46] scsi: core: Remove two host template members that are no longer used
>>          https://git.kernel.org/mkp/scsi/c/a47c6b713e89
-- 
Mit freundlichen Gruessen / Kind regards
Steffen Maier

Linux on IBM Z and LinuxONE

https://www.ibm.com/privacy/us/en/
IBM Deutschland Research & Development GmbH
Vorsitzender des Aufsichtsrats: Gregor Pillen
Geschaeftsfuehrung: Dirk Wittkopp
Sitz der Gesellschaft: Boeblingen
Registergericht: Amtsgericht Stuttgart, HRB 243294

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

* Re: Missing driver-specific sysfs attributes of scsi_device [was: Re: [PATCH v4 00/46] Register SCSI sysfs attributes earlier]
  2021-10-24  0:39     ` Steffen Maier
@ 2021-10-24  2:55       ` Bart Van Assche
  2021-10-24 11:18       ` [PATCH] scsi: core: Fix early registration of sysfs attributes for scsi_device Steffen Maier
  1 sibling, 0 replies; 14+ messages in thread
From: Bart Van Assche @ 2021-10-24  2:55 UTC (permalink / raw)
  To: Steffen Maier, Martin K. Petersen
  Cc: linux-scsi, Linux-Next Mailing List, linux-s390, Benjamin Block

On 10/23/21 17:39, Steffen Maier wrote:
> I tried to fix it by assigning the pointer of that new field to the groups
> field of sdev_gendev so the driver core gets our groups on devide_add().
> Just like scsi_host_alloc() was changed by the same commit,
> although scsi_host_alloc() already had assigned something to
> shost_dev.groups so the necessary change was more obvious there.

Thanks for having reported this early. We probably need something like this
(entirely untested):

--- a/drivers/scsi/scsi_sysfs.c
+++ b/drivers/scsi/scsi_sysfs.c
@@ -1583,7 +1583,7 @@ void scsi_sysfs_device_initialize(struct scsi_device *sdev)
  	scsi_enable_async_suspend(&sdev->sdev_gendev);
  	dev_set_name(&sdev->sdev_gendev, "%d:%d:%d:%llu",
  		     sdev->host->host_no, sdev->channel, sdev->id, sdev->lun);
-	sdev->gendev_attr_groups[j++] = &scsi_sdev_attr_group;
+	sdev->sdev_gendev.groups = sdev->gendev_attr_groups;
  	if (hostt->sdev_groups) {
  		for (i = 0; hostt->sdev_groups[i] &&
  			     j < ARRAY_SIZE(sdev->gendev_attr_groups);

Bart.

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

* [PATCH] scsi: core: Fix early registration of sysfs attributes for scsi_device
  2021-10-24  0:39     ` Steffen Maier
  2021-10-24  2:55       ` Bart Van Assche
@ 2021-10-24 11:18       ` Steffen Maier
  2021-10-24 21:25         ` Bart Van Assche
  1 sibling, 1 reply; 14+ messages in thread
From: Steffen Maier @ 2021-10-24 11:18 UTC (permalink / raw)
  To: bvanassche, martin.petersen, jejb, linux-scsi
  Cc: gregkh, maier, bblock, linux-next, linux-s390

v4.17 commit 86b87cde0b55 ("scsi: core: host template attribute groups")
introduced explicit sysfs_create_groups() in scsi_sysfs_add_sdev()
and sysfs_remove_groups() in __scsi_remove_device(), both for sdev_gendev,
based on a new field const struct attribute_group **sdev_groups
of struct scsi_host_template.

Commit 92c4b58b15c5 ("scsi: core: Register sysfs attributes earlier")
removed above explicit (de)registration of scsi_device attribute groups.
It also converted all scsi_device attributes and attribute_groups to
end up in a new field const struct attribute_group *gendev_attr_groups[6]
of struct scsi_device. However, that new field was not used anywhere.

Surprisingly, this only caused missing LLDD specific scsi_device sysfs
attributes. Whereas, scsi core attributes from scsi_sdev_attr_groups
did continue to exist because of scsi_dev_type.groups.

Fix it by assigning the pointer of that new field to the groups
field of sdev_gendev so the driver core gets our LLDD groups.
Just like scsi_host_alloc() was changed by the same commit,
although scsi_host_alloc() already had assigned something to
shost_dev.groups so the necessary change was more obvious there.

We separate scsi core attibutes from LLDD specific attributes.
Hence, we keep the initializing assignment scsi_dev_type =
{ .groups = scsi_sdev_attr_groups, } as this takes care of core
attributes. Without the separation, it would cause attribute double
registration due to scsi_dev_type.groups and sdev_gendev.groups.

Alternative approaches ruled out:
Assigning gendev_attr_groups to sdev_dev has no visible effect.
Assigning sdev->gendev_attr_groups to scsi_dev_type.groups
caused scsi_device of all scsi host types to get LLDD specific
attributes of the LLDD for which the last sdev alloc happened to occur,
as that overwrote scsi_dev_type.groups,
e.g. scsi_debug had zfcp-specific scsi_device attributes.

Signed-off-by: Steffen Maier <maier@linux.ibm.com>
Fixes: 92c4b58b15c5 ("scsi: core: Register sysfs attributes earlier")
---
 drivers/scsi/scsi_sysfs.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/scsi/scsi_sysfs.c b/drivers/scsi/scsi_sysfs.c
index c26f0e29e8cd..a3e37d3728df 100644
--- a/drivers/scsi/scsi_sysfs.c
+++ b/drivers/scsi/scsi_sysfs.c
@@ -1583,7 +1583,7 @@ void scsi_sysfs_device_initialize(struct scsi_device *sdev)
 	scsi_enable_async_suspend(&sdev->sdev_gendev);
 	dev_set_name(&sdev->sdev_gendev, "%d:%d:%d:%llu",
 		     sdev->host->host_no, sdev->channel, sdev->id, sdev->lun);
-	sdev->gendev_attr_groups[j++] = &scsi_sdev_attr_group;
+	sdev->sdev_gendev.groups = sdev->gendev_attr_groups;
 	if (hostt->sdev_groups) {
 		for (i = 0; hostt->sdev_groups[i] &&
 			     j < ARRAY_SIZE(sdev->gendev_attr_groups);
-- 
2.25.1


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

* Re: [PATCH] scsi: core: Fix early registration of sysfs attributes for scsi_device
  2021-10-24 11:18       ` [PATCH] scsi: core: Fix early registration of sysfs attributes for scsi_device Steffen Maier
@ 2021-10-24 21:25         ` Bart Van Assche
  2021-10-24 22:16           ` [PATCH v2] " Steffen Maier
  0 siblings, 1 reply; 14+ messages in thread
From: Bart Van Assche @ 2021-10-24 21:25 UTC (permalink / raw)
  To: Steffen Maier, martin.petersen, jejb, linux-scsi
  Cc: gregkh, bblock, linux-next, linux-s390

On 10/24/21 04:18, Steffen Maier wrote:
> diff --git a/drivers/scsi/scsi_sysfs.c b/drivers/scsi/scsi_sysfs.c
> index c26f0e29e8cd..a3e37d3728df 100644
> --- a/drivers/scsi/scsi_sysfs.c
> +++ b/drivers/scsi/scsi_sysfs.c
> @@ -1583,7 +1583,7 @@ void scsi_sysfs_device_initialize(struct scsi_device *sdev)
>   	scsi_enable_async_suspend(&sdev->sdev_gendev);
>   	dev_set_name(&sdev->sdev_gendev, "%d:%d:%d:%llu",
>   		     sdev->host->host_no, sdev->channel, sdev->id, sdev->lun);
> -	sdev->gendev_attr_groups[j++] = &scsi_sdev_attr_group;
> +	sdev->sdev_gendev.groups = sdev->gendev_attr_groups;
>   	if (hostt->sdev_groups) {
>   		for (i = 0; hostt->sdev_groups[i] &&
>   			     j < ARRAY_SIZE(sdev->gendev_attr_groups);

How about also updating the comment above the gendev_attr_groups
declaration since the above change makes that comment incorrect?

Thanks,

Bart.



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

* [PATCH v2] scsi: core: Fix early registration of sysfs attributes for scsi_device
  2021-10-24 21:25         ` Bart Van Assche
@ 2021-10-24 22:16           ` Steffen Maier
  2021-10-25  9:23             ` Julian Wiedmann
  0 siblings, 1 reply; 14+ messages in thread
From: Steffen Maier @ 2021-10-24 22:16 UTC (permalink / raw)
  To: bvanassche, martin.petersen, jejb, linux-scsi
  Cc: gregkh, maier, bblock, linux-next, linux-s390

v4.17 commit 86b87cde0b55 ("scsi: core: host template attribute groups")
introduced explicit sysfs_create_groups() in scsi_sysfs_add_sdev()
and sysfs_remove_groups() in __scsi_remove_device(), both for sdev_gendev,
based on a new field const struct attribute_group **sdev_groups
of struct scsi_host_template.

Commit 92c4b58b15c5 ("scsi: core: Register sysfs attributes earlier")
removed above explicit (de)registration of scsi_device attribute groups.
It also converted all scsi_device attributes and attribute_groups to
end up in a new field const struct attribute_group *gendev_attr_groups[6]
of struct scsi_device. However, that new field was not used anywhere.

Surprisingly, this only caused missing LLDD specific scsi_device sysfs
attributes. Whereas, scsi core attributes from scsi_sdev_attr_groups
did continue to exist because of scsi_dev_type.groups.

Fix it by assigning the pointer of that new field to the groups
field of sdev_gendev so the driver core gets our LLDD groups.
Just like scsi_host_alloc() was changed by the same commit,
although scsi_host_alloc() already had assigned something to
shost_dev.groups so the necessary change was more obvious there.

We separate scsi core attibutes from LLDD specific attributes.
Hence, we keep the initializing assignment scsi_dev_type =
{ .groups = scsi_sdev_attr_groups, } as this takes care of core
attributes. Without the separation, it would cause attribute double
registration due to scsi_dev_type.groups and sdev_gendev.groups.

Since we now no longer have an index offset between left and right
hand side of the assignment in the loop, one counter variable suffices.

Alternative approaches ruled out:
Assigning gendev_attr_groups to sdev_dev has no visible effect.
Assigning sdev->gendev_attr_groups to scsi_dev_type.groups
caused scsi_device of all scsi host types to get LLDD specific
attributes of the LLDD for which the last sdev alloc happened to occur,
as that overwrote scsi_dev_type.groups,
e.g. scsi_debug had zfcp-specific scsi_device attributes.

Signed-off-by: Steffen Maier <maier@linux.ibm.com>
Fixes: 92c4b58b15c5 ("scsi: core: Register sysfs attributes earlier")
---

Changes in v2:
* integrated Bart's feedback of updating the comment for
  the gendev_attr_groups declaration to match the code change
* in that spirit also adapted the vector size of that field
* eliminated the now unnecessary second loop counter 'j'

 drivers/scsi/scsi_sysfs.c  | 12 ++++++------
 include/scsi/scsi_device.h |  7 +++----
 2 files changed, 9 insertions(+), 10 deletions(-)

diff --git a/drivers/scsi/scsi_sysfs.c b/drivers/scsi/scsi_sysfs.c
index c26f0e29e8cd..d73e84e1cb37 100644
--- a/drivers/scsi/scsi_sysfs.c
+++ b/drivers/scsi/scsi_sysfs.c
@@ -1571,7 +1571,7 @@ static struct device_type scsi_dev_type = {
 
 void scsi_sysfs_device_initialize(struct scsi_device *sdev)
 {
-	int i, j = 0;
+	int i = 0;
 	unsigned long flags;
 	struct Scsi_Host *shost = sdev->host;
 	struct scsi_host_template *hostt = shost->hostt;
@@ -1583,15 +1583,15 @@ void scsi_sysfs_device_initialize(struct scsi_device *sdev)
 	scsi_enable_async_suspend(&sdev->sdev_gendev);
 	dev_set_name(&sdev->sdev_gendev, "%d:%d:%d:%llu",
 		     sdev->host->host_no, sdev->channel, sdev->id, sdev->lun);
-	sdev->gendev_attr_groups[j++] = &scsi_sdev_attr_group;
+	sdev->sdev_gendev.groups = sdev->gendev_attr_groups;
 	if (hostt->sdev_groups) {
 		for (i = 0; hostt->sdev_groups[i] &&
-			     j < ARRAY_SIZE(sdev->gendev_attr_groups);
-		     i++, j++) {
-			sdev->gendev_attr_groups[j] = hostt->sdev_groups[i];
+			     i < ARRAY_SIZE(sdev->gendev_attr_groups);
+		     i++) {
+			sdev->gendev_attr_groups[i] = hostt->sdev_groups[i];
 		}
 	}
-	WARN_ON_ONCE(j >= ARRAY_SIZE(sdev->gendev_attr_groups));
+	WARN_ON_ONCE(i >= ARRAY_SIZE(sdev->gendev_attr_groups));
 
 	device_initialize(&sdev->sdev_dev);
 	sdev->sdev_dev.parent = get_device(&sdev->sdev_gendev);
diff --git a/include/scsi/scsi_device.h b/include/scsi/scsi_device.h
index b1e9b3bd3a60..b6f0d031217e 100644
--- a/include/scsi/scsi_device.h
+++ b/include/scsi/scsi_device.h
@@ -226,11 +226,10 @@ struct scsi_device {
 	struct device		sdev_gendev,
 				sdev_dev;
 	/*
-	 * The array size 6 provides space for one attribute group for the
-	 * SCSI core, four attribute groups defined by SCSI LLDs and one
-	 * terminating NULL pointer.
+	 * The array size 5 provides space for four attribute groups
+	 * defined by SCSI LLDs and one terminating NULL pointer.
 	 */
-	const struct attribute_group *gendev_attr_groups[6];
+	const struct attribute_group *gendev_attr_groups[5];
 
 	struct execute_work	ew; /* used to get process context on put */
 	struct work_struct	requeue_work;
-- 
2.25.1


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

* Re: [PATCH v2] scsi: core: Fix early registration of sysfs attributes for scsi_device
  2021-10-24 22:16           ` [PATCH v2] " Steffen Maier
@ 2021-10-25  9:23             ` Julian Wiedmann
  2021-10-25 16:00               ` Bart Van Assche
  2021-10-26  1:42               ` [PATCH v3] " Steffen Maier
  0 siblings, 2 replies; 14+ messages in thread
From: Julian Wiedmann @ 2021-10-25  9:23 UTC (permalink / raw)
  To: Steffen Maier, bvanassche, martin.petersen, jejb, linux-scsi
  Cc: gregkh, bblock, linux-next, linux-s390

On 25.10.21 00:16, Steffen Maier wrote:
> v4.17 commit 86b87cde0b55 ("scsi: core: host template attribute groups")
> introduced explicit sysfs_create_groups() in scsi_sysfs_add_sdev()
> and sysfs_remove_groups() in __scsi_remove_device(), both for sdev_gendev,
> based on a new field const struct attribute_group **sdev_groups
> of struct scsi_host_template.
> 

...

> Signed-off-by: Steffen Maier <maier@linux.ibm.com>
> Fixes: 92c4b58b15c5 ("scsi: core: Register sysfs attributes earlier")
> ---
> 
> Changes in v2:
> * integrated Bart's feedback of updating the comment for
>   the gendev_attr_groups declaration to match the code change
> * in that spirit also adapted the vector size of that field
> * eliminated the now unnecessary second loop counter 'j'
> 
>  drivers/scsi/scsi_sysfs.c  | 12 ++++++------
>  include/scsi/scsi_device.h |  7 +++----
>  2 files changed, 9 insertions(+), 10 deletions(-)
> 
> diff --git a/drivers/scsi/scsi_sysfs.c b/drivers/scsi/scsi_sysfs.c
> index c26f0e29e8cd..d73e84e1cb37 100644
> --- a/drivers/scsi/scsi_sysfs.c
> +++ b/drivers/scsi/scsi_sysfs.c
> @@ -1571,7 +1571,7 @@ static struct device_type scsi_dev_type = {
>  
>  void scsi_sysfs_device_initialize(struct scsi_device *sdev)
>  {
> -	int i, j = 0;
> +	int i = 0;
>  	unsigned long flags;
>  	struct Scsi_Host *shost = sdev->host;
>  	struct scsi_host_template *hostt = shost->hostt;
> @@ -1583,15 +1583,15 @@ void scsi_sysfs_device_initialize(struct scsi_device *sdev)
>  	scsi_enable_async_suspend(&sdev->sdev_gendev);
>  	dev_set_name(&sdev->sdev_gendev, "%d:%d:%d:%llu",
>  		     sdev->host->host_no, sdev->channel, sdev->id, sdev->lun);
> -	sdev->gendev_attr_groups[j++] = &scsi_sdev_attr_group;
> +	sdev->sdev_gendev.groups = sdev->gendev_attr_groups;
>  	if (hostt->sdev_groups) {
>  		for (i = 0; hostt->sdev_groups[i] &&
> -			     j < ARRAY_SIZE(sdev->gendev_attr_groups);
> -		     i++, j++) {
> -			sdev->gendev_attr_groups[j] = hostt->sdev_groups[i];
> +			     i < ARRAY_SIZE(sdev->gendev_attr_groups);
> +		     i++) {
> +			sdev->gendev_attr_groups[i] = hostt->sdev_groups[i];
>  		}
>  	}
> -	WARN_ON_ONCE(j >= ARRAY_SIZE(sdev->gendev_attr_groups));
> +	WARN_ON_ONCE(i >= ARRAY_SIZE(sdev->gendev_attr_groups));
>  

Can't we simply assign the hostt->sdev_groups now, without the additional
indirection?

sdev->sdev_gendev.groups = hostt->sdev_groups;


>  	device_initialize(&sdev->sdev_dev);
>  	sdev->sdev_dev.parent = get_device(&sdev->sdev_gendev);
> diff --git a/include/scsi/scsi_device.h b/include/scsi/scsi_device.h
> index b1e9b3bd3a60..b6f0d031217e 100644
> --- a/include/scsi/scsi_device.h
> +++ b/include/scsi/scsi_device.h
> @@ -226,11 +226,10 @@ struct scsi_device {
>  	struct device		sdev_gendev,
>  				sdev_dev;
>  	/*
> -	 * The array size 6 provides space for one attribute group for the
> -	 * SCSI core, four attribute groups defined by SCSI LLDs and one
> -	 * terminating NULL pointer.
> +	 * The array size 5 provides space for four attribute groups
> +	 * defined by SCSI LLDs and one terminating NULL pointer.
>  	 */
> -	const struct attribute_group *gendev_attr_groups[6];
> +	const struct attribute_group *gendev_attr_groups[5];
>  
>  	struct execute_work	ew; /* used to get process context on put */
>  	struct work_struct	requeue_work;
> 


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

* Re: [PATCH v2] scsi: core: Fix early registration of sysfs attributes for scsi_device
  2021-10-25  9:23             ` Julian Wiedmann
@ 2021-10-25 16:00               ` Bart Van Assche
  2021-10-26  1:42               ` [PATCH v3] " Steffen Maier
  1 sibling, 0 replies; 14+ messages in thread
From: Bart Van Assche @ 2021-10-25 16:00 UTC (permalink / raw)
  To: Julian Wiedmann, Steffen Maier, martin.petersen, jejb, linux-scsi
  Cc: gregkh, bblock, linux-next, linux-s390

On 10/25/21 2:23 AM, Julian Wiedmann wrote:
> On 25.10.21 00:16, Steffen Maier wrote:
>>   void scsi_sysfs_device_initialize(struct scsi_device *sdev)
>>   {
>> -	int i, j = 0;
>> +	int i = 0;
>>   	unsigned long flags;
>>   	struct Scsi_Host *shost = sdev->host;
>>   	struct scsi_host_template *hostt = shost->hostt;
>> @@ -1583,15 +1583,15 @@ void scsi_sysfs_device_initialize(struct scsi_device *sdev)
>>   	scsi_enable_async_suspend(&sdev->sdev_gendev);
>>   	dev_set_name(&sdev->sdev_gendev, "%d:%d:%d:%llu",
>>   		     sdev->host->host_no, sdev->channel, sdev->id, sdev->lun);
>> -	sdev->gendev_attr_groups[j++] = &scsi_sdev_attr_group;
>> +	sdev->sdev_gendev.groups = sdev->gendev_attr_groups;
>>   	if (hostt->sdev_groups) {
>>   		for (i = 0; hostt->sdev_groups[i] &&
>> -			     j < ARRAY_SIZE(sdev->gendev_attr_groups);
>> -		     i++, j++) {
>> -			sdev->gendev_attr_groups[j] = hostt->sdev_groups[i];
>> +			     i < ARRAY_SIZE(sdev->gendev_attr_groups);
>> +		     i++) {
>> +			sdev->gendev_attr_groups[i] = hostt->sdev_groups[i];
>>   		}
>>   	}
>> -	WARN_ON_ONCE(j >= ARRAY_SIZE(sdev->gendev_attr_groups));
>> +	WARN_ON_ONCE(i >= ARRAY_SIZE(sdev->gendev_attr_groups));
>>   
> 
> Can't we simply assign the hostt->sdev_groups now, without the additional
> indirection?
> 
> sdev->sdev_gendev.groups = hostt->sdev_groups;

Hi Steffen,

Please let me know if you wouldn't have the time to integrate the 
approach mentioned above in a new version of your patch.

Thanks,

Bart.

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

* [PATCH v3] scsi: core: Fix early registration of sysfs attributes for scsi_device
  2021-10-25  9:23             ` Julian Wiedmann
  2021-10-25 16:00               ` Bart Van Assche
@ 2021-10-26  1:42               ` Steffen Maier
  2021-10-26 10:00                 ` Benjamin Block
                                   ` (2 more replies)
  1 sibling, 3 replies; 14+ messages in thread
From: Steffen Maier @ 2021-10-26  1:42 UTC (permalink / raw)
  To: jwi, bvanassche, martin.petersen, jejb, linux-scsi
  Cc: gregkh, maier, bblock, linux-next, linux-s390

v4.17 commit 86b87cde0b55 ("scsi: core: host template attribute groups")
introduced explicit sysfs_create_groups() in scsi_sysfs_add_sdev()
and sysfs_remove_groups() in __scsi_remove_device(), both for sdev_gendev,
based on a new field const struct attribute_group **sdev_groups
of struct scsi_host_template.

Commit 92c4b58b15c5 ("scsi: core: Register sysfs attributes earlier")
removed above explicit (de)registration of scsi_device attribute groups.
It also converted all scsi_device attributes and attribute_groups to
end up in a new field const struct attribute_group *gendev_attr_groups[6]
of struct scsi_device. However, that new field was not used anywhere.

Surprisingly, this only caused missing LLDD specific scsi_device sysfs
attributes. Whereas, scsi core attributes from scsi_sdev_attr_groups
did continue to exist because of scsi_dev_type.groups.

We separate scsi core attibutes from LLDD specific attributes.
Hence, we keep the initializing assignment scsi_dev_type =
{ .groups = scsi_sdev_attr_groups, } as this takes care of core
attributes. Without the separation, it would cause attribute double
registration due to scsi_dev_type.groups and sdev_gendev.groups.

Julian suggested to assign the sdev_groups pointer of the
scsi_host_template directly to the groups pointer of sdev_gendev.
This way we can delete the container scsi_device.gendev_attr_groups
and the loop copying each entry from hostt->sdev_groups to
sdev->gendev_attr_groups.

Alternative approaches ruled out:
Assigning gendev_attr_groups to sdev_dev has no visible effect.
Assigning sdev->gendev_attr_groups to scsi_dev_type.groups
caused scsi_device of all scsi host types to get LLDD specific
attributes of the LLDD for which the last sdev alloc happened to occur,
as that overwrote scsi_dev_type.groups,
e.g. scsi_debug had zfcp-specific scsi_device attributes.

Signed-off-by: Steffen Maier <maier@linux.ibm.com>
Fixes: 92c4b58b15c5 ("scsi: core: Register sysfs attributes earlier")
Suggested-by: Julian Wiedmann <jwi@linux.ibm.com>
---

Notes:
    Changes in v3:
    * integrated Julian's feedback of dropping detour through
      gendev_attr_groups
    
    Changes in v2:
    * integrated Bart's feedback of updating the comment for
      the gendev_attr_groups declaration to match the code change
    * in that spirit also adapted the vector size of that field
    * eliminated the now unnecessary second loop counter 'j'

 drivers/scsi/scsi_sysfs.c  | 11 +----------
 include/scsi/scsi_device.h |  6 ------
 2 files changed, 1 insertion(+), 16 deletions(-)

diff --git a/drivers/scsi/scsi_sysfs.c b/drivers/scsi/scsi_sysfs.c
index c26f0e29e8cd..fa064bf9a55c 100644
--- a/drivers/scsi/scsi_sysfs.c
+++ b/drivers/scsi/scsi_sysfs.c
@@ -1571,7 +1571,6 @@ static struct device_type scsi_dev_type = {
 
 void scsi_sysfs_device_initialize(struct scsi_device *sdev)
 {
-	int i, j = 0;
 	unsigned long flags;
 	struct Scsi_Host *shost = sdev->host;
 	struct scsi_host_template *hostt = shost->hostt;
@@ -1583,15 +1582,7 @@ void scsi_sysfs_device_initialize(struct scsi_device *sdev)
 	scsi_enable_async_suspend(&sdev->sdev_gendev);
 	dev_set_name(&sdev->sdev_gendev, "%d:%d:%d:%llu",
 		     sdev->host->host_no, sdev->channel, sdev->id, sdev->lun);
-	sdev->gendev_attr_groups[j++] = &scsi_sdev_attr_group;
-	if (hostt->sdev_groups) {
-		for (i = 0; hostt->sdev_groups[i] &&
-			     j < ARRAY_SIZE(sdev->gendev_attr_groups);
-		     i++, j++) {
-			sdev->gendev_attr_groups[j] = hostt->sdev_groups[i];
-		}
-	}
-	WARN_ON_ONCE(j >= ARRAY_SIZE(sdev->gendev_attr_groups));
+	sdev->sdev_gendev.groups = hostt->sdev_groups;
 
 	device_initialize(&sdev->sdev_dev);
 	sdev->sdev_dev.parent = get_device(&sdev->sdev_gendev);
diff --git a/include/scsi/scsi_device.h b/include/scsi/scsi_device.h
index b1e9b3bd3a60..b97e142a7ca9 100644
--- a/include/scsi/scsi_device.h
+++ b/include/scsi/scsi_device.h
@@ -225,12 +225,6 @@ struct scsi_device {
 
 	struct device		sdev_gendev,
 				sdev_dev;
-	/*
-	 * The array size 6 provides space for one attribute group for the
-	 * SCSI core, four attribute groups defined by SCSI LLDs and one
-	 * terminating NULL pointer.
-	 */
-	const struct attribute_group *gendev_attr_groups[6];
 
 	struct execute_work	ew; /* used to get process context on put */
 	struct work_struct	requeue_work;
-- 
2.25.1


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

* Re: [PATCH v3] scsi: core: Fix early registration of sysfs attributes for scsi_device
  2021-10-26  1:42               ` [PATCH v3] " Steffen Maier
@ 2021-10-26 10:00                 ` Benjamin Block
  2021-10-26 21:48                   ` Bart Van Assche
  2021-10-26 18:31                 ` Bart Van Assche
  2021-10-29 17:56                 ` Benjamin Block
  2 siblings, 1 reply; 14+ messages in thread
From: Benjamin Block @ 2021-10-26 10:00 UTC (permalink / raw)
  To: Steffen Maier, bvanassche
  Cc: jwi, martin.petersen, jejb, linux-scsi, gregkh, linux-next, linux-s390

On Tue, Oct 26, 2021 at 03:42:40AM +0200, Steffen Maier wrote:
> v4.17 commit 86b87cde0b55 ("scsi: core: host template attribute groups")
> introduced explicit sysfs_create_groups() in scsi_sysfs_add_sdev()
> and sysfs_remove_groups() in __scsi_remove_device(), both for sdev_gendev,
> based on a new field const struct attribute_group **sdev_groups
> of struct scsi_host_template.
> 
> Commit 92c4b58b15c5 ("scsi: core: Register sysfs attributes earlier")
> removed above explicit (de)registration of scsi_device attribute groups.
> It also converted all scsi_device attributes and attribute_groups to
> end up in a new field const struct attribute_group *gendev_attr_groups[6]
> of struct scsi_device. However, that new field was not used anywhere.

Oh.. damn, I didn't notice either.

> 
> Surprisingly, this only caused missing LLDD specific scsi_device sysfs
> attributes. Whereas, scsi core attributes from scsi_sdev_attr_groups
> did continue to exist because of scsi_dev_type.groups.

Hmm, maybe this is out of scope for this fix, but couldn't we
essentially do the same thing for the host attributes. Have the
`shost_class` take the `scsi_shost_attr_group` as default attributes for
the shost class, and then assign the `shost_groups` from the LLDD
template to `shost_dev.groups` as optional attributes? 

Then we get rid of the indirection loop in `hosts.c` as well, that was
introduce with he original patch by Bart.

Just a shot in the dark, I don't know whether the `struct class` behaves
the same in this case as `struct device_type`.

> 
> We separate scsi core attibutes from LLDD specific attributes.
> Hence, we keep the initializing assignment scsi_dev_type =
> { .groups = scsi_sdev_attr_groups, } as this takes care of core
> attributes. Without the separation, it would cause attribute double
> registration due to scsi_dev_type.groups and sdev_gendev.groups.
> 
> Julian suggested to assign the sdev_groups pointer of the
> scsi_host_template directly to the groups pointer of sdev_gendev.
> This way we can delete the container scsi_device.gendev_attr_groups
> and the loop copying each entry from hostt->sdev_groups to
> sdev->gendev_attr_groups.
> 
> Alternative approaches ruled out:
> Assigning gendev_attr_groups to sdev_dev has no visible effect.
> Assigning sdev->gendev_attr_groups to scsi_dev_type.groups
> caused scsi_device of all scsi host types to get LLDD specific
> attributes of the LLDD for which the last sdev alloc happened to occur,
> as that overwrote scsi_dev_type.groups,
> e.g. scsi_debug had zfcp-specific scsi_device attributes.
> 
> Signed-off-by: Steffen Maier <maier@linux.ibm.com>
> Fixes: 92c4b58b15c5 ("scsi: core: Register sysfs attributes earlier")
> Suggested-by: Julian Wiedmann <jwi@linux.ibm.com>

-- 
Best Regards, Benjamin Block  / Linux on IBM Z Kernel Development / IBM Systems
IBM Deutschland Research & Development GmbH    /    https://www.ibm.com/privacy
Vorsitz. AufsR.: Gregor Pillen         /        Geschäftsführung: Dirk Wittkopp
Sitz der Gesellschaft: Böblingen / Registergericht: AmtsG Stuttgart, HRB 243294

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

* Re: [PATCH v3] scsi: core: Fix early registration of sysfs attributes for scsi_device
  2021-10-26  1:42               ` [PATCH v3] " Steffen Maier
  2021-10-26 10:00                 ` Benjamin Block
@ 2021-10-26 18:31                 ` Bart Van Assche
  2021-10-29 17:56                 ` Benjamin Block
  2 siblings, 0 replies; 14+ messages in thread
From: Bart Van Assche @ 2021-10-26 18:31 UTC (permalink / raw)
  To: Steffen Maier, jwi, martin.petersen, jejb, linux-scsi
  Cc: gregkh, bblock, linux-next, linux-s390

On 10/25/21 6:42 PM, Steffen Maier wrote:
> diff --git a/drivers/scsi/scsi_sysfs.c b/drivers/scsi/scsi_sysfs.c
> index c26f0e29e8cd..fa064bf9a55c 100644
> --- a/drivers/scsi/scsi_sysfs.c
> +++ b/drivers/scsi/scsi_sysfs.c
> @@ -1571,7 +1571,6 @@ static struct device_type scsi_dev_type = {
>   
>   void scsi_sysfs_device_initialize(struct scsi_device *sdev)
>   {
> -	int i, j = 0;
>   	unsigned long flags;
>   	struct Scsi_Host *shost = sdev->host;
>   	struct scsi_host_template *hostt = shost->hostt;
> @@ -1583,15 +1582,7 @@ void scsi_sysfs_device_initialize(struct scsi_device *sdev)
>   	scsi_enable_async_suspend(&sdev->sdev_gendev);
>   	dev_set_name(&sdev->sdev_gendev, "%d:%d:%d:%llu",
>   		     sdev->host->host_no, sdev->channel, sdev->id, sdev->lun);
> -	sdev->gendev_attr_groups[j++] = &scsi_sdev_attr_group;
> -	if (hostt->sdev_groups) {
> -		for (i = 0; hostt->sdev_groups[i] &&
> -			     j < ARRAY_SIZE(sdev->gendev_attr_groups);
> -		     i++, j++) {
> -			sdev->gendev_attr_groups[j] = hostt->sdev_groups[i];
> -		}
> -	}
> -	WARN_ON_ONCE(j >= ARRAY_SIZE(sdev->gendev_attr_groups));
> +	sdev->sdev_gendev.groups = hostt->sdev_groups;
>   
>   	device_initialize(&sdev->sdev_dev);
>   	sdev->sdev_dev.parent = get_device(&sdev->sdev_gendev);
> diff --git a/include/scsi/scsi_device.h b/include/scsi/scsi_device.h
> index b1e9b3bd3a60..b97e142a7ca9 100644
> --- a/include/scsi/scsi_device.h
> +++ b/include/scsi/scsi_device.h
> @@ -225,12 +225,6 @@ struct scsi_device {
>   
>   	struct device		sdev_gendev,
>   				sdev_dev;
> -	/*
> -	 * The array size 6 provides space for one attribute group for the
> -	 * SCSI core, four attribute groups defined by SCSI LLDs and one
> -	 * terminating NULL pointer.
> -	 */
> -	const struct attribute_group *gendev_attr_groups[6];
>   
>   	struct execute_work	ew; /* used to get process context on put */
>   	struct work_struct	requeue_work;

Thanks!

Reviewed-by: Bart Van Assche <bvanassche@acm.org>

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

* Re: [PATCH v3] scsi: core: Fix early registration of sysfs attributes for scsi_device
  2021-10-26 10:00                 ` Benjamin Block
@ 2021-10-26 21:48                   ` Bart Van Assche
  2021-10-29 17:55                     ` Benjamin Block
  0 siblings, 1 reply; 14+ messages in thread
From: Bart Van Assche @ 2021-10-26 21:48 UTC (permalink / raw)
  To: Benjamin Block, Steffen Maier
  Cc: jwi, martin.petersen, jejb, linux-scsi, gregkh, linux-next, linux-s390

On 10/26/21 3:00 AM, Benjamin Block wrote:
> Hmm, maybe this is out of scope for this fix, but couldn't we
> essentially do the same thing for the host attributes. Have the
> `shost_class` take the `scsi_shost_attr_group` as default attributes for
> the shost class, and then assign the `shost_groups` from the LLDD
> template to `shost_dev.groups` as optional attributes?
> 
> Then we get rid of the indirection loop in `hosts.c` as well, that was
> introduce with he original patch by Bart.
> 
> Just a shot in the dark, I don't know whether the `struct class` behaves
> the same in this case as `struct device_type`.

Is something like this what you have in mind?

Thanks,

Bart.


Subject: [PATCH] scsi: core: Remove Scsi_Host.shost_dev_attr_groups

Suggested-by: Benjamin Block <bblock@linux.ibm.com>
Signed-off-by: Bart Van Assche <bvanassche@acm.org>
---
  drivers/scsi/hosts.c      | 15 +++------------
  drivers/scsi/scsi_priv.h  |  2 +-
  drivers/scsi/scsi_sysfs.c |  7 ++++++-
  include/scsi/scsi_host.h  |  6 ------
  4 files changed, 10 insertions(+), 20 deletions(-)

diff --git a/drivers/scsi/hosts.c b/drivers/scsi/hosts.c
index 17aef936bc90..f88e7ed77dbb 100644
--- a/drivers/scsi/hosts.c
+++ b/drivers/scsi/hosts.c
@@ -61,6 +61,7 @@ static void scsi_host_cls_release(struct device *dev)
  static struct class shost_class = {
  	.name		= "scsi_host",
  	.dev_release	= scsi_host_cls_release,
+	.dev_groups	= scsi_shost_groups,
  };

  /**
@@ -376,7 +377,7 @@ static struct device_type scsi_host_type = {
  struct Scsi_Host *scsi_host_alloc(struct scsi_host_template *sht, int privsize)
  {
  	struct Scsi_Host *shost;
-	int index, i, j = 0;
+	int index;

  	shost = kzalloc(sizeof(struct Scsi_Host) + privsize, GFP_KERNEL);
  	if (!shost)
@@ -481,17 +482,7 @@ struct Scsi_Host *scsi_host_alloc(struct scsi_host_template *sht, int privsize)
  	shost->shost_dev.parent = &shost->shost_gendev;
  	shost->shost_dev.class = &shost_class;
  	dev_set_name(&shost->shost_dev, "host%d", shost->host_no);
-	shost->shost_dev.groups = shost->shost_dev_attr_groups;
-	shost->shost_dev_attr_groups[j++] = &scsi_shost_attr_group;
-	if (sht->shost_groups) {
-		for (i = 0; sht->shost_groups[i] &&
-			     j < ARRAY_SIZE(shost->shost_dev_attr_groups);
-		     i++, j++) {
-			shost->shost_dev_attr_groups[j] =
-				sht->shost_groups[i];
-		}
-	}
-	WARN_ON_ONCE(j >= ARRAY_SIZE(shost->shost_dev_attr_groups));
+	shost->shost_dev.groups = sht->shost_groups;

  	shost->ehandler = kthread_run(scsi_error_handler, shost,
  			"scsi_eh_%d", shost->host_no);
diff --git a/drivers/scsi/scsi_priv.h b/drivers/scsi/scsi_priv.h
index a278fc8948f4..0f5743f4769b 100644
--- a/drivers/scsi/scsi_priv.h
+++ b/drivers/scsi/scsi_priv.h
@@ -144,7 +144,7 @@ extern struct scsi_transport_template blank_transport_template;
  extern void __scsi_remove_device(struct scsi_device *);

  extern struct bus_type scsi_bus_type;
-extern const struct attribute_group scsi_shost_attr_group;
+extern const struct attribute_group *scsi_shost_groups[];

  /* scsi_netlink.c */
  #ifdef CONFIG_SCSI_NETLINK
diff --git a/drivers/scsi/scsi_sysfs.c b/drivers/scsi/scsi_sysfs.c
index c26f0e29e8cd..f360154b5241 100644
--- a/drivers/scsi/scsi_sysfs.c
+++ b/drivers/scsi/scsi_sysfs.c
@@ -424,10 +424,15 @@ static struct attribute *scsi_sysfs_shost_attrs[] = {
  	NULL
  };

-const struct attribute_group scsi_shost_attr_group = {
+static const struct attribute_group scsi_shost_attr_group = {
  	.attrs =	scsi_sysfs_shost_attrs,
  };

+const struct attribute_group *scsi_shost_groups[] = {
+	&scsi_shost_attr_group,
+	NULL
+};
+
  static void scsi_device_cls_release(struct device *class_dev)
  {
  	struct scsi_device *sdev;
diff --git a/include/scsi/scsi_host.h b/include/scsi/scsi_host.h
index ae715959f886..97cdad14de56 100644
--- a/include/scsi/scsi_host.h
+++ b/include/scsi/scsi_host.h
@@ -690,12 +690,6 @@ struct Scsi_Host {

  	/* ldm bits */
  	struct device		shost_gendev, shost_dev;
-	/*
-	 * The array size 3 provides space for one attribute group defined by
-	 * the SCSI core, one attribute group defined by the SCSI LLD and one
-	 * terminating NULL pointer.
-	 */
-	const struct attribute_group *shost_dev_attr_groups[3];

  	/*
  	 * Points to the transport data (if any) which is allocated

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

* Re: [PATCH v3] scsi: core: Fix early registration of sysfs attributes for scsi_device
  2021-10-26 21:48                   ` Bart Van Assche
@ 2021-10-29 17:55                     ` Benjamin Block
  0 siblings, 0 replies; 14+ messages in thread
From: Benjamin Block @ 2021-10-29 17:55 UTC (permalink / raw)
  To: Bart Van Assche
  Cc: Steffen Maier, jwi, martin.petersen, jejb, linux-scsi, gregkh,
	linux-next, linux-s390

On Tue, Oct 26, 2021 at 02:48:55PM -0700, Bart Van Assche wrote:
> On 10/26/21 3:00 AM, Benjamin Block wrote:
> > Hmm, maybe this is out of scope for this fix, but couldn't we
> > essentially do the same thing for the host attributes. Have the
> > `shost_class` take the `scsi_shost_attr_group` as default attributes for
> > the shost class, and then assign the `shost_groups` from the LLDD
> > template to `shost_dev.groups` as optional attributes?
> > 
> > Then we get rid of the indirection loop in `hosts.c` as well, that was
> > introduce with he original patch by Bart.
> > 
> > Just a shot in the dark, I don't know whether the `struct class` behaves
> > the same in this case as `struct device_type`.
> 
> Is something like this what you have in mind?

Yes, exactly. That's what I meant. That make host and dev similar again.

I just wasn't really sure whether `.dev_groups` in class behaves the
same as with what Steffen did. From the documentation it does though.

> 
> Thanks,
> 
> Bart.
> 
> 
> Subject: [PATCH] scsi: core: Remove Scsi_Host.shost_dev_attr_groups
> 
> Suggested-by: Benjamin Block <bblock@linux.ibm.com>
> Signed-off-by: Bart Van Assche <bvanassche@acm.org>
> ---
>  drivers/scsi/hosts.c      | 15 +++------------
>  drivers/scsi/scsi_priv.h  |  2 +-
>  drivers/scsi/scsi_sysfs.c |  7 ++++++-
>  include/scsi/scsi_host.h  |  6 ------
>  4 files changed, 10 insertions(+), 20 deletions(-)
> 
> diff --git a/drivers/scsi/hosts.c b/drivers/scsi/hosts.c
> index 17aef936bc90..f88e7ed77dbb 100644
> --- a/drivers/scsi/hosts.c
> +++ b/drivers/scsi/hosts.c
> @@ -61,6 +61,7 @@ static void scsi_host_cls_release(struct device *dev)
>  static struct class shost_class = {
>  	.name		= "scsi_host",
>  	.dev_release	= scsi_host_cls_release,
> +	.dev_groups	= scsi_shost_groups,
>  };
> 
>  /**
> @@ -376,7 +377,7 @@ static struct device_type scsi_host_type = {
>  struct Scsi_Host *scsi_host_alloc(struct scsi_host_template *sht, int privsize)
>  {
>  	struct Scsi_Host *shost;
> -	int index, i, j = 0;
> +	int index;
> 
>  	shost = kzalloc(sizeof(struct Scsi_Host) + privsize, GFP_KERNEL);
>  	if (!shost)
> @@ -481,17 +482,7 @@ struct Scsi_Host *scsi_host_alloc(struct scsi_host_template *sht, int privsize)
>  	shost->shost_dev.parent = &shost->shost_gendev;
>  	shost->shost_dev.class = &shost_class;
>  	dev_set_name(&shost->shost_dev, "host%d", shost->host_no);
> -	shost->shost_dev.groups = shost->shost_dev_attr_groups;
> -	shost->shost_dev_attr_groups[j++] = &scsi_shost_attr_group;
> -	if (sht->shost_groups) {
> -		for (i = 0; sht->shost_groups[i] &&
> -			     j < ARRAY_SIZE(shost->shost_dev_attr_groups);
> -		     i++, j++) {
> -			shost->shost_dev_attr_groups[j] =
> -				sht->shost_groups[i];
> -		}
> -	}
> -	WARN_ON_ONCE(j >= ARRAY_SIZE(shost->shost_dev_attr_groups));
> +	shost->shost_dev.groups = sht->shost_groups;
> 
>  	shost->ehandler = kthread_run(scsi_error_handler, shost,
>  			"scsi_eh_%d", shost->host_no);
> diff --git a/drivers/scsi/scsi_priv.h b/drivers/scsi/scsi_priv.h
> index a278fc8948f4..0f5743f4769b 100644
> --- a/drivers/scsi/scsi_priv.h
> +++ b/drivers/scsi/scsi_priv.h
> @@ -144,7 +144,7 @@ extern struct scsi_transport_template blank_transport_template;
>  extern void __scsi_remove_device(struct scsi_device *);
> 
>  extern struct bus_type scsi_bus_type;
> -extern const struct attribute_group scsi_shost_attr_group;
> +extern const struct attribute_group *scsi_shost_groups[];
> 
>  /* scsi_netlink.c */
>  #ifdef CONFIG_SCSI_NETLINK
> diff --git a/drivers/scsi/scsi_sysfs.c b/drivers/scsi/scsi_sysfs.c
> index c26f0e29e8cd..f360154b5241 100644
> --- a/drivers/scsi/scsi_sysfs.c
> +++ b/drivers/scsi/scsi_sysfs.c
> @@ -424,10 +424,15 @@ static struct attribute *scsi_sysfs_shost_attrs[] = {
>  	NULL
>  };
> 
> -const struct attribute_group scsi_shost_attr_group = {
> +static const struct attribute_group scsi_shost_attr_group = {
>  	.attrs =	scsi_sysfs_shost_attrs,
>  };
> 
> +const struct attribute_group *scsi_shost_groups[] = {
> +	&scsi_shost_attr_group,
> +	NULL
> +};
> +
>  static void scsi_device_cls_release(struct device *class_dev)
>  {
>  	struct scsi_device *sdev;
> diff --git a/include/scsi/scsi_host.h b/include/scsi/scsi_host.h
> index ae715959f886..97cdad14de56 100644
> --- a/include/scsi/scsi_host.h
> +++ b/include/scsi/scsi_host.h
> @@ -690,12 +690,6 @@ struct Scsi_Host {
> 
>  	/* ldm bits */
>  	struct device		shost_gendev, shost_dev;
> -	/*
> -	 * The array size 3 provides space for one attribute group defined by
> -	 * the SCSI core, one attribute group defined by the SCSI LLD and one
> -	 * terminating NULL pointer.
> -	 */
> -	const struct attribute_group *shost_dev_attr_groups[3];
> 
>  	/*
>  	 * Points to the transport data (if any) which is allocated

Reviewed-by: Benjamin Block <bblock@linux.ibm.com>

-- 
Best Regards, Benjamin Block  / Linux on IBM Z Kernel Development / IBM Systems
IBM Deutschland Research & Development GmbH    /    https://www.ibm.com/privacy
Vorsitz. AufsR.: Gregor Pillen         /        Geschäftsführung: Dirk Wittkopp
Sitz der Gesellschaft: Böblingen / Registergericht: AmtsG Stuttgart, HRB 243294

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

* Re: [PATCH v3] scsi: core: Fix early registration of sysfs attributes for scsi_device
  2021-10-26  1:42               ` [PATCH v3] " Steffen Maier
  2021-10-26 10:00                 ` Benjamin Block
  2021-10-26 18:31                 ` Bart Van Assche
@ 2021-10-29 17:56                 ` Benjamin Block
  2 siblings, 0 replies; 14+ messages in thread
From: Benjamin Block @ 2021-10-29 17:56 UTC (permalink / raw)
  To: Steffen Maier
  Cc: jwi, bvanassche, martin.petersen, jejb, linux-scsi, gregkh,
	linux-next, linux-s390

On Tue, Oct 26, 2021 at 03:42:40AM +0200, Steffen Maier wrote:
> v4.17 commit 86b87cde0b55 ("scsi: core: host template attribute groups")
> introduced explicit sysfs_create_groups() in scsi_sysfs_add_sdev()
> and sysfs_remove_groups() in __scsi_remove_device(), both for sdev_gendev,
> based on a new field const struct attribute_group **sdev_groups
> of struct scsi_host_template.
> 
> Commit 92c4b58b15c5 ("scsi: core: Register sysfs attributes earlier")
> removed above explicit (de)registration of scsi_device attribute groups.
> It also converted all scsi_device attributes and attribute_groups to
> end up in a new field const struct attribute_group *gendev_attr_groups[6]
> of struct scsi_device. However, that new field was not used anywhere.
> 
> Surprisingly, this only caused missing LLDD specific scsi_device sysfs
> attributes. Whereas, scsi core attributes from scsi_sdev_attr_groups
> did continue to exist because of scsi_dev_type.groups.
> 
> We separate scsi core attibutes from LLDD specific attributes.
> Hence, we keep the initializing assignment scsi_dev_type =
> { .groups = scsi_sdev_attr_groups, } as this takes care of core
> attributes. Without the separation, it would cause attribute double
> registration due to scsi_dev_type.groups and sdev_gendev.groups.
> 
> Julian suggested to assign the sdev_groups pointer of the
> scsi_host_template directly to the groups pointer of sdev_gendev.
> This way we can delete the container scsi_device.gendev_attr_groups
> and the loop copying each entry from hostt->sdev_groups to
> sdev->gendev_attr_groups.
> 
> Alternative approaches ruled out:
> Assigning gendev_attr_groups to sdev_dev has no visible effect.
> Assigning sdev->gendev_attr_groups to scsi_dev_type.groups
> caused scsi_device of all scsi host types to get LLDD specific
> attributes of the LLDD for which the last sdev alloc happened to occur,
> as that overwrote scsi_dev_type.groups,
> e.g. scsi_debug had zfcp-specific scsi_device attributes.
> 
> Signed-off-by: Steffen Maier <maier@linux.ibm.com>
> Fixes: 92c4b58b15c5 ("scsi: core: Register sysfs attributes earlier")
> Suggested-by: Julian Wiedmann <jwi@linux.ibm.com>
> ---
> 
> Notes:
>     Changes in v3:
>     * integrated Julian's feedback of dropping detour through
>       gendev_attr_groups
>     
>     Changes in v2:
>     * integrated Bart's feedback of updating the comment for
>       the gendev_attr_groups declaration to match the code change
>     * in that spirit also adapted the vector size of that field
>     * eliminated the now unnecessary second loop counter 'j'
> 
>  drivers/scsi/scsi_sysfs.c  | 11 +----------
>  include/scsi/scsi_device.h |  6 ------
>  2 files changed, 1 insertion(+), 16 deletions(-)
> 

Looks good to me.

Reviewed-by: Benjamin Block <bblock@linux.ibm.com>

-- 
Best Regards, Benjamin Block  / Linux on IBM Z Kernel Development / IBM Systems
IBM Deutschland Research & Development GmbH    /    https://www.ibm.com/privacy
Vorsitz. AufsR.: Gregor Pillen         /        Geschäftsführung: Dirk Wittkopp
Sitz der Gesellschaft: Böblingen / Registergericht: AmtsG Stuttgart, HRB 243294

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

end of thread, other threads:[~2021-10-29 17:56 UTC | newest]

Thread overview: 14+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
     [not found] <20211012233558.4066756-1-bvanassche@acm.org>
     [not found] ` <163478764102.7011.9375895285870786953.b4-ty@oracle.com>
2021-10-23 20:54   ` Missing driver-specific sysfs attributes of scsi_device [was: Re: [PATCH v4 00/46] Register SCSI sysfs attributes earlier] Steffen Maier
2021-10-24  0:39     ` Steffen Maier
2021-10-24  2:55       ` Bart Van Assche
2021-10-24 11:18       ` [PATCH] scsi: core: Fix early registration of sysfs attributes for scsi_device Steffen Maier
2021-10-24 21:25         ` Bart Van Assche
2021-10-24 22:16           ` [PATCH v2] " Steffen Maier
2021-10-25  9:23             ` Julian Wiedmann
2021-10-25 16:00               ` Bart Van Assche
2021-10-26  1:42               ` [PATCH v3] " Steffen Maier
2021-10-26 10:00                 ` Benjamin Block
2021-10-26 21:48                   ` Bart Van Assche
2021-10-29 17:55                     ` Benjamin Block
2021-10-26 18:31                 ` Bart Van Assche
2021-10-29 17:56                 ` Benjamin Block

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).