]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/scsi/st.c
Merge branch 'core/rodata' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux...
[linux-2.6-omap-h63xx.git] / drivers / scsi / st.c
index df83bea2c62029fff5d13122c3d7e9059ca76ad8..4684cc716aa4033575b7738ded7ca3196cadd850 100644 (file)
@@ -38,6 +38,7 @@ static const char *verstr = "20080224";
 #include <linux/cdev.h>
 #include <linux/delay.h>
 #include <linux/mutex.h>
+#include <linux/smp_lock.h>
 
 #include <asm/uaccess.h>
 #include <asm/dma.h>
@@ -1113,7 +1114,7 @@ static int check_tape(struct scsi_tape *STp, struct file *filp)
 }
 
 
-\f/* Open the device. Needs to be called with BKL only because of incrementing the SCSI host
+\f/* Open the device. Needs to take the BKL only because of incrementing the SCSI host
    module count. */
 static int st_open(struct inode *inode, struct file *filp)
 {
@@ -1123,6 +1124,7 @@ static int st_open(struct inode *inode, struct file *filp)
        int dev = TAPE_NR(inode);
        char *name;
 
+       lock_kernel();
        /*
         * We really want to do nonseekable_open(inode, filp); here, but some
         * versions of tar incorrectly call lseek on tapes and bail out if that
@@ -1130,8 +1132,10 @@ static int st_open(struct inode *inode, struct file *filp)
         */
        filp->f_mode &= ~(FMODE_PREAD | FMODE_PWRITE);
 
-       if (!(STp = scsi_tape_get(dev)))
+       if (!(STp = scsi_tape_get(dev))) {
+               unlock_kernel();
                return -ENXIO;
+       }
 
        write_lock(&st_dev_arr_lock);
        filp->private_data = STp;
@@ -1140,6 +1144,7 @@ static int st_open(struct inode *inode, struct file *filp)
        if (STp->in_use) {
                write_unlock(&st_dev_arr_lock);
                scsi_tape_put(STp);
+               unlock_kernel();
                DEB( printk(ST_DEB_MSG "%s: Device already in use.\n", name); )
                return (-EBUSY);
        }
@@ -1188,12 +1193,14 @@ static int st_open(struct inode *inode, struct file *filp)
                        retval = (-EIO);
                goto err_out;
        }
+       unlock_kernel();
        return 0;
 
  err_out:
        normalize_buffer(STp->buffer);
        STp->in_use = 0;
        scsi_tape_put(STp);
+       unlock_kernel();
        return retval;
 
 }
@@ -4108,9 +4115,9 @@ out_free_tape:
                        if (STm->cdevs[j]) {
                                if (cdev == STm->cdevs[j])
                                        cdev = NULL;
-                               class_device_destroy(st_sysfs_class,
-                                                    MKDEV(SCSI_TAPE_MAJOR,
-                                                          TAPE_MINOR(i, mode, j)));
+                                       device_destroy(st_sysfs_class,
+                                                      MKDEV(SCSI_TAPE_MAJOR,
+                                                            TAPE_MINOR(i, mode, j)));
                                cdev_del(STm->cdevs[j]);
                        }
                }
@@ -4148,9 +4155,9 @@ static int st_remove(struct device *dev)
                                          "tape");
                        for (mode = 0; mode < ST_NBR_MODES; ++mode) {
                                for (j=0; j < 2; j++) {
-                                       class_device_destroy(st_sysfs_class,
-                                                            MKDEV(SCSI_TAPE_MAJOR,
-                                                                  TAPE_MINOR(i, mode, j)));
+                                       device_destroy(st_sysfs_class,
+                                                      MKDEV(SCSI_TAPE_MAJOR,
+                                                            TAPE_MINOR(i, mode, j)));
                                        cdev_del(tpnt->modes[mode].cdevs[j]);
                                        tpnt->modes[mode].cdevs[j] = NULL;
                                }
@@ -4319,31 +4326,34 @@ static void do_remove_sysfs_files(void)
 
 
 /* The sysfs simple class interface */
-static ssize_t st_defined_show(struct class_device *class_dev, char *buf)
+static ssize_t
+st_defined_show(struct device *dev, struct device_attribute *attr, char *buf)
 {
-       struct st_modedef *STm = (struct st_modedef *)class_get_devdata(class_dev);
+       struct st_modedef *STm = dev_get_drvdata(dev);
        ssize_t l = 0;
 
        l = snprintf(buf, PAGE_SIZE, "%d\n", STm->defined);
        return l;
 }
 
-CLASS_DEVICE_ATTR(defined, S_IRUGO, st_defined_show, NULL);
+DEVICE_ATTR(defined, S_IRUGO, st_defined_show, NULL);
 
-static ssize_t st_defblk_show(struct class_device *class_dev, char *buf)
+static ssize_t
+st_defblk_show(struct device *dev, struct device_attribute *attr, char *buf)
 {
-       struct st_modedef *STm = (struct st_modedef *)class_get_devdata(class_dev);
+       struct st_modedef *STm = dev_get_drvdata(dev);
        ssize_t l = 0;
 
        l = snprintf(buf, PAGE_SIZE, "%d\n", STm->default_blksize);
        return l;
 }
 
-CLASS_DEVICE_ATTR(default_blksize, S_IRUGO, st_defblk_show, NULL);
+DEVICE_ATTR(default_blksize, S_IRUGO, st_defblk_show, NULL);
 
-static ssize_t st_defdensity_show(struct class_device *class_dev, char *buf)
+static ssize_t
+st_defdensity_show(struct device *dev, struct device_attribute *attr, char *buf)
 {
-       struct st_modedef *STm = (struct st_modedef *)class_get_devdata(class_dev);
+       struct st_modedef *STm = dev_get_drvdata(dev);
        ssize_t l = 0;
        char *fmt;
 
@@ -4352,22 +4362,25 @@ static ssize_t st_defdensity_show(struct class_device *class_dev, char *buf)
        return l;
 }
 
-CLASS_DEVICE_ATTR(default_density, S_IRUGO, st_defdensity_show, NULL);
+DEVICE_ATTR(default_density, S_IRUGO, st_defdensity_show, NULL);
 
-static ssize_t st_defcompression_show(struct class_device *class_dev, char *buf)
+static ssize_t
+st_defcompression_show(struct device *dev, struct device_attribute *attr,
+                      char *buf)
 {
-       struct st_modedef *STm = (struct st_modedef *)class_get_devdata(class_dev);
+       struct st_modedef *STm = dev_get_drvdata(dev);
        ssize_t l = 0;
 
        l = snprintf(buf, PAGE_SIZE, "%d\n", STm->default_compression - 1);
        return l;
 }
 
-CLASS_DEVICE_ATTR(default_compression, S_IRUGO, st_defcompression_show, NULL);
+DEVICE_ATTR(default_compression, S_IRUGO, st_defcompression_show, NULL);
 
-static ssize_t st_options_show(struct class_device *class_dev, char *buf)
+static ssize_t
+st_options_show(struct device *dev, struct device_attribute *attr, char *buf)
 {
-       struct st_modedef *STm = (struct st_modedef *)class_get_devdata(class_dev);
+       struct st_modedef *STm = dev_get_drvdata(dev);
        struct scsi_tape *STp;
        int i, j, options;
        ssize_t l = 0;
@@ -4403,13 +4416,13 @@ static ssize_t st_options_show(struct class_device *class_dev, char *buf)
        return l;
 }
 
-CLASS_DEVICE_ATTR(options, S_IRUGO, st_options_show, NULL);
+DEVICE_ATTR(options, S_IRUGO, st_options_show, NULL);
 
 static int do_create_class_files(struct scsi_tape *STp, int dev_num, int mode)
 {
        int i, rew, error;
        char name[10];
-       struct class_device *st_class_member;
+       struct device *st_class_member;
 
        for (rew=0; rew < 2; rew++) {
                /* Make sure that the minor numbers corresponding to the four
@@ -4418,32 +4431,34 @@ 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 =
-                       class_device_create(st_sysfs_class, NULL,
-                                           MKDEV(SCSI_TAPE_MAJOR,
-                                                 TAPE_MINOR(dev_num, mode, rew)),
-                                           &STp->device->sdev_gendev, "%s", name);
+                       device_create_drvdata(st_sysfs_class,
+                                             &STp->device->sdev_gendev,
+                                             MKDEV(SCSI_TAPE_MAJOR,
+                                                   TAPE_MINOR(dev_num,
+                                                             mode, rew)),
+                                             &STp->modes[mode],
+                                             "%s", name);
                if (IS_ERR(st_class_member)) {
-                       printk(KERN_WARNING "st%d: class_device_create failed\n",
+                       printk(KERN_WARNING "st%d: device_create failed\n",
                               dev_num);
                        error = PTR_ERR(st_class_member);
                        goto out;
                }
-               class_set_devdata(st_class_member, &STp->modes[mode]);
 
-               error = class_device_create_file(st_class_member,
-                                              &class_device_attr_defined);
+               error = device_create_file(st_class_member,
+                                          &dev_attr_defined);
                if (error) goto out;
-               error = class_device_create_file(st_class_member,
-                                           &class_device_attr_default_blksize);
+               error = device_create_file(st_class_member,
+                                          &dev_attr_default_blksize);
                if (error) goto out;
-               error = class_device_create_file(st_class_member,
-                                           &class_device_attr_default_density);
+               error = device_create_file(st_class_member,
+                                          &dev_attr_default_density);
                if (error) goto out;
-               error = class_device_create_file(st_class_member,
-                                       &class_device_attr_default_compression);
+               error = device_create_file(st_class_member,
+                                          &dev_attr_default_compression);
                if (error) goto out;
-               error = class_device_create_file(st_class_member,
-                                       &class_device_attr_options);
+               error = device_create_file(st_class_member,
+                                          &dev_attr_options);
                if (error) goto out;
 
                if (mode == 0 && rew == 0) {