linux 2.6.16.38 w/ vs2.0.3-rc1
[linux-2.6.git] / drivers / s390 / block / dasd_eckd.c
index 7d5a6ce..822e2a2 100644 (file)
@@ -446,39 +446,6 @@ dasd_eckd_cdl_reclen(int recid)
        return LABEL_SIZE;
 }
 
-/*
- * Generate device unique id that specifies the physical device.
- */
-static int
-dasd_eckd_generate_uid(struct dasd_device *device, struct dasd_uid *uid)
-{
-       struct dasd_eckd_private *private;
-       struct dasd_eckd_confdata *confdata;
-
-       private = (struct dasd_eckd_private *) device->private;
-       if (!private)
-               return -ENODEV;
-       confdata = &private->conf_data;
-       if (!confdata)
-               return -ENODEV;
-
-       memset(uid, 0, sizeof(struct dasd_uid));
-       strncpy(uid->vendor, confdata->ned1.HDA_manufacturer,
-               sizeof(uid->vendor) - 1);
-       EBCASC(uid->vendor, sizeof(uid->vendor) - 1);
-       strncpy(uid->serial, confdata->ned1.HDA_location,
-               sizeof(uid->serial) - 1);
-       EBCASC(uid->serial, sizeof(uid->serial) - 1);
-       uid->ssid = confdata->neq.subsystemID;
-       if (confdata->ned2.sneq.flags == 0x40) {
-               uid->alias = 1;
-               uid->unit_addr = confdata->ned2.sneq.base_unit_addr;
-       } else
-               uid->unit_addr = confdata->ned1.unit_addr;
-
-       return 0;
-}
-
 static int
 dasd_eckd_read_conf(struct dasd_device *device)
 {
@@ -540,15 +507,11 @@ dasd_eckd_read_conf(struct dasd_device *device)
        return 0;
 }
 
-/*
- * Check device characteristics.
- * If the device is accessible using ECKD discipline, the device is enabled.
- */
+
 static int
 dasd_eckd_check_characteristics(struct dasd_device *device)
 {
        struct dasd_eckd_private *private;
-       struct dasd_uid uid;
        void *rdc_data;
        int rc;
 
@@ -573,7 +536,6 @@ dasd_eckd_check_characteristics(struct dasd_device *device)
 
        /* Read Device Characteristics */
        rdc_data = (void *) &(private->rdc_data);
-       memset(rdc_data, 0, sizeof(rdc_data));
        rc = read_dev_chars(device->cdev, &rdc_data, 64);
        if (rc) {
                DEV_MESSAGE(KERN_WARNING, device,
@@ -594,17 +556,8 @@ dasd_eckd_check_characteristics(struct dasd_device *device)
 
        /* Read Configuration Data */
        rc = dasd_eckd_read_conf (device);
-       if (rc)
-               return rc;
-
-       /* Generate device unique id and register in devmap */
-       rc = dasd_eckd_generate_uid(device, &uid);
-       if (rc)
-               return rc;
-
-       rc = dasd_set_uid(device->cdev, &uid);
-
        return rc;
+
 }
 
 static struct dasd_ccw_req *
@@ -1274,14 +1227,19 @@ dasd_eckd_fill_info(struct dasd_device * device,
  * (see dasd_eckd_reserve) device.
  */
 static int
-dasd_eckd_release(struct dasd_device *device)
+dasd_eckd_release(struct block_device *bdev, int no, long args)
 {
+       struct dasd_device *device;
        struct dasd_ccw_req *cqr;
        int rc;
 
        if (!capable(CAP_SYS_ADMIN))
                return -EACCES;
 
+       device = bdev->bd_disk->private_data;
+       if (device == NULL)
+               return -ENODEV;
+
        cqr = dasd_smalloc_request(dasd_eckd_discipline.name,
                                   1, 32, device);
        if (IS_ERR(cqr)) {
@@ -1314,14 +1272,19 @@ dasd_eckd_release(struct dasd_device *device)
  * the interrupt is outstanding for a certain time. 
  */
 static int
-dasd_eckd_reserve(struct dasd_device *device)
+dasd_eckd_reserve(struct block_device *bdev, int no, long args)
 {
+       struct dasd_device *device;
        struct dasd_ccw_req *cqr;
        int rc;
 
        if (!capable(CAP_SYS_ADMIN))
                return -EACCES;
 
+       device = bdev->bd_disk->private_data;
+       if (device == NULL)
+               return -ENODEV;
+
        cqr = dasd_smalloc_request(dasd_eckd_discipline.name,
                                   1, 32, device);
        if (IS_ERR(cqr)) {
@@ -1353,14 +1316,19 @@ dasd_eckd_reserve(struct dasd_device *device)
  * (unconditional reserve)
  */
 static int
-dasd_eckd_steal_lock(struct dasd_device *device)
+dasd_eckd_steal_lock(struct block_device *bdev, int no, long args)
 {
+       struct dasd_device *device;
        struct dasd_ccw_req *cqr;
        int rc;
 
        if (!capable(CAP_SYS_ADMIN))
                return -EACCES;
 
+       device = bdev->bd_disk->private_data;
+       if (device == NULL)
+               return -ENODEV;
+
        cqr = dasd_smalloc_request(dasd_eckd_discipline.name,
                                   1, 32, device);
        if (IS_ERR(cqr)) {
@@ -1390,14 +1358,19 @@ dasd_eckd_steal_lock(struct dasd_device *device)
  * Read performance statistics
  */
 static int
-dasd_eckd_performance(struct dasd_device *device, void __user *argp)
+dasd_eckd_performance(struct block_device *bdev, int no, long args)
 {
+       struct dasd_device *device;
        struct dasd_psf_prssd_data *prssdp;
        struct dasd_rssd_perf_stats_t *stats;
        struct dasd_ccw_req *cqr;
        struct ccw1 *ccw;
        int rc;
 
+       device = bdev->bd_disk->private_data;
+       if (device == NULL)
+               return -ENODEV;
+
        cqr = dasd_smalloc_request(dasd_eckd_discipline.name,
                                   1 /* PSF */  + 1 /* RSSD */ ,
                                   (sizeof (struct dasd_psf_prssd_data) +
@@ -1441,9 +1414,8 @@ dasd_eckd_performance(struct dasd_device *device, void __user *argp)
                /* Prepare for Read Subsystem Data */
                prssdp = (struct dasd_psf_prssd_data *) cqr->data;
                stats = (struct dasd_rssd_perf_stats_t *) (prssdp + 1);
-               if (copy_to_user(argp, stats,
-                                sizeof(struct dasd_rssd_perf_stats_t)))
-                       rc = -EFAULT;
+               rc = copy_to_user((long __user *) args, (long *) stats,
+                                 sizeof(struct dasd_rssd_perf_stats_t));
        }
        dasd_sfree_request(cqr, cqr->device);
        return rc;
@@ -1454,22 +1426,27 @@ dasd_eckd_performance(struct dasd_device *device, void __user *argp)
  * Returnes the cache attributes used in Define Extend (DE).
  */
 static int
-dasd_eckd_get_attrib(struct dasd_device *device, void __user *argp)
+dasd_eckd_get_attrib (struct block_device *bdev, int no, long args)
 {
-       struct dasd_eckd_private *private =
-               (struct dasd_eckd_private *)device->private;
-       struct attrib_data_t attrib = private->attrib;
+       struct dasd_device *device;
+        struct dasd_eckd_private *private;
+        struct attrib_data_t attrib;
        int rc;
 
         if (!capable(CAP_SYS_ADMIN))
                 return -EACCES;
-       if (!argp)
+        if (!args)
                 return -EINVAL;
 
-       rc = 0;
-       if (copy_to_user(argp, (long *) &attrib,
-                        sizeof (struct attrib_data_t)))
-               rc = -EFAULT;
+        device = bdev->bd_disk->private_data;
+        if (device == NULL)
+                return -ENODEV;
+
+        private = (struct dasd_eckd_private *) device->private;
+        attrib = private->attrib;
+
+        rc = copy_to_user((long __user *) args, (long *) &attrib,
+                         sizeof (struct attrib_data_t));
 
        return rc;
 }
@@ -1479,19 +1456,26 @@ dasd_eckd_get_attrib(struct dasd_device *device, void __user *argp)
  * Stores the attributes for cache operation to be used in Define Extend (DE).
  */
 static int
-dasd_eckd_set_attrib(struct dasd_device *device, void __user *argp)
+dasd_eckd_set_attrib(struct block_device *bdev, int no, long args)
 {
-       struct dasd_eckd_private *private =
-               (struct dasd_eckd_private *)device->private;
+       struct dasd_device *device;
+       struct dasd_eckd_private *private;
        struct attrib_data_t attrib;
 
        if (!capable(CAP_SYS_ADMIN))
                return -EACCES;
-       if (!argp)
+       if (!args)
                return -EINVAL;
 
-       if (copy_from_user(&attrib, argp, sizeof(struct attrib_data_t)))
+       device = bdev->bd_disk->private_data;
+       if (device == NULL)
+               return -ENODEV;
+
+       if (copy_from_user(&attrib, (void __user *) args,
+                          sizeof (struct attrib_data_t))) {
                return -EFAULT;
+       }
+       private = (struct dasd_eckd_private *) device->private;
        private->attrib = attrib;
 
        DEV_MESSAGE(KERN_INFO, device,
@@ -1500,27 +1484,6 @@ dasd_eckd_set_attrib(struct dasd_device *device, void __user *argp)
        return 0;
 }
 
-static int
-dasd_eckd_ioctl(struct dasd_device *device, unsigned int cmd, void __user *argp)
-{
-       switch (cmd) {
-       case BIODASDGATTR:
-               return dasd_eckd_get_attrib(device, argp);
-       case BIODASDSATTR:
-               return dasd_eckd_set_attrib(device, argp);
-       case BIODASDPSRD:
-               return dasd_eckd_performance(device, argp);
-       case BIODASDRLSE:
-               return dasd_eckd_release(device);
-       case BIODASDRSRV:
-               return dasd_eckd_reserve(device);
-       case BIODASDSLCK:
-               return dasd_eckd_steal_lock(device);
-       default:
-               return -ENOIOCTLCMD;
-       }
-}
-
 /*
  * Print sense data and related channel program.
  * Parts are printed because printk buffer is only 1024 bytes.
@@ -1679,7 +1642,6 @@ static struct dasd_discipline dasd_eckd_discipline = {
        .free_cp = dasd_eckd_free_cp,
        .dump_sense = dasd_eckd_dump_sense,
        .fill_info = dasd_eckd_fill_info,
-       .ioctl = dasd_eckd_ioctl,
 };
 
 static int __init
@@ -1687,18 +1649,59 @@ dasd_eckd_init(void)
 {
        int ret;
 
+       dasd_ioctl_no_register(THIS_MODULE, BIODASDGATTR,
+                              dasd_eckd_get_attrib);
+       dasd_ioctl_no_register(THIS_MODULE, BIODASDSATTR,
+                              dasd_eckd_set_attrib);
+       dasd_ioctl_no_register(THIS_MODULE, BIODASDPSRD,
+                              dasd_eckd_performance);
+       dasd_ioctl_no_register(THIS_MODULE, BIODASDRLSE,
+                              dasd_eckd_release);
+       dasd_ioctl_no_register(THIS_MODULE, BIODASDRSRV,
+                              dasd_eckd_reserve);
+       dasd_ioctl_no_register(THIS_MODULE, BIODASDSLCK,
+                              dasd_eckd_steal_lock);
+
        ASCEBC(dasd_eckd_discipline.ebcname, 4);
 
        ret = ccw_driver_register(&dasd_eckd_driver);
-       if (!ret)
-               dasd_generic_auto_online(&dasd_eckd_driver);
-       return ret;
+       if (ret) {
+               dasd_ioctl_no_unregister(THIS_MODULE, BIODASDGATTR,
+                                        dasd_eckd_get_attrib);
+               dasd_ioctl_no_unregister(THIS_MODULE, BIODASDSATTR,
+                                        dasd_eckd_set_attrib);
+               dasd_ioctl_no_unregister(THIS_MODULE, BIODASDPSRD,
+                                        dasd_eckd_performance);
+               dasd_ioctl_no_unregister(THIS_MODULE, BIODASDRLSE,
+                                        dasd_eckd_release);
+               dasd_ioctl_no_unregister(THIS_MODULE, BIODASDRSRV,
+                                        dasd_eckd_reserve);
+               dasd_ioctl_no_unregister(THIS_MODULE, BIODASDSLCK,
+                                        dasd_eckd_steal_lock);
+               return ret;
+       }
+
+       dasd_generic_auto_online(&dasd_eckd_driver);
+       return 0;
 }
 
 static void __exit
 dasd_eckd_cleanup(void)
 {
        ccw_driver_unregister(&dasd_eckd_driver);
+
+       dasd_ioctl_no_unregister(THIS_MODULE, BIODASDGATTR,
+                                dasd_eckd_get_attrib);
+       dasd_ioctl_no_unregister(THIS_MODULE, BIODASDSATTR,
+                                dasd_eckd_set_attrib);
+       dasd_ioctl_no_unregister(THIS_MODULE, BIODASDPSRD,
+                                dasd_eckd_performance);
+       dasd_ioctl_no_unregister(THIS_MODULE, BIODASDRLSE,
+                                dasd_eckd_release);
+       dasd_ioctl_no_unregister(THIS_MODULE, BIODASDRSRV,
+                                dasd_eckd_reserve);
+       dasd_ioctl_no_unregister(THIS_MODULE, BIODASDSLCK,
+                                dasd_eckd_steal_lock);
 }
 
 module_init(dasd_eckd_init);