dasd: implement ->set_read_only to hook into BLKROSET processing
authorChristoph Hellwig <hch@lst.de>
Tue, 3 Nov 2020 10:00:14 +0000 (11:00 +0100)
committerJens Axboe <axboe@kernel.dk>
Mon, 16 Nov 2020 15:14:29 +0000 (08:14 -0700)
Implement the ->set_read_only method instead of parsing the actual
ioctl command.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Stefan Haberland <sth@linux.ibm.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
drivers/s390/block/dasd.c
drivers/s390/block/dasd_int.h
drivers/s390/block/dasd_ioctl.c

index eb17fea..db24e04 100644 (file)
@@ -3394,6 +3394,7 @@ dasd_device_operations = {
        .ioctl          = dasd_ioctl,
        .compat_ioctl   = dasd_ioctl,
        .getgeo         = dasd_getgeo,
+       .set_read_only  = dasd_set_read_only,
 };
 
 /*******************************************************************************
index fa552f9..c59a0d6 100644 (file)
@@ -844,7 +844,8 @@ int dasd_scan_partitions(struct dasd_block *);
 void dasd_destroy_partitions(struct dasd_block *);
 
 /* externals in dasd_ioctl.c */
-int  dasd_ioctl(struct block_device *, fmode_t, unsigned int, unsigned long);
+int dasd_ioctl(struct block_device *, fmode_t, unsigned int, unsigned long);
+int dasd_set_read_only(struct block_device *bdev, bool ro);
 
 /* externals in dasd_proc.c */
 int dasd_proc_init(void);
index cb6427f..3359559 100644 (file)
@@ -532,28 +532,22 @@ static int dasd_ioctl_information(struct dasd_block *block, void __user *argp,
 /*
  * Set read only
  */
-static int
-dasd_ioctl_set_ro(struct block_device *bdev, void __user *argp)
+int dasd_set_read_only(struct block_device *bdev, bool ro)
 {
        struct dasd_device *base;
-       int intval, rc;
+       int rc;
 
-       if (!capable(CAP_SYS_ADMIN))
-               return -EACCES;
+       /* do not manipulate hardware state for partitions */
        if (bdev_is_partition(bdev))
-               // ro setting is not allowed for partitions
-               return -EINVAL;
-       if (get_user(intval, (int __user *)argp))
-               return -EFAULT;
+               return 0;
+
        base = dasd_device_from_gendisk(bdev->bd_disk);
        if (!base)
                return -ENODEV;
-       if (!intval && test_bit(DASD_FLAG_DEVICE_RO, &base->flags)) {
-               dasd_put_device(base);
-               return -EROFS;
-       }
-       set_disk_ro(bdev->bd_disk, intval);
-       rc = dasd_set_feature(base->cdev, DASD_FEATURE_READONLY, intval);
+       if (!ro && test_bit(DASD_FLAG_DEVICE_RO, &base->flags))
+               rc = -EROFS;
+       else
+               rc = dasd_set_feature(base->cdev, DASD_FEATURE_READONLY, ro);
        dasd_put_device(base);
        return rc;
 }
@@ -633,9 +627,6 @@ int dasd_ioctl(struct block_device *bdev, fmode_t mode,
        case BIODASDPRRST:
                rc = dasd_ioctl_reset_profile(block);
                break;
-       case BLKROSET:
-               rc = dasd_ioctl_set_ro(bdev, argp);
-               break;
        case DASDAPIVER:
                rc = dasd_ioctl_api_version(argp);
                break;