2012-05-17 03:56:23

by Lee Duncan

[permalink] [raw]
Subject: [PATCH 1/5] st: Use static class attributes

st currently sets up and tears down class attributes manually for
every tape drive in the system. This patch uses a statically defined
class with class attributes to let the device core do it for us.

Signed-off-by: Lee Duncan <[email protected]>
---
drivers/scsi/st.c | 74 ++++++++++++++++++++++++-----------------------------
1 file changed, 33 insertions(+), 41 deletions(-)

diff --git a/drivers/scsi/st.c b/drivers/scsi/st.c
index e41998c..532543c 100644
--- a/drivers/scsi/st.c
+++ b/drivers/scsi/st.c
@@ -84,7 +84,8 @@ static int try_wdio = 1;
static int st_dev_max;
static int st_nr_dev;

-static struct class *st_sysfs_class;
+extern struct class st_sysfs_class;
+extern struct device_attribute st_dev_attrs[];

MODULE_AUTHOR("Kai Makisara");
MODULE_DESCRIPTION("SCSI tape (st) driver");
@@ -4195,7 +4196,7 @@ out_free_tape:
if (STm->cdevs[j]) {
if (cdev == STm->cdevs[j])
cdev = NULL;
- device_destroy(st_sysfs_class,
+ device_destroy(&st_sysfs_class,
MKDEV(SCSI_TAPE_MAJOR,
TAPE_MINOR(i, mode, j)));
cdev_del(STm->cdevs[j]);
@@ -4236,7 +4237,7 @@ static int st_remove(struct device *dev)
"tape");
for (mode = 0; mode < ST_NBR_MODES; ++mode) {
for (j=0; j < 2; j++) {
- device_destroy(st_sysfs_class,
+ device_destroy(&st_sysfs_class,
MKDEV(SCSI_TAPE_MAJOR,
TAPE_MINOR(i, mode, j)));
cdev_del(tpnt->modes[mode].cdevs[j]);
@@ -4283,6 +4284,11 @@ static void scsi_tape_release(struct kref *kref)
return;
}

+struct class st_sysfs_class = {
+ .name = "scsi_tape",
+ .dev_attrs = st_dev_attrs,
+};
+
static int __init init_st(void)
{
int err;
@@ -4292,10 +4298,10 @@ static int __init init_st(void)
printk(KERN_INFO "st: Version %s, fixed bufsize %d, s/g segs %d\n",
verstr, st_fixed_buffer_size, st_max_sg_segs);

- st_sysfs_class = class_create(THIS_MODULE, "scsi_tape");
- if (IS_ERR(st_sysfs_class)) {
- printk(KERN_ERR "Unable create sysfs class for SCSI tapes\n");
- return PTR_ERR(st_sysfs_class);
+ err = class_register(&st_sysfs_class);
+ if (err) {
+ printk(KERN_ERR "Unable register sysfs class for SCSI tapes\n");
+ return err;
}

err = register_chrdev_region(MKDEV(SCSI_TAPE_MAJOR, 0),
@@ -4322,7 +4328,7 @@ err_chrdev:
unregister_chrdev_region(MKDEV(SCSI_TAPE_MAJOR, 0),
ST_MAX_TAPE_ENTRIES);
err_class:
- class_destroy(st_sysfs_class);
+ class_unregister(&st_sysfs_class);
return err;
}

@@ -4332,7 +4338,7 @@ static void __exit exit_st(void)
scsi_unregister_driver(&st_template.gendrv);
unregister_chrdev_region(MKDEV(SCSI_TAPE_MAJOR, 0),
ST_MAX_TAPE_ENTRIES);
- class_destroy(st_sysfs_class);
+ class_unregister(&st_sysfs_class);
kfree(scsi_tapes);
printk(KERN_INFO "st: Unloaded.\n");
}
@@ -4405,10 +4411,9 @@ static void do_remove_sysfs_files(void)
driver_remove_file(sysfs, &driver_attr_try_direct_io);
}

-
/* The sysfs simple class interface */
static ssize_t
-st_defined_show(struct device *dev, struct device_attribute *attr, char *buf)
+defined_show(struct device *dev, struct device_attribute *attr, char *buf)
{
struct st_modedef *STm = dev_get_drvdata(dev);
ssize_t l = 0;
@@ -4417,10 +4422,9 @@ st_defined_show(struct device *dev, struct device_attribute *attr, char *buf)
return l;
}

-DEVICE_ATTR(defined, S_IRUGO, st_defined_show, NULL);
-
static ssize_t
-st_defblk_show(struct device *dev, struct device_attribute *attr, char *buf)
+default_blksize_show(struct device *dev, struct device_attribute *attr,
+ char *buf)
{
struct st_modedef *STm = dev_get_drvdata(dev);
ssize_t l = 0;
@@ -4429,10 +4433,10 @@ st_defblk_show(struct device *dev, struct device_attribute *attr, char *buf)
return l;
}

-DEVICE_ATTR(default_blksize, S_IRUGO, st_defblk_show, NULL);

static ssize_t
-st_defdensity_show(struct device *dev, struct device_attribute *attr, char *buf)
+default_density_show(struct device *dev, struct device_attribute *attr,
+ char *buf)
{
struct st_modedef *STm = dev_get_drvdata(dev);
ssize_t l = 0;
@@ -4443,11 +4447,9 @@ st_defdensity_show(struct device *dev, struct device_attribute *attr, char *buf)
return l;
}

-DEVICE_ATTR(default_density, S_IRUGO, st_defdensity_show, NULL);
-
static ssize_t
-st_defcompression_show(struct device *dev, struct device_attribute *attr,
- char *buf)
+default_compression_show(struct device *dev, struct device_attribute *attr,
+ char *buf)
{
struct st_modedef *STm = dev_get_drvdata(dev);
ssize_t l = 0;
@@ -4456,10 +4458,8 @@ st_defcompression_show(struct device *dev, struct device_attribute *attr,
return l;
}

-DEVICE_ATTR(default_compression, S_IRUGO, st_defcompression_show, NULL);
-
static ssize_t
-st_options_show(struct device *dev, struct device_attribute *attr, char *buf)
+options_show(struct device *dev, struct device_attribute *attr, char *buf)
{
struct st_modedef *STm = dev_get_drvdata(dev);
struct scsi_tape *STp;
@@ -4498,7 +4498,14 @@ st_options_show(struct device *dev, struct device_attribute *attr, char *buf)
return l;
}

-DEVICE_ATTR(options, S_IRUGO, st_options_show, NULL);
+struct device_attribute st_dev_attrs[] = {
+ __ATTR_RO(defined),
+ __ATTR_RO(default_blksize),
+ __ATTR_RO(default_density),
+ __ATTR_RO(default_compression),
+ __ATTR_RO(options),
+ __ATTR_NULL,
+};

static int do_create_class_files(struct scsi_tape *STp, int dev_num, int mode)
{
@@ -4513,7 +4520,8 @@ static int do_create_class_files(struct scsi_tape *STp, int dev_num, int mode)
snprintf(name, 10, "%s%s%s", rew ? "n" : "",
STp->disk->disk_name, st_formats[i]);
st_class_member =
- device_create(st_sysfs_class, &STp->device->sdev_gendev,
+ device_create(&st_sysfs_class,
+ &STp->device->sdev_gendev,
MKDEV(SCSI_TAPE_MAJOR,
TAPE_MINOR(dev_num, mode, rew)),
&STp->modes[mode], "%s", name);
@@ -4524,22 +4532,6 @@ static int do_create_class_files(struct scsi_tape *STp, int dev_num, int mode)
goto out;
}

- error = device_create_file(st_class_member,
- &dev_attr_defined);
- if (error) goto out;
- error = device_create_file(st_class_member,
- &dev_attr_default_blksize);
- if (error) goto out;
- error = device_create_file(st_class_member,
- &dev_attr_default_density);
- if (error) goto out;
- error = device_create_file(st_class_member,
- &dev_attr_default_compression);
- if (error) goto out;
- error = device_create_file(st_class_member,
- &dev_attr_options);
- if (error) goto out;
-
if (mode == 0 && rew == 0) {
error = sysfs_create_link(&STp->device->sdev_gendev.kobj,
&st_class_member->kobj,
--
1.7.9.2


2012-05-17 04:02:00

by Lee Duncan

[permalink] [raw]
Subject: Re: [PATCH 1/5] st: Use static class attributes

Sorry. This is actually

Signed-off-by: Jeff Mahoney <[email protected]>
Reviewed-by: Lee Duncan <[email protected]>

Apologies. The other patches in the set are labeled correctly.

On 05/16/2012 08:56 PM, Lee Duncan wrote:
> st currently sets up and tears down class attributes manually for
> every tape drive in the system. This patch uses a statically defined
> class with class attributes to let the device core do it for us.
>
> Signed-off-by: Lee Duncan <[email protected]>
> ---
> drivers/scsi/st.c | 74 ++++++++++++++++++++++++-----------------------------
> 1 file changed, 33 insertions(+), 41 deletions(-)
>
> diff --git a/drivers/scsi/st.c b/drivers/scsi/st.c
> index e41998c..532543c 100644
> --- a/drivers/scsi/st.c
> +++ b/drivers/scsi/st.c
> @@ -84,7 +84,8 @@ static int try_wdio = 1;
> static int st_dev_max;
> static int st_nr_dev;
>
> -static struct class *st_sysfs_class;
> +extern struct class st_sysfs_class;
> +extern struct device_attribute st_dev_attrs[];
>
> MODULE_AUTHOR("Kai Makisara");
> MODULE_DESCRIPTION("SCSI tape (st) driver");
> @@ -4195,7 +4196,7 @@ out_free_tape:
> if (STm->cdevs[j]) {
> if (cdev == STm->cdevs[j])
> cdev = NULL;
> - device_destroy(st_sysfs_class,
> + device_destroy(&st_sysfs_class,
> MKDEV(SCSI_TAPE_MAJOR,
> TAPE_MINOR(i, mode, j)));
> cdev_del(STm->cdevs[j]);
> @@ -4236,7 +4237,7 @@ static int st_remove(struct device *dev)
> "tape");
> for (mode = 0; mode < ST_NBR_MODES; ++mode) {
> for (j=0; j < 2; j++) {
> - device_destroy(st_sysfs_class,
> + device_destroy(&st_sysfs_class,
> MKDEV(SCSI_TAPE_MAJOR,
> TAPE_MINOR(i, mode, j)));
> cdev_del(tpnt->modes[mode].cdevs[j]);
> @@ -4283,6 +4284,11 @@ static void scsi_tape_release(struct kref *kref)
> return;
> }
>
> +struct class st_sysfs_class = {
> + .name = "scsi_tape",
> + .dev_attrs = st_dev_attrs,
> +};
> +
> static int __init init_st(void)
> {
> int err;
> @@ -4292,10 +4298,10 @@ static int __init init_st(void)
> printk(KERN_INFO "st: Version %s, fixed bufsize %d, s/g segs %d\n",
> verstr, st_fixed_buffer_size, st_max_sg_segs);
>
> - st_sysfs_class = class_create(THIS_MODULE, "scsi_tape");
> - if (IS_ERR(st_sysfs_class)) {
> - printk(KERN_ERR "Unable create sysfs class for SCSI tapes\n");
> - return PTR_ERR(st_sysfs_class);
> + err = class_register(&st_sysfs_class);
> + if (err) {
> + printk(KERN_ERR "Unable register sysfs class for SCSI tapes\n");
> + return err;
> }
>
> err = register_chrdev_region(MKDEV(SCSI_TAPE_MAJOR, 0),
> @@ -4322,7 +4328,7 @@ err_chrdev:
> unregister_chrdev_region(MKDEV(SCSI_TAPE_MAJOR, 0),
> ST_MAX_TAPE_ENTRIES);
> err_class:
> - class_destroy(st_sysfs_class);
> + class_unregister(&st_sysfs_class);
> return err;
> }
>
> @@ -4332,7 +4338,7 @@ static void __exit exit_st(void)
> scsi_unregister_driver(&st_template.gendrv);
> unregister_chrdev_region(MKDEV(SCSI_TAPE_MAJOR, 0),
> ST_MAX_TAPE_ENTRIES);
> - class_destroy(st_sysfs_class);
> + class_unregister(&st_sysfs_class);
> kfree(scsi_tapes);
> printk(KERN_INFO "st: Unloaded.\n");
> }
> @@ -4405,10 +4411,9 @@ static void do_remove_sysfs_files(void)
> driver_remove_file(sysfs, &driver_attr_try_direct_io);
> }
>
> -
> /* The sysfs simple class interface */
> static ssize_t
> -st_defined_show(struct device *dev, struct device_attribute *attr, char *buf)
> +defined_show(struct device *dev, struct device_attribute *attr, char *buf)
> {
> struct st_modedef *STm = dev_get_drvdata(dev);
> ssize_t l = 0;
> @@ -4417,10 +4422,9 @@ st_defined_show(struct device *dev, struct device_attribute *attr, char *buf)
> return l;
> }
>
> -DEVICE_ATTR(defined, S_IRUGO, st_defined_show, NULL);
> -
> static ssize_t
> -st_defblk_show(struct device *dev, struct device_attribute *attr, char *buf)
> +default_blksize_show(struct device *dev, struct device_attribute *attr,
> + char *buf)
> {
> struct st_modedef *STm = dev_get_drvdata(dev);
> ssize_t l = 0;
> @@ -4429,10 +4433,10 @@ st_defblk_show(struct device *dev, struct device_attribute *attr, char *buf)
> return l;
> }
>
> -DEVICE_ATTR(default_blksize, S_IRUGO, st_defblk_show, NULL);
>
> static ssize_t
> -st_defdensity_show(struct device *dev, struct device_attribute *attr, char *buf)
> +default_density_show(struct device *dev, struct device_attribute *attr,
> + char *buf)
> {
> struct st_modedef *STm = dev_get_drvdata(dev);
> ssize_t l = 0;
> @@ -4443,11 +4447,9 @@ st_defdensity_show(struct device *dev, struct device_attribute *attr, char *buf)
> return l;
> }
>
> -DEVICE_ATTR(default_density, S_IRUGO, st_defdensity_show, NULL);
> -
> static ssize_t
> -st_defcompression_show(struct device *dev, struct device_attribute *attr,
> - char *buf)
> +default_compression_show(struct device *dev, struct device_attribute *attr,
> + char *buf)
> {
> struct st_modedef *STm = dev_get_drvdata(dev);
> ssize_t l = 0;
> @@ -4456,10 +4458,8 @@ st_defcompression_show(struct device *dev, struct device_attribute *attr,
> return l;
> }
>
> -DEVICE_ATTR(default_compression, S_IRUGO, st_defcompression_show, NULL);
> -
> static ssize_t
> -st_options_show(struct device *dev, struct device_attribute *attr, char *buf)
> +options_show(struct device *dev, struct device_attribute *attr, char *buf)
> {
> struct st_modedef *STm = dev_get_drvdata(dev);
> struct scsi_tape *STp;
> @@ -4498,7 +4498,14 @@ st_options_show(struct device *dev, struct device_attribute *attr, char *buf)
> return l;
> }
>
> -DEVICE_ATTR(options, S_IRUGO, st_options_show, NULL);
> +struct device_attribute st_dev_attrs[] = {
> + __ATTR_RO(defined),
> + __ATTR_RO(default_blksize),
> + __ATTR_RO(default_density),
> + __ATTR_RO(default_compression),
> + __ATTR_RO(options),
> + __ATTR_NULL,
> +};
>
> static int do_create_class_files(struct scsi_tape *STp, int dev_num, int mode)
> {
> @@ -4513,7 +4520,8 @@ static int do_create_class_files(struct scsi_tape *STp, int dev_num, int mode)
> snprintf(name, 10, "%s%s%s", rew ? "n" : "",
> STp->disk->disk_name, st_formats[i]);
> st_class_member =
> - device_create(st_sysfs_class, &STp->device->sdev_gendev,
> + device_create(&st_sysfs_class,
> + &STp->device->sdev_gendev,
> MKDEV(SCSI_TAPE_MAJOR,
> TAPE_MINOR(dev_num, mode, rew)),
> &STp->modes[mode], "%s", name);
> @@ -4524,22 +4532,6 @@ static int do_create_class_files(struct scsi_tape *STp, int dev_num, int mode)
> goto out;
> }
>
> - error = device_create_file(st_class_member,
> - &dev_attr_defined);
> - if (error) goto out;
> - error = device_create_file(st_class_member,
> - &dev_attr_default_blksize);
> - if (error) goto out;
> - error = device_create_file(st_class_member,
> - &dev_attr_default_density);
> - if (error) goto out;
> - error = device_create_file(st_class_member,
> - &dev_attr_default_compression);
> - if (error) goto out;
> - error = device_create_file(st_class_member,
> - &dev_attr_options);
> - if (error) goto out;
> -
> if (mode == 0 && rew == 0) {
> error = sysfs_create_link(&STp->device->sdev_gendev.kobj,
> &st_class_member->kobj,

--
Lee Duncan
SUSE Labs

2012-05-17 07:32:54

by James Bottomley

[permalink] [raw]
Subject: Re: [PATCH 1/5] st: Use static class attributes

On Wed, 2012-05-16 at 21:01 -0700, Lee Duncan wrote:
> Sorry. This is actually
>
> Signed-off-by: Jeff Mahoney <[email protected]>
> Reviewed-by: Lee Duncan <[email protected]>
>
> Apologies. The other patches in the set are labeled correctly.

Actually, no, in this case, I need a From: field at the top as well for
the author.

You obviously used git to generate them, so either

git show --pretty=email

or

git format-patch -k

Will produce the right form

James

2012-05-17 15:27:30

by Lee Duncan

[permalink] [raw]
Subject: Re: [PATCH 1/5] st: Use static class attributes

Thanks. I will resend.

On 05/17/2012 12:32 AM, James Bottomley wrote:
> On Wed, 2012-05-16 at 21:01 -0700, Lee Duncan wrote:
>> Sorry. This is actually
>>
>> Signed-off-by: Jeff Mahoney <[email protected]>
>> Reviewed-by: Lee Duncan <[email protected]>
>>
>> Apologies. The other patches in the set are labeled correctly.
>
> Actually, no, in this case, I need a From: field at the top as well for
> the author.
>
> You obviously used git to generate them, so either
>
> git show --pretty=email
>
> or
>
> git format-patch -k
>
> Will produce the right form
>
> James
>
>
> .

--
Lee Duncan
SUSE Labs

2012-05-18 02:51:49

by Matthew Wilcox

[permalink] [raw]
Subject: Re: [PATCH 1/5] st: Use static class attributes

On Wed, May 16, 2012 at 08:56:13PM -0700, Lee Duncan wrote:
> @@ -84,7 +84,8 @@ static int try_wdio = 1;
> static int st_dev_max;
> static int st_nr_dev;
>
> -static struct class *st_sysfs_class;
> +extern struct class st_sysfs_class;

Umm ... 'extern' ...

> @@ -4283,6 +4284,11 @@ static void scsi_tape_release(struct kref *kref)
> return;
> }
>
> +struct class st_sysfs_class = {
> + .name = "scsi_tape",
> + .dev_attrs = st_dev_attrs,
> +};

... and then you define it?

I think you meant to say "struct class st_sysfs_class;" at the top,
and then later:

static struct class st_sysfs_class = {
...

> +struct device_attribute st_dev_attrs[] = {

Should also be static


--
Matthew Wilcox Intel Open Source Technology Centre
"Bill, look, we understand that you're interested in selling us this
operating system, but compare it to ours. We can't possibly take such
a retrograde step."

2012-05-21 23:05:03

by Lee Duncan

[permalink] [raw]
Subject: Re: [PATCH 1/5] st: Use static class attributes

Jeff would normally reply to this, since it is his patch, but he is
otherwise occupied right now, so I will respond.

On 05/17/2012 07:51 PM, Matthew Wilcox wrote:
> On Wed, May 16, 2012 at 08:56:13PM -0700, Lee Duncan wrote:
>> @@ -84,7 +84,8 @@ static int try_wdio = 1;
>> static int st_dev_max;
>> static int st_nr_dev;
>>
>> -static struct class *st_sysfs_class;
>> +extern struct class st_sysfs_class;
>
> Umm ... 'extern' ...
>
>> @@ -4283,6 +4284,11 @@ static void scsi_tape_release(struct kref *kref)
>> return;
>> }
>>
>> +struct class st_sysfs_class = {
>> + .name = "scsi_tape",
>> + .dev_attrs = st_dev_attrs,
>> +};
>
> ... and then you define it?
>
> I think you meant to say "struct class st_sysfs_class;" at the top,
> and then later:
>
> static struct class st_sysfs_class = {
> ...
>
>> +struct device_attribute st_dev_attrs[] = {
>
> Should also be static
>
>

The compiler (gcc 4.6.2) does not accept a forward declaration that does
not match the data definition. When I tried your suggestion, the
compiler complained that the two declarations did not match, but it
accepted it if both the forward declaration and the data declaration are
"static".

I'll resubmit v3 of the patch set with this change.
--
Lee Duncan
SUSE Labs