vserver 2.0 rc7
[linux-2.6.git] / drivers / s390 / block / dasd_ioctl.c
index f1892ba..980c555 100644 (file)
@@ -7,6 +7,8 @@
  * Bugreports.to..: <Linux390@de.ibm.com>
  * (C) IBM Corporation, IBM Deutschland Entwicklung GmbH, 1999-2001
  *
+ * $Revision: 1.45 $
+ *
  * i/o controls for the dasd driver.
  */
 #include <linux/config.h>
@@ -294,6 +296,7 @@ dasd_ioctl_format(struct block_device *bdev, int no, long args)
 {
        struct dasd_device *device;
        struct format_data_t fdata;
+       int feature_ro;
 
        if (!capable(CAP_SYS_ADMIN))
                return -EACCES;
@@ -304,7 +307,11 @@ dasd_ioctl_format(struct block_device *bdev, int no, long args)
 
        if (device == NULL)
                return -ENODEV;
-       if (test_bit(DASD_FLAG_RO, &device->flags))
+
+       feature_ro = dasd_get_feature(device->cdev, DASD_FEATURE_READONLY);
+       if (feature_ro < 0)
+               return feature_ro;
+       if (feature_ro)
                return -EROFS;
        if (copy_from_user(&fdata, (void __user *) args,
                           sizeof (struct format_data_t)))
@@ -377,7 +384,7 @@ dasd_ioctl_information(struct block_device *bdev, int no, long args)
        struct dasd_device *device;
        struct dasd_information2_t *dasd_info;
        unsigned long flags;
-       int rc;
+       int rc, feature_ro;
        struct ccw_device *cdev;
 
        device = bdev->bd_disk->private_data;
@@ -387,6 +394,10 @@ dasd_ioctl_information(struct block_device *bdev, int no, long args)
        if (!device->discipline->fill_info)
                return -EINVAL;
 
+       feature_ro = dasd_get_feature(device->cdev, DASD_FEATURE_READONLY);
+       if (feature_ro < 0)
+               return feature_ro;
+
        dasd_info = kmalloc(sizeof(struct dasd_information2_t), GFP_KERNEL);
        if (dasd_info == NULL)
                return -ENOMEM;
@@ -415,9 +426,8 @@ dasd_ioctl_information(struct block_device *bdev, int no, long args)
        if ((device->state < DASD_STATE_READY) ||
            (dasd_check_blocksize(device->bp_block)))
                dasd_info->format = DASD_FORMAT_NONE;
-       
-       dasd_info->features |= test_bit(DASD_FLAG_RO, &device->flags) ?
-               DASD_FEATURE_READONLY : DASD_FEATURE_DEFAULT;
+
+       dasd_info->features |= feature_ro;
 
        if (device->discipline)
                memcpy(dasd_info->type, device->discipline->name, 4);
@@ -460,7 +470,7 @@ static int
 dasd_ioctl_set_ro(struct block_device *bdev, int no, long args)
 {
        struct dasd_device *device;
-       int intval;
+       int intval, rc;
 
        if (!capable(CAP_SYS_ADMIN))
                return -EACCES;
@@ -472,12 +482,11 @@ dasd_ioctl_set_ro(struct block_device *bdev, int no, long args)
        device =  bdev->bd_disk->private_data;
        if (device == NULL)
                return -ENODEV;
+
        set_disk_ro(bdev->bd_disk, intval);
-       if (intval)
-               set_bit(DASD_FLAG_RO, &device->flags);
-       else
-               clear_bit(DASD_FLAG_RO, &device->flags);
-       return 0;
+       rc = dasd_set_feature(device->cdev, DASD_FEATURE_READONLY, intval);
+
+       return rc;
 }
 
 /*