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. Reviewed-by: Lee Duncan <lduncan@xxxxxxxx> Signed-off-by: Jeff Mahoney <jeffm@xxxxxxxx> --- drivers/scsi/st.c | 74 ++++++++++++++++++++++++------------------------------ 1 file changed, 33 insertions(+), 41 deletions(-) --- 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; +static struct class st_sysfs_class; +static 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 kre return; } +static 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) { + pr_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, stru 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, struc 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, s 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 *de 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, stru return l; } -DEVICE_ATTR(options, S_IRUGO, st_options_show, NULL); +static 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 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 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, -- To unsubscribe from this list: send the line "unsubscribe linux-scsi" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html