Skip to content

Commit

Permalink
[SCSI] st: Use static class attributes
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Jeff Mahoney authored and James Bottomley committed Sep 14, 2012
1 parent 0604768 commit af23782
Showing 1 changed file with 33 additions and 41 deletions.
74 changes: 33 additions & 41 deletions drivers/scsi/st.c
Original file line number Diff line number Diff line change
Expand Up @@ -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");
Expand Down Expand Up @@ -4195,7 +4196,7 @@ static int st_probe(struct device *dev)
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]);
Expand Down Expand Up @@ -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]);
Expand Down Expand Up @@ -4283,6 +4284,11 @@ static void scsi_tape_release(struct kref *kref)
return;
}

static struct class st_sysfs_class = {
.name = "scsi_tape",
.dev_attrs = st_dev_attrs,
};

static int __init init_st(void)
{
int err;
Expand All @@ -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),
Expand All @@ -4322,7 +4328,7 @@ static int __init init_st(void)
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;
}

Expand All @@ -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");
}
Expand Down Expand Up @@ -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;
Expand All @@ -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;
Expand All @@ -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;
Expand All @@ -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;
Expand All @@ -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;
Expand Down Expand Up @@ -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);
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)
{
Expand All @@ -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);
Expand All @@ -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,
Expand Down

0 comments on commit af23782

Please sign in to comment.