- patches.fixes/patch-2.6.11-rc1: 2.6.11-rc1.
[linux-flexiantxendom0-3.2.10.git] / drivers / s390 / block / dasd_devmap.c
index 4a1a4ed..0dea49d 100644 (file)
@@ -11,7 +11,7 @@
  * functions may not be called from interrupt context. In particular
  * dasd_get_device is a no-no from interrupt context.
  *
- * $Revision: 1.34 $
+ * $Revision: 1.37 $
  */
 
 #include <linux/config.h>
@@ -70,7 +70,6 @@ int dasd_autodetect = 0;      /* is true, when autodetection is active */
  * strings when running as a module.
  */
 static char *dasd[256];
-
 /*
  * Single spinlock to protect devmap structures and lists.
  */
@@ -485,7 +484,8 @@ dasd_devmap_from_cdev(struct ccw_device *cdev)
 
        devmap = dasd_find_busid(cdev->dev.bus_id);
        if (IS_ERR(devmap))
-               devmap = dasd_add_busid(cdev->dev.bus_id, DASD_FEATURE_DEFAULT);
+               devmap = dasd_add_busid(cdev->dev.bus_id,
+                                       DASD_FEATURE_DEFAULT);
        return devmap;
 }
 
@@ -553,6 +553,8 @@ dasd_delete_device(struct dasd_device *device)
 
        /* First remove device pointer from devmap. */
        devmap = dasd_find_busid(device->cdev->dev.bus_id);
+       if (IS_ERR(devmap))
+               BUG();
        spin_lock(&dasd_devmap_lock);
        if (devmap->device != device) {
                spin_unlock(&dasd_devmap_lock);
@@ -626,8 +628,8 @@ dasd_ro_show(struct device *dev, char *buf)
        struct dasd_devmap *devmap;
        int ro_flag;
 
-       devmap = dev->driver_data;
-       if (devmap)
+       devmap = dasd_find_busid(dev->bus_id);
+       if (!IS_ERR(devmap))
                ro_flag = (devmap->features & DASD_FEATURE_READONLY) != 0;
        else
                ro_flag = (DASD_FEATURE_DEFAULT & DASD_FEATURE_READONLY) != 0;
@@ -641,6 +643,8 @@ dasd_ro_store(struct device *dev, const char *buf, size_t count)
        int ro_flag;
 
        devmap = dasd_devmap_from_cdev(to_ccwdev(dev));
+       if (IS_ERR(devmap))
+               return PTR_ERR(devmap);
        ro_flag = buf[0] == '1';
        spin_lock(&dasd_devmap_lock);
        if (ro_flag)
@@ -665,15 +669,14 @@ static DEVICE_ATTR(readonly, 0644, dasd_ro_show, dasd_ro_store);
  * use_diag controls whether the driver should use diag rather than ssch
  * to talk to the device
  */
-/* TODO: Implement */
 static ssize_t 
 dasd_use_diag_show(struct device *dev, char *buf)
 {
        struct dasd_devmap *devmap;
        int use_diag;
 
-       devmap = dev->driver_data;
-       if (devmap)
+       devmap = dasd_find_busid(dev->bus_id);
+       if (!IS_ERR(devmap))
                use_diag = (devmap->features & DASD_FEATURE_USEDIAG) != 0;
        else
                use_diag = (DASD_FEATURE_DEFAULT & DASD_FEATURE_USEDIAG) != 0;
@@ -684,21 +687,25 @@ static ssize_t
 dasd_use_diag_store(struct device *dev, const char *buf, size_t count)
 {
        struct dasd_devmap *devmap;
+       ssize_t rc;
        int use_diag;
 
        devmap = dasd_devmap_from_cdev(to_ccwdev(dev));
+       if (IS_ERR(devmap))
+               return PTR_ERR(devmap);
        use_diag = buf[0] == '1';
        spin_lock(&dasd_devmap_lock);
        /* Changing diag discipline flag is only allowed in offline state. */
+       rc = count;
        if (!devmap->device) {
                if (use_diag)
                        devmap->features |= DASD_FEATURE_USEDIAG;
                else
                        devmap->features &= ~DASD_FEATURE_USEDIAG;
        } else
-               count = -EPERM;
+               rc = -EPERM;
        spin_unlock(&dasd_devmap_lock);
-       return count;
+       return rc;
 }
 
 static