diff options
Diffstat (limited to 'drivers/s390/block/dasd_ioctl.c')
-rw-r--r-- | drivers/s390/block/dasd_ioctl.c | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/drivers/s390/block/dasd_ioctl.c b/drivers/s390/block/dasd_ioctl.c index bb6caf46bbd9..c8319bef2730 100644 --- a/drivers/s390/block/dasd_ioctl.c +++ b/drivers/s390/block/dasd_ioctl.c | |||
@@ -16,6 +16,7 @@ | |||
16 | #include <linux/blkpg.h> | 16 | #include <linux/blkpg.h> |
17 | 17 | ||
18 | #include <asm/ccwdev.h> | 18 | #include <asm/ccwdev.h> |
19 | #include <asm/cmb.h> | ||
19 | #include <asm/uaccess.h> | 20 | #include <asm/uaccess.h> |
20 | 21 | ||
21 | /* This is ugly... */ | 22 | /* This is ugly... */ |
@@ -406,6 +407,21 @@ dasd_ioctl_set_ro(struct block_device *bdev, void __user *argp) | |||
406 | return dasd_set_feature(device->cdev, DASD_FEATURE_READONLY, intval); | 407 | return dasd_set_feature(device->cdev, DASD_FEATURE_READONLY, intval); |
407 | } | 408 | } |
408 | 409 | ||
410 | static int | ||
411 | dasd_ioctl_readall_cmb(struct dasd_device *device, unsigned int cmd, | ||
412 | unsigned long arg) | ||
413 | { | ||
414 | struct cmbdata __user *argp = (void __user *) arg; | ||
415 | size_t size = _IOC_SIZE(cmd); | ||
416 | struct cmbdata data; | ||
417 | int ret; | ||
418 | |||
419 | ret = cmf_readall(device->cdev, &data); | ||
420 | if (!ret && copy_to_user(argp, &data, min(size, sizeof(*argp)))) | ||
421 | return -EFAULT; | ||
422 | return ret; | ||
423 | } | ||
424 | |||
409 | int | 425 | int |
410 | dasd_ioctl(struct inode *inode, struct file *file, | 426 | dasd_ioctl(struct inode *inode, struct file *file, |
411 | unsigned int cmd, unsigned long arg) | 427 | unsigned int cmd, unsigned long arg) |
@@ -447,6 +463,12 @@ dasd_ioctl(struct inode *inode, struct file *file, | |||
447 | return dasd_ioctl_set_ro(bdev, argp); | 463 | return dasd_ioctl_set_ro(bdev, argp); |
448 | case DASDAPIVER: | 464 | case DASDAPIVER: |
449 | return dasd_ioctl_api_version(argp); | 465 | return dasd_ioctl_api_version(argp); |
466 | case BIODASDCMFENABLE: | ||
467 | return enable_cmf(device->cdev); | ||
468 | case BIODASDCMFDISABLE: | ||
469 | return disable_cmf(device->cdev); | ||
470 | case BIODASDREADALLCMB: | ||
471 | return dasd_ioctl_readall_cmb(device, cmd, arg); | ||
450 | default: | 472 | default: |
451 | /* if the discipline has an ioctl method try it. */ | 473 | /* if the discipline has an ioctl method try it. */ |
452 | if (device->discipline->ioctl) { | 474 | if (device->discipline->ioctl) { |