[SCSI] 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.

Reviewed-by: Lee Duncan <lduncan@suse.com>
Signed-off-by: Jeff Mahoney <jeffm@suse.com>
Acked-by: Kai Mäkisara <kai.makisara@kolumbus.fi>
Signed-off-by: James Bottomley <JBottomley@Parallels.com>
This commit is contained in:
Jeff Mahoney 2012-08-18 15:20:37 -04:00 committed by James Bottomley
parent 06047689a9
commit af23782bef

View file

@ -84,7 +84,8 @@ static int try_wdio = 1;
static int st_dev_max; static int st_dev_max;
static int st_nr_dev; 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_AUTHOR("Kai Makisara");
MODULE_DESCRIPTION("SCSI tape (st) driver"); MODULE_DESCRIPTION("SCSI tape (st) driver");
@ -4195,7 +4196,7 @@ static int st_probe(struct device *dev)
if (STm->cdevs[j]) { if (STm->cdevs[j]) {
if (cdev == STm->cdevs[j]) if (cdev == STm->cdevs[j])
cdev = NULL; cdev = NULL;
device_destroy(st_sysfs_class, device_destroy(&st_sysfs_class,
MKDEV(SCSI_TAPE_MAJOR, MKDEV(SCSI_TAPE_MAJOR,
TAPE_MINOR(i, mode, j))); TAPE_MINOR(i, mode, j)));
cdev_del(STm->cdevs[j]); cdev_del(STm->cdevs[j]);
@ -4236,7 +4237,7 @@ static int st_remove(struct device *dev)
"tape"); "tape");
for (mode = 0; mode < ST_NBR_MODES; ++mode) { for (mode = 0; mode < ST_NBR_MODES; ++mode) {
for (j=0; j < 2; j++) { for (j=0; j < 2; j++) {
device_destroy(st_sysfs_class, device_destroy(&st_sysfs_class,
MKDEV(SCSI_TAPE_MAJOR, MKDEV(SCSI_TAPE_MAJOR,
TAPE_MINOR(i, mode, j))); TAPE_MINOR(i, mode, j)));
cdev_del(tpnt->modes[mode].cdevs[j]); cdev_del(tpnt->modes[mode].cdevs[j]);
@ -4283,6 +4284,11 @@ static void scsi_tape_release(struct kref *kref)
return; return;
} }
static struct class st_sysfs_class = {
.name = "scsi_tape",
.dev_attrs = st_dev_attrs,
};
static int __init init_st(void) static int __init init_st(void)
{ {
int err; 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", printk(KERN_INFO "st: Version %s, fixed bufsize %d, s/g segs %d\n",
verstr, st_fixed_buffer_size, st_max_sg_segs); verstr, st_fixed_buffer_size, st_max_sg_segs);
st_sysfs_class = class_create(THIS_MODULE, "scsi_tape"); err = class_register(&st_sysfs_class);
if (IS_ERR(st_sysfs_class)) { if (err) {
printk(KERN_ERR "Unable create sysfs class for SCSI tapes\n"); pr_err("Unable register sysfs class for SCSI tapes\n");
return PTR_ERR(st_sysfs_class); return err;
} }
err = register_chrdev_region(MKDEV(SCSI_TAPE_MAJOR, 0), err = register_chrdev_region(MKDEV(SCSI_TAPE_MAJOR, 0),
@ -4322,7 +4328,7 @@ static int __init init_st(void)
unregister_chrdev_region(MKDEV(SCSI_TAPE_MAJOR, 0), unregister_chrdev_region(MKDEV(SCSI_TAPE_MAJOR, 0),
ST_MAX_TAPE_ENTRIES); ST_MAX_TAPE_ENTRIES);
err_class: err_class:
class_destroy(st_sysfs_class); class_unregister(&st_sysfs_class);
return err; return err;
} }
@ -4332,7 +4338,7 @@ static void __exit exit_st(void)
scsi_unregister_driver(&st_template.gendrv); scsi_unregister_driver(&st_template.gendrv);
unregister_chrdev_region(MKDEV(SCSI_TAPE_MAJOR, 0), unregister_chrdev_region(MKDEV(SCSI_TAPE_MAJOR, 0),
ST_MAX_TAPE_ENTRIES); ST_MAX_TAPE_ENTRIES);
class_destroy(st_sysfs_class); class_unregister(&st_sysfs_class);
kfree(scsi_tapes); kfree(scsi_tapes);
printk(KERN_INFO "st: Unloaded.\n"); 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); driver_remove_file(sysfs, &driver_attr_try_direct_io);
} }
/* The sysfs simple class interface */ /* The sysfs simple class interface */
static ssize_t 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); struct st_modedef *STm = dev_get_drvdata(dev);
ssize_t l = 0; ssize_t l = 0;
@ -4417,10 +4422,9 @@ st_defined_show(struct device *dev, struct device_attribute *attr, char *buf)
return l; return l;
} }
DEVICE_ATTR(defined, S_IRUGO, st_defined_show, NULL);
static ssize_t 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); struct st_modedef *STm = dev_get_drvdata(dev);
ssize_t l = 0; ssize_t l = 0;
@ -4429,10 +4433,10 @@ st_defblk_show(struct device *dev, struct device_attribute *attr, char *buf)
return l; return l;
} }
DEVICE_ATTR(default_blksize, S_IRUGO, st_defblk_show, NULL);
static ssize_t 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); struct st_modedef *STm = dev_get_drvdata(dev);
ssize_t l = 0; ssize_t l = 0;
@ -4443,11 +4447,9 @@ st_defdensity_show(struct device *dev, struct device_attribute *attr, char *buf)
return l; return l;
} }
DEVICE_ATTR(default_density, S_IRUGO, st_defdensity_show, NULL);
static ssize_t static ssize_t
st_defcompression_show(struct device *dev, struct device_attribute *attr, default_compression_show(struct device *dev, struct device_attribute *attr,
char *buf) char *buf)
{ {
struct st_modedef *STm = dev_get_drvdata(dev); struct st_modedef *STm = dev_get_drvdata(dev);
ssize_t l = 0; ssize_t l = 0;
@ -4456,10 +4458,8 @@ st_defcompression_show(struct device *dev, struct device_attribute *attr,
return l; return l;
} }
DEVICE_ATTR(default_compression, S_IRUGO, st_defcompression_show, NULL);
static ssize_t 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 st_modedef *STm = dev_get_drvdata(dev);
struct scsi_tape *STp; struct scsi_tape *STp;
@ -4498,7 +4498,14 @@ st_options_show(struct device *dev, struct device_attribute *attr, char *buf)
return l; 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) 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" : "", snprintf(name, 10, "%s%s%s", rew ? "n" : "",
STp->disk->disk_name, st_formats[i]); STp->disk->disk_name, st_formats[i]);
st_class_member = 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, MKDEV(SCSI_TAPE_MAJOR,
TAPE_MINOR(dev_num, mode, rew)), TAPE_MINOR(dev_num, mode, rew)),
&STp->modes[mode], "%s", name); &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; 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) { if (mode == 0 && rew == 0) {
error = sysfs_create_link(&STp->device->sdev_gendev.kobj, error = sysfs_create_link(&STp->device->sdev_gendev.kobj,
&st_class_member->kobj, &st_class_member->kobj,