st: Use static class attributes
Subsystems (2)
Thanks. I will resend.
Quoted 25 lines · James Bottomley
Quoted 6 lines · Lee Duncan
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
.
Signature · 2 lines
Lee Duncan SUSE Labs
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.
--- drivers/scsi/st.c | 74 ++++++++++++++++++++++++----------------------------- 1 file changed, 33 insertions(+), 41 deletions(-)
drivers/scsi/st.c +33 -41
@@ -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,
Signature · 1 line
1.7.9.2
Sorry. This is actually
Apologies. The other patches in the set are labeled correctly.
Quoted 199 lines · Lee Duncan
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(-)drivers/scsi/st.c +33
-41@@ -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,
Signature · 2 lines
Lee Duncan SUSE Labs
James Bottomley
maintainerQuoted 6 lines · Lee Duncan
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
drivers/scsi/st.c static int try_wdio = 1; · line 87
Quoted 6 lines · Lee Duncan
drivers/scsi/st.c +1
-1@@ -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' ...
drivers/scsi/st.c static void scsi_tape_release(struct kref *kref) · line 4290
Quoted 8 lines
drivers/scsi/st.c +4
-0@@ -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 = {
...
drivers/scsi/st.c st_options_show(struct device *dev, struct device_attribute *attr, char *buf) · line 4501
Quoted 1 line
drivers/scsi/st.c +1
-0+struct device_attribute st_dev_attrs[] = {
Should also be static
Signature · 4 lines
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."
Jeff would normally reply to this, since it is his patch, but he is otherwise occupied right now, so I will respond.
Quoted 24 lines · Matthew Wilcox
drivers/scsi/st.c static int try_wdio = 1; · line 87
Quoted 6 lines · Lee Duncan
drivers/scsi/st.c +1
-1@@ -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' ...
drivers/scsi/st.c static void scsi_tape_release(struct kref *kref) · line 4290
Quoted 8 lines
drivers/scsi/st.c +4
-0@@ -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:
Quoted 8 lines
static struct class
st_sysfs_class= {
...drivers/scsi/st.c st_options_show(struct device *dev, struct device_attribute *attr, char *buf) · line 4501
Quoted 1 line
drivers/scsi/st.c +1
-0+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.
Signature · 2 lines
Lee Duncan SUSE Labs