static ssize_t dasd_ff_store(struct device *dev, struct device_attribute *attr,
              const char *buf, size_t count)
 {
-       struct dasd_devmap *devmap;
        unsigned int val;
-
-       devmap = dasd_devmap_from_cdev(to_ccwdev(dev));
-       if (IS_ERR(devmap))
-               return PTR_ERR(devmap);
+       int rc;
 
        if (kstrtouint(buf, 0, &val) || val > 1)
                return -EINVAL;
 
-       spin_lock(&dasd_devmap_lock);
-       if (val)
-               devmap->features |= DASD_FEATURE_FAILFAST;
-       else
-               devmap->features &= ~DASD_FEATURE_FAILFAST;
-       if (devmap->device)
-               devmap->device->features = devmap->features;
-       spin_unlock(&dasd_devmap_lock);
-       return count;
+       rc = dasd_set_feature(to_ccwdev(dev), DASD_FEATURE_FAILFAST, val);
+
+       return rc ? : count;
 }
 
 static DEVICE_ATTR(failfast, 0644, dasd_ff_show, dasd_ff_store);
 dasd_ro_store(struct device *dev, struct device_attribute *attr,
              const char *buf, size_t count)
 {
-       struct dasd_devmap *devmap;
+       struct ccw_device *cdev = to_ccwdev(dev);
        struct dasd_device *device;
        unsigned int val;
-
-       devmap = dasd_devmap_from_cdev(to_ccwdev(dev));
-       if (IS_ERR(devmap))
-               return PTR_ERR(devmap);
+       int rc;
 
        if (kstrtouint(buf, 0, &val) || val > 1)
                return -EINVAL;
 
-       spin_lock(&dasd_devmap_lock);
-       if (val)
-               devmap->features |= DASD_FEATURE_READONLY;
-       else
-               devmap->features &= ~DASD_FEATURE_READONLY;
-       device = devmap->device;
-       if (device) {
-               device->features = devmap->features;
-               val = val || test_bit(DASD_FLAG_DEVICE_RO, &device->flags);
-       }
-       spin_unlock(&dasd_devmap_lock);
-       if (device && device->block && device->block->gdp)
+       rc = dasd_set_feature(cdev, DASD_FEATURE_READONLY, val);
+       if (rc)
+               return rc;
+
+       device = dasd_device_from_cdev(cdev);
+       if (IS_ERR(device))
+               return PTR_ERR(device);
+
+       val = val || test_bit(DASD_FLAG_DEVICE_RO, &device->flags);
+       if (device->block && device->block->gdp)
                set_disk_ro(device->block->gdp, val);
+
+       dasd_put_device(device);
+
        return count;
 }
 
 dasd_erplog_store(struct device *dev, struct device_attribute *attr,
              const char *buf, size_t count)
 {
-       struct dasd_devmap *devmap;
        unsigned int val;
-
-       devmap = dasd_devmap_from_cdev(to_ccwdev(dev));
-       if (IS_ERR(devmap))
-               return PTR_ERR(devmap);
+       int rc;
 
        if (kstrtouint(buf, 0, &val) || val > 1)
                return -EINVAL;
 
-       spin_lock(&dasd_devmap_lock);
-       if (val)
-               devmap->features |= DASD_FEATURE_ERPLOG;
-       else
-               devmap->features &= ~DASD_FEATURE_ERPLOG;
-       if (devmap->device)
-               devmap->device->features = devmap->features;
-       spin_unlock(&dasd_devmap_lock);
-       return count;
+       rc = dasd_set_feature(to_ccwdev(dev), DASD_FEATURE_ERPLOG, val);
+
+       return rc ? : count;
 }
 
 static DEVICE_ATTR(erplog, 0644, dasd_erplog_show, dasd_erplog_store);
                                             struct device_attribute *attr,
                                             const char *buf, size_t count)
 {
-       struct dasd_devmap *devmap;
+       struct ccw_device *cdev = to_ccwdev(dev);
        int rc;
 
-       devmap = dasd_devmap_from_cdev(to_ccwdev(dev));
-       if (IS_ERR(devmap))
-               return PTR_ERR(devmap);
-       rc = 0;
-       spin_lock(&dasd_devmap_lock);
        if (sysfs_streq("ignore", buf))
-               devmap->features &= ~DASD_FEATURE_FAILONSLCK;
+               rc = dasd_set_feature(cdev, DASD_FEATURE_FAILONSLCK, 0);
        else if (sysfs_streq("fail", buf))
-               devmap->features |= DASD_FEATURE_FAILONSLCK;
+               rc = dasd_set_feature(cdev, DASD_FEATURE_FAILONSLCK, 1);
        else
                rc = -EINVAL;
-       if (devmap->device)
-               devmap->device->features = devmap->features;
-       spin_unlock(&dasd_devmap_lock);
-       if (rc)
-               return rc;
-       else
-               return count;
+
+       return rc ? : count;
 }
 
 static DEVICE_ATTR(reservation_policy, 0644,
 {
        struct dasd_devmap *devmap;
 
-       devmap = dasd_find_busid(dev_name(&cdev->dev));
+       devmap = dasd_devmap_from_cdev(cdev);
        if (IS_ERR(devmap))
                return PTR_ERR(devmap);