s390/cio: cleanup cmb_enable sysfs attr
authorSebastian Ott <sebott@linux.vnet.ibm.com>
Mon, 7 Sep 2015 17:50:25 +0000 (19:50 +0200)
committerMartin Schwidefsky <schwidefsky@de.ibm.com>
Wed, 14 Oct 2015 12:32:02 +0000 (14:32 +0200)
Ensure that we hold the ccwlock when accessing private data. Return errors
that occur during measurement enabling to userspace. Apply some cleanups
while at it.

Signed-off-by: Sebastian Ott <sebott@linux.vnet.ibm.com>
Reviewed-by: Cornelia Huck <cornelia.huck@de.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
drivers/s390/cio/cmf.c

index 23054f8fa9fc2ef8735caed6bdf4d53dc557cf9e..3543c486dcdc4dd50c68f0d532ce003abca98f46 100644 (file)
@@ -1171,23 +1171,28 @@ static ssize_t cmb_enable_show(struct device *dev,
                               struct device_attribute *attr,
                               char *buf)
 {
-       return sprintf(buf, "%d\n", to_ccwdev(dev)->private->cmb ? 1 : 0);
+       struct ccw_device *cdev = to_ccwdev(dev);
+       int enabled;
+
+       spin_lock_irq(cdev->ccwlock);
+       enabled = !!cdev->private->cmb;
+       spin_unlock_irq(cdev->ccwlock);
+
+       return sprintf(buf, "%d\n", enabled);
 }
 
 static ssize_t cmb_enable_store(struct device *dev,
                                struct device_attribute *attr, const char *buf,
                                size_t c)
 {
-       struct ccw_device *cdev;
-       int ret;
+       struct ccw_device *cdev = to_ccwdev(dev);
        unsigned long val;
+       int ret;
 
        ret = kstrtoul(buf, 16, &val);
        if (ret)
                return ret;
 
-       cdev = to_ccwdev(dev);
-
        switch (val) {
        case 0:
                ret = disable_cmf(cdev);
@@ -1195,12 +1200,13 @@ static ssize_t cmb_enable_store(struct device *dev,
        case 1:
                ret = enable_cmf(cdev);
                break;
+       default:
+               ret = -EINVAL;
        }
 
-       return c;
+       return ret ? ret : c;
 }
-
-DEVICE_ATTR(cmb_enable, 0644, cmb_enable_show, cmb_enable_store);
+DEVICE_ATTR_RW(cmb_enable);
 
 int ccw_set_cmf(struct ccw_device *cdev, int enable)
 {