0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013 #define KMSG_COMPONENT "dasd"
0014
0015 #include <linux/interrupt.h>
0016 #include <linux/compat.h>
0017 #include <linux/major.h>
0018 #include <linux/fs.h>
0019 #include <linux/blkpg.h>
0020 #include <linux/slab.h>
0021 #include <asm/ccwdev.h>
0022 #include <asm/schid.h>
0023 #include <asm/cmb.h>
0024 #include <linux/uaccess.h>
0025 #include <linux/dasd_mod.h>
0026
0027
0028 #define PRINTK_HEADER "dasd_ioctl:"
0029
0030 #include "dasd_int.h"
0031
0032
0033 static int
0034 dasd_ioctl_api_version(void __user *argp)
0035 {
0036 int ver = DASD_API_VERSION;
0037 return put_user(ver, (int __user *)argp);
0038 }
0039
0040
0041
0042
0043
0044 static int
0045 dasd_ioctl_enable(struct block_device *bdev)
0046 {
0047 struct dasd_device *base;
0048
0049 if (!capable(CAP_SYS_ADMIN))
0050 return -EACCES;
0051
0052 base = dasd_device_from_gendisk(bdev->bd_disk);
0053 if (!base)
0054 return -ENODEV;
0055
0056 dasd_enable_device(base);
0057 dasd_put_device(base);
0058 return 0;
0059 }
0060
0061
0062
0063
0064
0065 static int
0066 dasd_ioctl_disable(struct block_device *bdev)
0067 {
0068 struct dasd_device *base;
0069
0070 if (!capable(CAP_SYS_ADMIN))
0071 return -EACCES;
0072
0073 base = dasd_device_from_gendisk(bdev->bd_disk);
0074 if (!base)
0075 return -ENODEV;
0076
0077
0078
0079
0080
0081
0082
0083
0084 dasd_set_target_state(base, DASD_STATE_BASIC);
0085
0086
0087
0088
0089 set_capacity(bdev->bd_disk, 0);
0090 dasd_put_device(base);
0091 return 0;
0092 }
0093
0094
0095
0096
0097 static int dasd_ioctl_quiesce(struct dasd_block *block)
0098 {
0099 unsigned long flags;
0100 struct dasd_device *base;
0101
0102 base = block->base;
0103 if (!capable (CAP_SYS_ADMIN))
0104 return -EACCES;
0105
0106 pr_info("%s: The DASD has been put in the quiesce "
0107 "state\n", dev_name(&base->cdev->dev));
0108 spin_lock_irqsave(get_ccwdev_lock(base->cdev), flags);
0109 dasd_device_set_stop_bits(base, DASD_STOPPED_QUIESCE);
0110 spin_unlock_irqrestore(get_ccwdev_lock(base->cdev), flags);
0111 return 0;
0112 }
0113
0114
0115
0116
0117
0118 static int dasd_ioctl_resume(struct dasd_block *block)
0119 {
0120 unsigned long flags;
0121 struct dasd_device *base;
0122
0123 base = block->base;
0124 if (!capable (CAP_SYS_ADMIN))
0125 return -EACCES;
0126
0127 pr_info("%s: I/O operations have been resumed "
0128 "on the DASD\n", dev_name(&base->cdev->dev));
0129 spin_lock_irqsave(get_ccwdev_lock(base->cdev), flags);
0130 dasd_device_remove_stop_bits(base, DASD_STOPPED_QUIESCE);
0131 spin_unlock_irqrestore(get_ccwdev_lock(base->cdev), flags);
0132
0133 dasd_schedule_block_bh(block);
0134 return 0;
0135 }
0136
0137
0138
0139
0140 static int dasd_ioctl_abortio(struct dasd_block *block)
0141 {
0142 unsigned long flags;
0143 struct dasd_device *base;
0144 struct dasd_ccw_req *cqr, *n;
0145
0146 base = block->base;
0147 if (!capable(CAP_SYS_ADMIN))
0148 return -EACCES;
0149
0150 if (test_and_set_bit(DASD_FLAG_ABORTALL, &base->flags))
0151 return 0;
0152 DBF_DEV_EVENT(DBF_NOTICE, base, "%s", "abortall flag set");
0153
0154 spin_lock_irqsave(&block->request_queue_lock, flags);
0155 spin_lock(&block->queue_lock);
0156 list_for_each_entry_safe(cqr, n, &block->ccw_queue, blocklist) {
0157 if (test_bit(DASD_CQR_FLAGS_FAILFAST, &cqr->flags) &&
0158 cqr->callback_data &&
0159 cqr->callback_data != DASD_SLEEPON_START_TAG &&
0160 cqr->callback_data != DASD_SLEEPON_END_TAG) {
0161 spin_unlock(&block->queue_lock);
0162 blk_abort_request(cqr->callback_data);
0163 spin_lock(&block->queue_lock);
0164 }
0165 }
0166 spin_unlock(&block->queue_lock);
0167 spin_unlock_irqrestore(&block->request_queue_lock, flags);
0168
0169 dasd_schedule_block_bh(block);
0170 return 0;
0171 }
0172
0173
0174
0175
0176 static int dasd_ioctl_allowio(struct dasd_block *block)
0177 {
0178 struct dasd_device *base;
0179
0180 base = block->base;
0181 if (!capable(CAP_SYS_ADMIN))
0182 return -EACCES;
0183
0184 if (test_and_clear_bit(DASD_FLAG_ABORTALL, &base->flags))
0185 DBF_DEV_EVENT(DBF_NOTICE, base, "%s", "abortall flag unset");
0186
0187 return 0;
0188 }
0189
0190
0191
0192
0193
0194
0195
0196 static int
0197 dasd_format(struct dasd_block *block, struct format_data_t *fdata)
0198 {
0199 struct dasd_device *base;
0200 int rc;
0201
0202 base = block->base;
0203 if (base->discipline->format_device == NULL)
0204 return -EPERM;
0205
0206 if (base->state != DASD_STATE_BASIC) {
0207 pr_warn("%s: The DASD cannot be formatted while it is enabled\n",
0208 dev_name(&base->cdev->dev));
0209 return -EBUSY;
0210 }
0211
0212 DBF_DEV_EVENT(DBF_NOTICE, base,
0213 "formatting units %u to %u (%u B blocks) flags %u",
0214 fdata->start_unit,
0215 fdata->stop_unit, fdata->blksize, fdata->intensity);
0216
0217
0218
0219
0220
0221
0222 if (fdata->start_unit == 0) {
0223 block->gdp->part0->bd_inode->i_blkbits =
0224 blksize_bits(fdata->blksize);
0225 }
0226
0227 rc = base->discipline->format_device(base, fdata, 1);
0228 if (rc == -EAGAIN)
0229 rc = base->discipline->format_device(base, fdata, 0);
0230
0231 return rc;
0232 }
0233
0234 static int dasd_check_format(struct dasd_block *block,
0235 struct format_check_t *cdata)
0236 {
0237 struct dasd_device *base;
0238 int rc;
0239
0240 base = block->base;
0241 if (!base->discipline->check_device_format)
0242 return -ENOTTY;
0243
0244 rc = base->discipline->check_device_format(base, cdata, 1);
0245 if (rc == -EAGAIN)
0246 rc = base->discipline->check_device_format(base, cdata, 0);
0247
0248 return rc;
0249 }
0250
0251
0252
0253
0254 static int
0255 dasd_ioctl_format(struct block_device *bdev, void __user *argp)
0256 {
0257 struct dasd_device *base;
0258 struct format_data_t fdata;
0259 int rc;
0260
0261 if (!capable(CAP_SYS_ADMIN))
0262 return -EACCES;
0263 if (!argp)
0264 return -EINVAL;
0265 base = dasd_device_from_gendisk(bdev->bd_disk);
0266 if (!base)
0267 return -ENODEV;
0268 if (base->features & DASD_FEATURE_READONLY ||
0269 test_bit(DASD_FLAG_DEVICE_RO, &base->flags)) {
0270 dasd_put_device(base);
0271 return -EROFS;
0272 }
0273 if (copy_from_user(&fdata, argp, sizeof(struct format_data_t))) {
0274 dasd_put_device(base);
0275 return -EFAULT;
0276 }
0277 if (bdev_is_partition(bdev)) {
0278 pr_warn("%s: The specified DASD is a partition and cannot be formatted\n",
0279 dev_name(&base->cdev->dev));
0280 dasd_put_device(base);
0281 return -EINVAL;
0282 }
0283 rc = dasd_format(base->block, &fdata);
0284 dasd_put_device(base);
0285
0286 return rc;
0287 }
0288
0289
0290
0291
0292 static int dasd_ioctl_check_format(struct block_device *bdev, void __user *argp)
0293 {
0294 struct format_check_t cdata;
0295 struct dasd_device *base;
0296 int rc = 0;
0297
0298 if (!argp)
0299 return -EINVAL;
0300
0301 base = dasd_device_from_gendisk(bdev->bd_disk);
0302 if (!base)
0303 return -ENODEV;
0304 if (bdev_is_partition(bdev)) {
0305 pr_warn("%s: The specified DASD is a partition and cannot be checked\n",
0306 dev_name(&base->cdev->dev));
0307 rc = -EINVAL;
0308 goto out_err;
0309 }
0310
0311 if (copy_from_user(&cdata, argp, sizeof(cdata))) {
0312 rc = -EFAULT;
0313 goto out_err;
0314 }
0315
0316 rc = dasd_check_format(base->block, &cdata);
0317 if (rc)
0318 goto out_err;
0319
0320 if (copy_to_user(argp, &cdata, sizeof(cdata)))
0321 rc = -EFAULT;
0322
0323 out_err:
0324 dasd_put_device(base);
0325
0326 return rc;
0327 }
0328
0329 static int dasd_release_space(struct dasd_device *device,
0330 struct format_data_t *rdata)
0331 {
0332 if (!device->discipline->is_ese && !device->discipline->is_ese(device))
0333 return -ENOTSUPP;
0334 if (!device->discipline->release_space)
0335 return -ENOTSUPP;
0336
0337 return device->discipline->release_space(device, rdata);
0338 }
0339
0340
0341
0342
0343 static int dasd_ioctl_release_space(struct block_device *bdev, void __user *argp)
0344 {
0345 struct format_data_t rdata;
0346 struct dasd_device *base;
0347 int rc = 0;
0348
0349 if (!capable(CAP_SYS_ADMIN))
0350 return -EACCES;
0351 if (!argp)
0352 return -EINVAL;
0353
0354 base = dasd_device_from_gendisk(bdev->bd_disk);
0355 if (!base)
0356 return -ENODEV;
0357 if (base->features & DASD_FEATURE_READONLY ||
0358 test_bit(DASD_FLAG_DEVICE_RO, &base->flags)) {
0359 rc = -EROFS;
0360 goto out_err;
0361 }
0362 if (bdev_is_partition(bdev)) {
0363 pr_warn("%s: The specified DASD is a partition and tracks cannot be released\n",
0364 dev_name(&base->cdev->dev));
0365 rc = -EINVAL;
0366 goto out_err;
0367 }
0368
0369 if (copy_from_user(&rdata, argp, sizeof(rdata))) {
0370 rc = -EFAULT;
0371 goto out_err;
0372 }
0373
0374 rc = dasd_release_space(base, &rdata);
0375
0376 out_err:
0377 dasd_put_device(base);
0378
0379 return rc;
0380 }
0381
0382 #ifdef CONFIG_DASD_PROFILE
0383
0384
0385
0386 static int dasd_ioctl_reset_profile(struct dasd_block *block)
0387 {
0388 dasd_profile_reset(&block->profile);
0389 return 0;
0390 }
0391
0392
0393
0394
0395 static int dasd_ioctl_read_profile(struct dasd_block *block, void __user *argp)
0396 {
0397 struct dasd_profile_info_t *data;
0398 int rc = 0;
0399
0400 data = kmalloc(sizeof(*data), GFP_KERNEL);
0401 if (!data)
0402 return -ENOMEM;
0403
0404 spin_lock_bh(&block->profile.lock);
0405 if (block->profile.data) {
0406 data->dasd_io_reqs = block->profile.data->dasd_io_reqs;
0407 data->dasd_io_sects = block->profile.data->dasd_io_sects;
0408 memcpy(data->dasd_io_secs, block->profile.data->dasd_io_secs,
0409 sizeof(data->dasd_io_secs));
0410 memcpy(data->dasd_io_times, block->profile.data->dasd_io_times,
0411 sizeof(data->dasd_io_times));
0412 memcpy(data->dasd_io_timps, block->profile.data->dasd_io_timps,
0413 sizeof(data->dasd_io_timps));
0414 memcpy(data->dasd_io_time1, block->profile.data->dasd_io_time1,
0415 sizeof(data->dasd_io_time1));
0416 memcpy(data->dasd_io_time2, block->profile.data->dasd_io_time2,
0417 sizeof(data->dasd_io_time2));
0418 memcpy(data->dasd_io_time2ps,
0419 block->profile.data->dasd_io_time2ps,
0420 sizeof(data->dasd_io_time2ps));
0421 memcpy(data->dasd_io_time3, block->profile.data->dasd_io_time3,
0422 sizeof(data->dasd_io_time3));
0423 memcpy(data->dasd_io_nr_req,
0424 block->profile.data->dasd_io_nr_req,
0425 sizeof(data->dasd_io_nr_req));
0426 spin_unlock_bh(&block->profile.lock);
0427 } else {
0428 spin_unlock_bh(&block->profile.lock);
0429 rc = -EIO;
0430 goto out;
0431 }
0432 if (copy_to_user(argp, data, sizeof(*data)))
0433 rc = -EFAULT;
0434 out:
0435 kfree(data);
0436 return rc;
0437 }
0438 #else
0439 static int dasd_ioctl_reset_profile(struct dasd_block *block)
0440 {
0441 return -ENOTTY;
0442 }
0443
0444 static int dasd_ioctl_read_profile(struct dasd_block *block, void __user *argp)
0445 {
0446 return -ENOTTY;
0447 }
0448 #endif
0449
0450
0451
0452
0453 static int __dasd_ioctl_information(struct dasd_block *block,
0454 struct dasd_information2_t *dasd_info)
0455 {
0456 struct subchannel_id sch_id;
0457 struct ccw_dev_id dev_id;
0458 struct dasd_device *base;
0459 struct ccw_device *cdev;
0460 struct list_head *l;
0461 unsigned long flags;
0462 int rc;
0463
0464 base = block->base;
0465 if (!base->discipline || !base->discipline->fill_info)
0466 return -EINVAL;
0467
0468 rc = base->discipline->fill_info(base, dasd_info);
0469 if (rc)
0470 return rc;
0471
0472 cdev = base->cdev;
0473 ccw_device_get_id(cdev, &dev_id);
0474 ccw_device_get_schid(cdev, &sch_id);
0475
0476 dasd_info->devno = dev_id.devno;
0477 dasd_info->schid = sch_id.sch_no;
0478 dasd_info->cu_type = cdev->id.cu_type;
0479 dasd_info->cu_model = cdev->id.cu_model;
0480 dasd_info->dev_type = cdev->id.dev_type;
0481 dasd_info->dev_model = cdev->id.dev_model;
0482 dasd_info->status = base->state;
0483
0484
0485
0486
0487
0488 dasd_info->open_count = atomic_read(&block->open_count);
0489 if (!block->bdev)
0490 dasd_info->open_count++;
0491
0492
0493
0494
0495
0496 if ((base->state < DASD_STATE_READY) ||
0497 (dasd_check_blocksize(block->bp_block)))
0498 dasd_info->format = DASD_FORMAT_NONE;
0499
0500 dasd_info->features |=
0501 ((base->features & DASD_FEATURE_READONLY) != 0);
0502
0503 memcpy(dasd_info->type, base->discipline->name, 4);
0504
0505 spin_lock_irqsave(&block->queue_lock, flags);
0506 list_for_each(l, &base->ccw_queue)
0507 dasd_info->chanq_len++;
0508 spin_unlock_irqrestore(&block->queue_lock, flags);
0509 return 0;
0510 }
0511
0512 static int dasd_ioctl_information(struct dasd_block *block, void __user *argp,
0513 size_t copy_size)
0514 {
0515 struct dasd_information2_t *dasd_info;
0516 int error;
0517
0518 dasd_info = kzalloc(sizeof(*dasd_info), GFP_KERNEL);
0519 if (!dasd_info)
0520 return -ENOMEM;
0521
0522 error = __dasd_ioctl_information(block, dasd_info);
0523 if (!error && copy_to_user(argp, dasd_info, copy_size))
0524 error = -EFAULT;
0525 kfree(dasd_info);
0526 return error;
0527 }
0528
0529
0530
0531
0532 int dasd_set_read_only(struct block_device *bdev, bool ro)
0533 {
0534 struct dasd_device *base;
0535 int rc;
0536
0537
0538 if (bdev_is_partition(bdev))
0539 return 0;
0540
0541 base = dasd_device_from_gendisk(bdev->bd_disk);
0542 if (!base)
0543 return -ENODEV;
0544 if (!ro && test_bit(DASD_FLAG_DEVICE_RO, &base->flags))
0545 rc = -EROFS;
0546 else
0547 rc = dasd_set_feature(base->cdev, DASD_FEATURE_READONLY, ro);
0548 dasd_put_device(base);
0549 return rc;
0550 }
0551
0552 static int dasd_ioctl_readall_cmb(struct dasd_block *block, unsigned int cmd,
0553 struct cmbdata __user *argp)
0554 {
0555 size_t size = _IOC_SIZE(cmd);
0556 struct cmbdata data;
0557 int ret;
0558
0559 ret = cmf_readall(block->base->cdev, &data);
0560 if (!ret && copy_to_user(argp, &data, min(size, sizeof(*argp))))
0561 return -EFAULT;
0562 return ret;
0563 }
0564
0565 int dasd_ioctl(struct block_device *bdev, fmode_t mode,
0566 unsigned int cmd, unsigned long arg)
0567 {
0568 struct dasd_block *block;
0569 struct dasd_device *base;
0570 void __user *argp;
0571 int rc;
0572
0573 if (is_compat_task())
0574 argp = compat_ptr(arg);
0575 else
0576 argp = (void __user *)arg;
0577
0578 if ((_IOC_DIR(cmd) != _IOC_NONE) && !arg)
0579 return -EINVAL;
0580
0581 base = dasd_device_from_gendisk(bdev->bd_disk);
0582 if (!base)
0583 return -ENODEV;
0584 block = base->block;
0585 rc = 0;
0586 switch (cmd) {
0587 case BIODASDDISABLE:
0588 rc = dasd_ioctl_disable(bdev);
0589 break;
0590 case BIODASDENABLE:
0591 rc = dasd_ioctl_enable(bdev);
0592 break;
0593 case BIODASDQUIESCE:
0594 rc = dasd_ioctl_quiesce(block);
0595 break;
0596 case BIODASDRESUME:
0597 rc = dasd_ioctl_resume(block);
0598 break;
0599 case BIODASDABORTIO:
0600 rc = dasd_ioctl_abortio(block);
0601 break;
0602 case BIODASDALLOWIO:
0603 rc = dasd_ioctl_allowio(block);
0604 break;
0605 case BIODASDFMT:
0606 rc = dasd_ioctl_format(bdev, argp);
0607 break;
0608 case BIODASDCHECKFMT:
0609 rc = dasd_ioctl_check_format(bdev, argp);
0610 break;
0611 case BIODASDINFO:
0612 rc = dasd_ioctl_information(block, argp,
0613 sizeof(struct dasd_information_t));
0614 break;
0615 case BIODASDINFO2:
0616 rc = dasd_ioctl_information(block, argp,
0617 sizeof(struct dasd_information2_t));
0618 break;
0619 case BIODASDPRRD:
0620 rc = dasd_ioctl_read_profile(block, argp);
0621 break;
0622 case BIODASDPRRST:
0623 rc = dasd_ioctl_reset_profile(block);
0624 break;
0625 case DASDAPIVER:
0626 rc = dasd_ioctl_api_version(argp);
0627 break;
0628 case BIODASDCMFENABLE:
0629 rc = enable_cmf(base->cdev);
0630 break;
0631 case BIODASDCMFDISABLE:
0632 rc = disable_cmf(base->cdev);
0633 break;
0634 case BIODASDREADALLCMB:
0635 rc = dasd_ioctl_readall_cmb(block, cmd, argp);
0636 break;
0637 case BIODASDRAS:
0638 rc = dasd_ioctl_release_space(bdev, argp);
0639 break;
0640 default:
0641
0642 rc = -ENOTTY;
0643 if (base->discipline->ioctl)
0644 rc = base->discipline->ioctl(block, cmd, argp);
0645 }
0646 dasd_put_device(base);
0647 return rc;
0648 }
0649
0650
0651
0652
0653
0654
0655
0656
0657
0658
0659
0660
0661
0662
0663
0664
0665 int dasd_biodasdinfo(struct gendisk *disk, struct dasd_information2_t *info)
0666 {
0667 struct dasd_device *base;
0668 int error;
0669
0670 if (disk->fops != &dasd_device_operations)
0671 return -EINVAL;
0672
0673 base = dasd_device_from_gendisk(disk);
0674 if (!base)
0675 return -ENODEV;
0676 error = __dasd_ioctl_information(base->block, info);
0677 dasd_put_device(base);
0678 return error;
0679 }
0680
0681 EXPORT_SYMBOL_GPL(dasd_biodasdinfo);