aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/s390/block/dasd_devmap.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/s390/block/dasd_devmap.c')
-rw-r--r--drivers/s390/block/dasd_devmap.c34
1 files changed, 34 insertions, 0 deletions
diff --git a/drivers/s390/block/dasd_devmap.c b/drivers/s390/block/dasd_devmap.c
index b2b8c18eeced..4d12370337aa 100644
--- a/drivers/s390/block/dasd_devmap.c
+++ b/drivers/s390/block/dasd_devmap.c
@@ -952,6 +952,39 @@ static DEVICE_ATTR(raw_track_access, 0644, dasd_use_raw_show,
952 dasd_use_raw_store); 952 dasd_use_raw_store);
953 953
954static ssize_t 954static ssize_t
955dasd_safe_offline_store(struct device *dev, struct device_attribute *attr,
956 const char *buf, size_t count)
957{
958 struct ccw_device *cdev = to_ccwdev(dev);
959 struct dasd_device *device;
960 int rc;
961
962 device = dasd_device_from_cdev(cdev);
963 if (IS_ERR(device)) {
964 rc = PTR_ERR(device);
965 goto out;
966 }
967
968 if (test_bit(DASD_FLAG_OFFLINE, &device->flags) ||
969 test_bit(DASD_FLAG_SAFE_OFFLINE_RUNNING, &device->flags)) {
970 /* Already doing offline processing */
971 dasd_put_device(device);
972 rc = -EBUSY;
973 goto out;
974 }
975
976 set_bit(DASD_FLAG_SAFE_OFFLINE, &device->flags);
977 dasd_put_device(device);
978
979 rc = ccw_device_set_offline(cdev);
980
981out:
982 return rc ? rc : count;
983}
984
985static DEVICE_ATTR(safe_offline, 0200, NULL, dasd_safe_offline_store);
986
987static ssize_t
955dasd_discipline_show(struct device *dev, struct device_attribute *attr, 988dasd_discipline_show(struct device *dev, struct device_attribute *attr,
956 char *buf) 989 char *buf)
957{ 990{
@@ -1320,6 +1353,7 @@ static struct attribute * dasd_attrs[] = {
1320 &dev_attr_expires.attr, 1353 &dev_attr_expires.attr,
1321 &dev_attr_reservation_policy.attr, 1354 &dev_attr_reservation_policy.attr,
1322 &dev_attr_last_known_reservation_state.attr, 1355 &dev_attr_last_known_reservation_state.attr,
1356 &dev_attr_safe_offline.attr,
1323 NULL, 1357 NULL,
1324}; 1358};
1325 1359