Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

s390/cio: cleanup cmb_enable sysfs attr

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>

authored by

Sebastian Ott and committed by
Martin Schwidefsky
279b8f9a 3c4aac86

+14 -8
+14 -8
drivers/s390/cio/cmf.c
··· 1171 1171 struct device_attribute *attr, 1172 1172 char *buf) 1173 1173 { 1174 - return sprintf(buf, "%d\n", to_ccwdev(dev)->private->cmb ? 1 : 0); 1174 + struct ccw_device *cdev = to_ccwdev(dev); 1175 + int enabled; 1176 + 1177 + spin_lock_irq(cdev->ccwlock); 1178 + enabled = !!cdev->private->cmb; 1179 + spin_unlock_irq(cdev->ccwlock); 1180 + 1181 + return sprintf(buf, "%d\n", enabled); 1175 1182 } 1176 1183 1177 1184 static ssize_t cmb_enable_store(struct device *dev, 1178 1185 struct device_attribute *attr, const char *buf, 1179 1186 size_t c) 1180 1187 { 1181 - struct ccw_device *cdev; 1182 - int ret; 1188 + struct ccw_device *cdev = to_ccwdev(dev); 1183 1189 unsigned long val; 1190 + int ret; 1184 1191 1185 1192 ret = kstrtoul(buf, 16, &val); 1186 1193 if (ret) 1187 1194 return ret; 1188 - 1189 - cdev = to_ccwdev(dev); 1190 1195 1191 1196 switch (val) { 1192 1197 case 0: ··· 1200 1195 case 1: 1201 1196 ret = enable_cmf(cdev); 1202 1197 break; 1198 + default: 1199 + ret = -EINVAL; 1203 1200 } 1204 1201 1205 - return c; 1202 + return ret ? ret : c; 1206 1203 } 1207 - 1208 - DEVICE_ATTR(cmb_enable, 0644, cmb_enable_show, cmb_enable_store); 1204 + DEVICE_ATTR_RW(cmb_enable); 1209 1205 1210 1206 int ccw_set_cmf(struct ccw_device *cdev, int enable) 1211 1207 {