Commit 2c1b6ec1 authored by Christoph Hellwig's avatar Christoph Hellwig Committed by Jens Axboe
Browse files

dasd: implement ->set_read_only to hook into BLKROSET processing



Implement the ->set_read_only method instead of parsing the actual
ioctl command.

Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
Reviewed-by: default avatarStefan Haberland <sth@linux.ibm.com>
Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent 118cf084
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -3394,6 +3394,7 @@ dasd_device_operations = {
	.ioctl		= dasd_ioctl,
	.compat_ioctl	= dasd_ioctl,
	.getgeo		= dasd_getgeo,
	.set_read_only	= dasd_set_read_only,
};

/*******************************************************************************
+2 −1
Original line number Diff line number Diff line
@@ -845,6 +845,7 @@ 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_set_read_only(struct block_device *bdev, bool ro);

/* externals in dasd_proc.c */
int dasd_proc_init(void);
+9 −18
Original line number Diff line number Diff line
@@ -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;