diff mbox series

[04/14] sd: rename the scsi_disk.dev field

Message ID 20220304160331.399757-5-hch@lst.de (mailing list archive)
State New, archived
Headers show
Series [01/14] blk-mq: do not include passthrough requests in I/O accounting | expand

Commit Message

Christoph Hellwig March 4, 2022, 4:03 p.m. UTC
dev is very hard to grab for.  Give the field a more descriptive name and
documents it's purpose.

Signed-off-by: Christoph Hellwig <hch@lst.de>
---
 drivers/scsi/sd.c | 22 +++++++++++-----------
 drivers/scsi/sd.h | 10 ++++++++--
 2 files changed, 19 insertions(+), 13 deletions(-)

Comments

Bart Van Assche March 6, 2022, 1:38 a.m. UTC | #1
On 3/4/22 08:03, Christoph Hellwig wrote:
> +	/*
> +	 * This device is mostly just used to show a bunch of attributes in a
> +	 * weird place.  In doubt don't add any new users, and most importantly
> +	 * don't use if for any actual refcounting.
> +	 */
> +	struct device	disk_dev;

Isn't "weird place" subjective? How about mentioning the sysfs path explicitly 
(/sys/class/scsi_disk/H:C:I:L)? How about explaining why no new sysfs 
attributes should be added to that device instance?

Thanks,

Bart.
Ming Lei March 6, 2022, 3:31 a.m. UTC | #2
On Fri, Mar 04, 2022 at 05:03:21PM +0100, Christoph Hellwig wrote:
> dev is very hard to grab for.  Give the field a more descriptive name and
> documents it's purpose.
> 
> Signed-off-by: Christoph Hellwig <hch@lst.de>
> ---
>  drivers/scsi/sd.c | 22 +++++++++++-----------
>  drivers/scsi/sd.h | 10 ++++++++--
>  2 files changed, 19 insertions(+), 13 deletions(-)
> 
> diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c
> index 2a1e19e871d30..7479e7cb36b43 100644
> --- a/drivers/scsi/sd.c
> +++ b/drivers/scsi/sd.c
> @@ -672,7 +672,7 @@ static struct scsi_disk *scsi_disk_get(struct gendisk *disk)
>  	if (disk->private_data) {
>  		sdkp = scsi_disk(disk);
>  		if (scsi_device_get(sdkp->device) == 0)
> -			get_device(&sdkp->dev);
> +			get_device(&sdkp->disk_dev);
>  		else
>  			sdkp = NULL;
>  	}
> @@ -685,7 +685,7 @@ static void scsi_disk_put(struct scsi_disk *sdkp)
>  	struct scsi_device *sdev = sdkp->device;
>  
>  	mutex_lock(&sd_ref_mutex);
> -	put_device(&sdkp->dev);
> +	put_device(&sdkp->disk_dev);
>  	scsi_device_put(sdev);
>  	mutex_unlock(&sd_ref_mutex);
>  }
> @@ -3529,14 +3529,14 @@ static int sd_probe(struct device *dev)
>  					     SD_MOD_TIMEOUT);
>  	}
>  
> -	device_initialize(&sdkp->dev);
> -	sdkp->dev.parent = get_device(dev);
> -	sdkp->dev.class = &sd_disk_class;
> -	dev_set_name(&sdkp->dev, "%s", dev_name(dev));
> +	device_initialize(&sdkp->disk_dev);
> +	sdkp->disk_dev.parent = get_device(dev);
> +	sdkp->disk_dev.class = &sd_disk_class;
> +	dev_set_name(&sdkp->disk_dev, "%s", dev_name(dev));
>  
> -	error = device_add(&sdkp->dev);
> +	error = device_add(&sdkp->disk_dev);
>  	if (error) {
> -		put_device(&sdkp->dev);
> +		put_device(&sdkp->disk_dev);
>  		goto out;
>  	}
>  
> @@ -3577,7 +3577,7 @@ static int sd_probe(struct device *dev)
>  
>  	error = device_add_disk(dev, gd, NULL);
>  	if (error) {
> -		put_device(&sdkp->dev);
> +		put_device(&sdkp->disk_dev);
>  		goto out;
>  	}
>  
> @@ -3628,7 +3628,7 @@ static int sd_remove(struct device *dev)
>  	sdkp = dev_get_drvdata(dev);
>  	scsi_autopm_get_device(sdkp->device);
>  
> -	device_del(&sdkp->dev);
> +	device_del(&sdkp->disk_dev);
>  	del_gendisk(sdkp->disk);
>  	sd_shutdown(dev);
>  
> @@ -3636,7 +3636,7 @@ static int sd_remove(struct device *dev)
>  
>  	mutex_lock(&sd_ref_mutex);
>  	dev_set_drvdata(dev, NULL);
> -	put_device(&sdkp->dev);
> +	put_device(&sdkp->disk_dev);
>  	mutex_unlock(&sd_ref_mutex);
>  
>  	return 0;
> diff --git a/drivers/scsi/sd.h b/drivers/scsi/sd.h
> index 303aa1c23aefb..7625a90b0fa69 100644
> --- a/drivers/scsi/sd.h
> +++ b/drivers/scsi/sd.h
> @@ -69,7 +69,13 @@ enum {
>  
>  struct scsi_disk {
>  	struct scsi_device *device;
> -	struct device	dev;
> +
> +	/*
> +	 * This device is mostly just used to show a bunch of attributes in a
> +	 * weird place.  In doubt don't add any new users, and most importantly
> +	 * don't use if for any actual refcounting.
> +	 */

The device looks partner of gendisk, I think it could just be a
private data of gendisk, and the attributes can be added to gendisk.

But scsi has the tradition of adding class device of scsi_host,
scsi_device, scsi_disk and scsi_generic.

Adding such device makes things complicated, such as refcounting
in open/close disk. But looks scsi_disk isn't part of sysfs ABI, maybe it
can be removed, anyway:

Reviewed-by: Ming Lei <ming.lei@redhat.com>


Thanks,
Ming
Christoph Hellwig March 6, 2022, 8:40 a.m. UTC | #3
On Sat, Mar 05, 2022 at 05:38:40PM -0800, Bart Van Assche wrote:
> On 3/4/22 08:03, Christoph Hellwig wrote:
>> +	/*
>> +	 * This device is mostly just used to show a bunch of attributes in a
>> +	 * weird place.  In doubt don't add any new users, and most importantly
>> +	 * don't use if for any actual refcounting.
>> +	 */
>> +	struct device	disk_dev;
>
> Isn't "weird place" subjective? How about mentioning the sysfs path 
> explicitly (/sys/class/scsi_disk/H:C:I:L)? How about explaining why no new 
> sysfs attributes should be added to that device instance?

Well, weird place means that all normale drivers would just use
attributes on the gendisk for it, but sd creates a completely pointless
device under the gendisk device for it.  If you have a better wording
I can change it.
Christoph Hellwig March 6, 2022, 8:43 a.m. UTC | #4
On Sun, Mar 06, 2022 at 11:31:33AM +0800, Ming Lei wrote:
> The device looks partner of gendisk, I think it could just be a
> private data of gendisk, and the attributes can be added to gendisk.

Yes, that would be the normal way to do it.

> 
> But scsi has the tradition of adding class device of scsi_host,
> scsi_device, scsi_disk and scsi_generic.
> 
> Adding such device makes things complicated, such as refcounting
> in open/close disk. But looks scsi_disk isn't part of sysfs ABI, maybe it
> can be removed, anyway:

Unfortunatly it is in a major way:

root@testvm:~# ls /sys/class/scsi_disk/0\:0\:0\:0
FUA	       manage_start_stop	   protection_mode    uevent
allow_restart  max_medium_access_timeouts  protection_type    zeroing_mode
app_tag_own    max_retries		   provisioning_mode  zoned_cap
cache_type     max_write_same_blocks	   subsystem
device	       power			   thin_provisioning
Bart Van Assche March 6, 2022, 8:34 p.m. UTC | #5
On 3/6/22 00:40, Christoph Hellwig wrote:
> On Sat, Mar 05, 2022 at 05:38:40PM -0800, Bart Van Assche wrote:
>> On 3/4/22 08:03, Christoph Hellwig wrote:
>>> +	/*
>>> +	 * This device is mostly just used to show a bunch of attributes in a
>>> +	 * weird place.  In doubt don't add any new users, and most importantly
>>> +	 * don't use if for any actual refcounting.
>>> +	 */
>>> +	struct device	disk_dev;
>>
>> Isn't "weird place" subjective? How about mentioning the sysfs path
>> explicitly (/sys/class/scsi_disk/H:C:I:L)? How about explaining why no new
>> sysfs attributes should be added to that device instance?
> 
> Well, weird place means that all normale drivers would just use
> attributes on the gendisk for it, but sd creates a completely pointless
> device under the gendisk device for it.  If you have a better wording
> I can change it.

It's not that important. I wish it would be possible to get rid of this 
struct device instance. I think this instance was introduced in 2006 by 
patch "[SCSI] allow displaying and setting of cache type via sysfs".

Reviewed-by: Bart Van Assche <bvanassche@acm.org>
Chaitanya Kulkarni March 7, 2022, 3:16 a.m. UTC | #6
On 3/4/22 08:03, Christoph Hellwig wrote:
> dev is very hard to grab for.  Give the field a more descriptive name and
> documents it's purpose.
> 
> Signed-off-by: Christoph Hellwig <hch@lst.de>
> ---


Looks good.

Reviewed-by: Chaitanya Kulkarni <kch@nvidia.com>
Martin K. Petersen March 8, 2022, 3:25 a.m. UTC | #7
Christoph,

> dev is very hard to grab for.

grep?

> Give the field a more descriptive name and documents it's purpose.

its

> +
> +	/*
> +	 * This device is mostly just used to show a bunch of attributes in a
> +	 * weird place.  In doubt don't add any new users, and most importantly
> +	 * don't use if for any actual refcounting.
> +	 */
> +	struct device	disk_dev;

I agree with Bart that this should be more explicit about the
/sys/class/scsi_disk location. Otherwise it is not clear which device
the comment refers to.

Otherwise OK.

Acked-by: Martin K. Petersen <martin.petersen@oracle.com>
diff mbox series

Patch

diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c
index 2a1e19e871d30..7479e7cb36b43 100644
--- a/drivers/scsi/sd.c
+++ b/drivers/scsi/sd.c
@@ -672,7 +672,7 @@  static struct scsi_disk *scsi_disk_get(struct gendisk *disk)
 	if (disk->private_data) {
 		sdkp = scsi_disk(disk);
 		if (scsi_device_get(sdkp->device) == 0)
-			get_device(&sdkp->dev);
+			get_device(&sdkp->disk_dev);
 		else
 			sdkp = NULL;
 	}
@@ -685,7 +685,7 @@  static void scsi_disk_put(struct scsi_disk *sdkp)
 	struct scsi_device *sdev = sdkp->device;
 
 	mutex_lock(&sd_ref_mutex);
-	put_device(&sdkp->dev);
+	put_device(&sdkp->disk_dev);
 	scsi_device_put(sdev);
 	mutex_unlock(&sd_ref_mutex);
 }
@@ -3529,14 +3529,14 @@  static int sd_probe(struct device *dev)
 					     SD_MOD_TIMEOUT);
 	}
 
-	device_initialize(&sdkp->dev);
-	sdkp->dev.parent = get_device(dev);
-	sdkp->dev.class = &sd_disk_class;
-	dev_set_name(&sdkp->dev, "%s", dev_name(dev));
+	device_initialize(&sdkp->disk_dev);
+	sdkp->disk_dev.parent = get_device(dev);
+	sdkp->disk_dev.class = &sd_disk_class;
+	dev_set_name(&sdkp->disk_dev, "%s", dev_name(dev));
 
-	error = device_add(&sdkp->dev);
+	error = device_add(&sdkp->disk_dev);
 	if (error) {
-		put_device(&sdkp->dev);
+		put_device(&sdkp->disk_dev);
 		goto out;
 	}
 
@@ -3577,7 +3577,7 @@  static int sd_probe(struct device *dev)
 
 	error = device_add_disk(dev, gd, NULL);
 	if (error) {
-		put_device(&sdkp->dev);
+		put_device(&sdkp->disk_dev);
 		goto out;
 	}
 
@@ -3628,7 +3628,7 @@  static int sd_remove(struct device *dev)
 	sdkp = dev_get_drvdata(dev);
 	scsi_autopm_get_device(sdkp->device);
 
-	device_del(&sdkp->dev);
+	device_del(&sdkp->disk_dev);
 	del_gendisk(sdkp->disk);
 	sd_shutdown(dev);
 
@@ -3636,7 +3636,7 @@  static int sd_remove(struct device *dev)
 
 	mutex_lock(&sd_ref_mutex);
 	dev_set_drvdata(dev, NULL);
-	put_device(&sdkp->dev);
+	put_device(&sdkp->disk_dev);
 	mutex_unlock(&sd_ref_mutex);
 
 	return 0;
diff --git a/drivers/scsi/sd.h b/drivers/scsi/sd.h
index 303aa1c23aefb..7625a90b0fa69 100644
--- a/drivers/scsi/sd.h
+++ b/drivers/scsi/sd.h
@@ -69,7 +69,13 @@  enum {
 
 struct scsi_disk {
 	struct scsi_device *device;
-	struct device	dev;
+
+	/*
+	 * This device is mostly just used to show a bunch of attributes in a
+	 * weird place.  In doubt don't add any new users, and most importantly
+	 * don't use if for any actual refcounting.
+	 */
+	struct device	disk_dev;
 	struct gendisk	*disk;
 	struct opal_dev *opal_dev;
 #ifdef CONFIG_BLK_DEV_ZONED
@@ -126,7 +132,7 @@  struct scsi_disk {
 	unsigned	security : 1;
 	unsigned	ignore_medium_access_errors : 1;
 };
-#define to_scsi_disk(obj) container_of(obj,struct scsi_disk,dev)
+#define to_scsi_disk(obj) container_of(obj, struct scsi_disk, disk_dev)
 
 static inline struct scsi_disk *scsi_disk(struct gendisk *disk)
 {