X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=drivers%2Fs390%2Fblock%2Fdasd_eckd.c;h=822e2a265578ca798afe71ee7279610de496ada2;hb=987b0145d94eecf292d8b301228356f44611ab7c;hp=7d5a6cee4bd8ff075c4c48ed6edccdb30cefb283;hpb=f7ed79d23a47594e7834d66a8f14449796d4f3e6;p=linux-2.6.git diff --git a/drivers/s390/block/dasd_eckd.c b/drivers/s390/block/dasd_eckd.c index 7d5a6cee4..822e2a265 100644 --- a/drivers/s390/block/dasd_eckd.c +++ b/drivers/s390/block/dasd_eckd.c @@ -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);