diff options
Diffstat (limited to 'drivers/s390')
| -rw-r--r-- | drivers/s390/block/dasd.c | 8 | ||||
| -rw-r--r-- | drivers/s390/block/dasd_eckd.c | 16 | ||||
| -rw-r--r-- | drivers/s390/block/dasd_ioctl.c | 21 | ||||
| -rw-r--r-- | drivers/s390/block/dasd_proc.c | 7 | ||||
| -rw-r--r-- | drivers/s390/char/con3215.c | 17 | ||||
| -rw-r--r-- | drivers/s390/char/fs3270.c | 17 | ||||
| -rw-r--r-- | drivers/s390/char/sclp_vt220.c | 4 | ||||
| -rw-r--r-- | drivers/s390/char/tape_block.c | 39 | ||||
| -rw-r--r-- | drivers/s390/char/tape_char.c | 18 | ||||
| -rw-r--r-- | drivers/s390/char/vmcp.c | 12 | ||||
| -rw-r--r-- | drivers/s390/cio/chsc_sch.c | 23 | ||||
| -rw-r--r-- | drivers/s390/cio/qdio_main.c | 4 | ||||
| -rw-r--r-- | drivers/s390/crypto/zcrypt_api.c | 4 | ||||
| -rw-r--r-- | drivers/s390/crypto/zcrypt_pcicc.c | 2 | ||||
| -rw-r--r-- | drivers/s390/crypto/zcrypt_pcixcc.c | 2 | ||||
| -rw-r--r-- | drivers/s390/net/claw.c | 2 | ||||
| -rw-r--r-- | drivers/s390/scsi/zfcp_cfdc.c | 9 | ||||
| -rw-r--r-- | drivers/s390/scsi/zfcp_dbf.c | 2 | ||||
| -rw-r--r-- | drivers/s390/scsi/zfcp_ext.h | 5 | ||||
| -rw-r--r-- | drivers/s390/scsi/zfcp_fc.c | 93 | ||||
| -rw-r--r-- | drivers/s390/scsi/zfcp_fc.h | 2 | ||||
| -rw-r--r-- | drivers/s390/scsi/zfcp_fsf.c | 19 | ||||
| -rw-r--r-- | drivers/s390/scsi/zfcp_scsi.c | 1 |
23 files changed, 177 insertions, 150 deletions
diff --git a/drivers/s390/block/dasd.c b/drivers/s390/block/dasd.c index fdb2e7c1450..5905936c7c6 100644 --- a/drivers/s390/block/dasd.c +++ b/drivers/s390/block/dasd.c | |||
| @@ -1004,8 +1004,8 @@ static void dasd_handle_killed_request(struct ccw_device *cdev, | |||
| 1004 | if (device == NULL || | 1004 | if (device == NULL || |
| 1005 | device != dasd_device_from_cdev_locked(cdev) || | 1005 | device != dasd_device_from_cdev_locked(cdev) || |
| 1006 | strncmp(device->discipline->ebcname, (char *) &cqr->magic, 4)) { | 1006 | strncmp(device->discipline->ebcname, (char *) &cqr->magic, 4)) { |
| 1007 | DBF_DEV_EVENT(DBF_DEBUG, device, "invalid device in request: " | 1007 | DBF_EVENT_DEVID(DBF_DEBUG, cdev, "%s", |
| 1008 | "bus_id %s", dev_name(&cdev->dev)); | 1008 | "invalid device in request"); |
| 1009 | return; | 1009 | return; |
| 1010 | } | 1010 | } |
| 1011 | 1011 | ||
| @@ -1078,8 +1078,8 @@ void dasd_int_handler(struct ccw_device *cdev, unsigned long intparm, | |||
| 1078 | device = (struct dasd_device *) cqr->startdev; | 1078 | device = (struct dasd_device *) cqr->startdev; |
| 1079 | if (!device || | 1079 | if (!device || |
| 1080 | strncmp(device->discipline->ebcname, (char *) &cqr->magic, 4)) { | 1080 | strncmp(device->discipline->ebcname, (char *) &cqr->magic, 4)) { |
| 1081 | DBF_DEV_EVENT(DBF_DEBUG, device, "invalid device in request: " | 1081 | DBF_EVENT_DEVID(DBF_DEBUG, cdev, "%s", |
| 1082 | "bus_id %s", dev_name(&cdev->dev)); | 1082 | "invalid device in request"); |
| 1083 | return; | 1083 | return; |
| 1084 | } | 1084 | } |
| 1085 | 1085 | ||
diff --git a/drivers/s390/block/dasd_eckd.c b/drivers/s390/block/dasd_eckd.c index 5819dc02a14..1cca21aafab 100644 --- a/drivers/s390/block/dasd_eckd.c +++ b/drivers/s390/block/dasd_eckd.c | |||
| @@ -23,6 +23,7 @@ | |||
| 23 | #include <asm/debug.h> | 23 | #include <asm/debug.h> |
| 24 | #include <asm/idals.h> | 24 | #include <asm/idals.h> |
| 25 | #include <asm/ebcdic.h> | 25 | #include <asm/ebcdic.h> |
| 26 | #include <asm/compat.h> | ||
| 26 | #include <asm/io.h> | 27 | #include <asm/io.h> |
| 27 | #include <asm/uaccess.h> | 28 | #include <asm/uaccess.h> |
| 28 | #include <asm/cio.h> | 29 | #include <asm/cio.h> |
| @@ -2844,13 +2845,16 @@ static int dasd_symm_io(struct dasd_device *device, void __user *argp) | |||
| 2844 | rc = -EFAULT; | 2845 | rc = -EFAULT; |
| 2845 | if (copy_from_user(&usrparm, argp, sizeof(usrparm))) | 2846 | if (copy_from_user(&usrparm, argp, sizeof(usrparm))) |
| 2846 | goto out; | 2847 | goto out; |
| 2847 | #ifndef CONFIG_64BIT | 2848 | if (is_compat_task() || sizeof(long) == 4) { |
| 2848 | /* Make sure pointers are sane even on 31 bit. */ | 2849 | /* Make sure pointers are sane even on 31 bit. */ |
| 2849 | if ((usrparm.psf_data >> 32) != 0 || (usrparm.rssd_result >> 32) != 0) { | ||
| 2850 | rc = -EINVAL; | 2850 | rc = -EINVAL; |
| 2851 | goto out; | 2851 | if ((usrparm.psf_data >> 32) != 0) |
| 2852 | goto out; | ||
| 2853 | if ((usrparm.rssd_result >> 32) != 0) | ||
| 2854 | goto out; | ||
| 2855 | usrparm.psf_data &= 0x7fffffffULL; | ||
| 2856 | usrparm.rssd_result &= 0x7fffffffULL; | ||
| 2852 | } | 2857 | } |
| 2853 | #endif | ||
| 2854 | /* alloc I/O data area */ | 2858 | /* alloc I/O data area */ |
| 2855 | psf_data = kzalloc(usrparm.psf_data_len, GFP_KERNEL | GFP_DMA); | 2859 | psf_data = kzalloc(usrparm.psf_data_len, GFP_KERNEL | GFP_DMA); |
| 2856 | rssd_result = kzalloc(usrparm.rssd_result_len, GFP_KERNEL | GFP_DMA); | 2860 | rssd_result = kzalloc(usrparm.rssd_result_len, GFP_KERNEL | GFP_DMA); |
| @@ -3029,7 +3033,7 @@ static void dasd_eckd_dump_sense_ccw(struct dasd_device *device, | |||
| 3029 | len += sprintf(page + len, KERN_ERR PRINTK_HEADER | 3033 | len += sprintf(page + len, KERN_ERR PRINTK_HEADER |
| 3030 | " in req: %p CS: 0x%02X DS: 0x%02X CC: 0x%02X RC: %d\n", | 3034 | " in req: %p CS: 0x%02X DS: 0x%02X CC: 0x%02X RC: %d\n", |
| 3031 | req, scsw_cstat(&irb->scsw), scsw_dstat(&irb->scsw), | 3035 | req, scsw_cstat(&irb->scsw), scsw_dstat(&irb->scsw), |
| 3032 | scsw_cc(&irb->scsw), req->intrc); | 3036 | scsw_cc(&irb->scsw), req ? req->intrc : 0); |
| 3033 | len += sprintf(page + len, KERN_ERR PRINTK_HEADER | 3037 | len += sprintf(page + len, KERN_ERR PRINTK_HEADER |
| 3034 | " device %s: Failing CCW: %p\n", | 3038 | " device %s: Failing CCW: %p\n", |
| 3035 | dev_name(&device->cdev->dev), | 3039 | dev_name(&device->cdev->dev), |
diff --git a/drivers/s390/block/dasd_ioctl.c b/drivers/s390/block/dasd_ioctl.c index 478bcdb90b6..7039d9cf0fb 100644 --- a/drivers/s390/block/dasd_ioctl.c +++ b/drivers/s390/block/dasd_ioctl.c | |||
| @@ -17,7 +17,7 @@ | |||
| 17 | #include <linux/fs.h> | 17 | #include <linux/fs.h> |
| 18 | #include <linux/blkpg.h> | 18 | #include <linux/blkpg.h> |
| 19 | #include <linux/smp_lock.h> | 19 | #include <linux/smp_lock.h> |
| 20 | 20 | #include <asm/compat.h> | |
| 21 | #include <asm/ccwdev.h> | 21 | #include <asm/ccwdev.h> |
| 22 | #include <asm/cmb.h> | 22 | #include <asm/cmb.h> |
| 23 | #include <asm/uaccess.h> | 23 | #include <asm/uaccess.h> |
| @@ -260,7 +260,7 @@ static int dasd_ioctl_information(struct dasd_block *block, | |||
| 260 | struct ccw_dev_id dev_id; | 260 | struct ccw_dev_id dev_id; |
| 261 | 261 | ||
| 262 | base = block->base; | 262 | base = block->base; |
| 263 | if (!base->discipline->fill_info) | 263 | if (!base->discipline || !base->discipline->fill_info) |
| 264 | return -EINVAL; | 264 | return -EINVAL; |
| 265 | 265 | ||
| 266 | dasd_info = kzalloc(sizeof(struct dasd_information2_t), GFP_KERNEL); | 266 | dasd_info = kzalloc(sizeof(struct dasd_information2_t), GFP_KERNEL); |
| @@ -303,10 +303,7 @@ static int dasd_ioctl_information(struct dasd_block *block, | |||
| 303 | dasd_info->features |= | 303 | dasd_info->features |= |
| 304 | ((base->features & DASD_FEATURE_READONLY) != 0); | 304 | ((base->features & DASD_FEATURE_READONLY) != 0); |
| 305 | 305 | ||
| 306 | if (base->discipline) | 306 | memcpy(dasd_info->type, base->discipline->name, 4); |
| 307 | memcpy(dasd_info->type, base->discipline->name, 4); | ||
| 308 | else | ||
| 309 | memcpy(dasd_info->type, "none", 4); | ||
| 310 | 307 | ||
| 311 | if (block->request_queue->request_fn) { | 308 | if (block->request_queue->request_fn) { |
| 312 | struct list_head *l; | 309 | struct list_head *l; |
| @@ -358,9 +355,8 @@ dasd_ioctl_set_ro(struct block_device *bdev, void __user *argp) | |||
| 358 | } | 355 | } |
| 359 | 356 | ||
| 360 | static int dasd_ioctl_readall_cmb(struct dasd_block *block, unsigned int cmd, | 357 | static int dasd_ioctl_readall_cmb(struct dasd_block *block, unsigned int cmd, |
| 361 | unsigned long arg) | 358 | struct cmbdata __user *argp) |
| 362 | { | 359 | { |
| 363 | struct cmbdata __user *argp = (void __user *) arg; | ||
| 364 | size_t size = _IOC_SIZE(cmd); | 360 | size_t size = _IOC_SIZE(cmd); |
| 365 | struct cmbdata data; | 361 | struct cmbdata data; |
| 366 | int ret; | 362 | int ret; |
| @@ -376,7 +372,12 @@ dasd_do_ioctl(struct block_device *bdev, fmode_t mode, | |||
| 376 | unsigned int cmd, unsigned long arg) | 372 | unsigned int cmd, unsigned long arg) |
| 377 | { | 373 | { |
| 378 | struct dasd_block *block = bdev->bd_disk->private_data; | 374 | struct dasd_block *block = bdev->bd_disk->private_data; |
| 379 | void __user *argp = (void __user *)arg; | 375 | void __user *argp; |
| 376 | |||
| 377 | if (is_compat_task()) | ||
| 378 | argp = compat_ptr(arg); | ||
| 379 | else | ||
| 380 | argp = (void __user *)arg; | ||
| 380 | 381 | ||
| 381 | if (!block) | 382 | if (!block) |
| 382 | return -ENODEV; | 383 | return -ENODEV; |
| @@ -414,7 +415,7 @@ dasd_do_ioctl(struct block_device *bdev, fmode_t mode, | |||
| 414 | case BIODASDCMFDISABLE: | 415 | case BIODASDCMFDISABLE: |
| 415 | return disable_cmf(block->base->cdev); | 416 | return disable_cmf(block->base->cdev); |
| 416 | case BIODASDREADALLCMB: | 417 | case BIODASDREADALLCMB: |
| 417 | return dasd_ioctl_readall_cmb(block, cmd, arg); | 418 | return dasd_ioctl_readall_cmb(block, cmd, argp); |
| 418 | default: | 419 | default: |
| 419 | /* if the discipline has an ioctl method try it. */ | 420 | /* if the discipline has an ioctl method try it. */ |
| 420 | if (block->base->discipline->ioctl) { | 421 | if (block->base->discipline->ioctl) { |
diff --git a/drivers/s390/block/dasd_proc.c b/drivers/s390/block/dasd_proc.c index 6315fbd8e68..71f95f54866 100644 --- a/drivers/s390/block/dasd_proc.c +++ b/drivers/s390/block/dasd_proc.c | |||
| @@ -72,7 +72,7 @@ dasd_devices_show(struct seq_file *m, void *v) | |||
| 72 | /* Print device number. */ | 72 | /* Print device number. */ |
| 73 | seq_printf(m, "%s", dev_name(&device->cdev->dev)); | 73 | seq_printf(m, "%s", dev_name(&device->cdev->dev)); |
| 74 | /* Print discipline string. */ | 74 | /* Print discipline string. */ |
| 75 | if (device != NULL && device->discipline != NULL) | 75 | if (device->discipline != NULL) |
| 76 | seq_printf(m, "(%s)", device->discipline->name); | 76 | seq_printf(m, "(%s)", device->discipline->name); |
| 77 | else | 77 | else |
| 78 | seq_printf(m, "(none)"); | 78 | seq_printf(m, "(none)"); |
| @@ -92,10 +92,7 @@ dasd_devices_show(struct seq_file *m, void *v) | |||
| 92 | substr = (device->features & DASD_FEATURE_READONLY) ? "(ro)" : " "; | 92 | substr = (device->features & DASD_FEATURE_READONLY) ? "(ro)" : " "; |
| 93 | seq_printf(m, "%4s: ", substr); | 93 | seq_printf(m, "%4s: ", substr); |
| 94 | /* Print device status information. */ | 94 | /* Print device status information. */ |
| 95 | switch ((device != NULL) ? device->state : -1) { | 95 | switch (device->state) { |
| 96 | case -1: | ||
| 97 | seq_printf(m, "unknown"); | ||
| 98 | break; | ||
| 99 | case DASD_STATE_NEW: | 96 | case DASD_STATE_NEW: |
| 100 | seq_printf(m, "new"); | 97 | seq_printf(m, "new"); |
| 101 | break; | 98 | break; |
diff --git a/drivers/s390/char/con3215.c b/drivers/s390/char/con3215.c index 9d61683b563..59ec073724b 100644 --- a/drivers/s390/char/con3215.c +++ b/drivers/s390/char/con3215.c | |||
| @@ -1037,22 +1037,6 @@ static void tty3215_flush_buffer(struct tty_struct *tty) | |||
| 1037 | } | 1037 | } |
| 1038 | 1038 | ||
| 1039 | /* | 1039 | /* |
| 1040 | * Currently we don't have any io controls for 3215 ttys | ||
| 1041 | */ | ||
| 1042 | static int tty3215_ioctl(struct tty_struct *tty, struct file * file, | ||
| 1043 | unsigned int cmd, unsigned long arg) | ||
| 1044 | { | ||
| 1045 | if (tty->flags & (1 << TTY_IO_ERROR)) | ||
| 1046 | return -EIO; | ||
| 1047 | |||
| 1048 | switch (cmd) { | ||
| 1049 | default: | ||
| 1050 | return -ENOIOCTLCMD; | ||
| 1051 | } | ||
| 1052 | return 0; | ||
| 1053 | } | ||
| 1054 | |||
| 1055 | /* | ||
| 1056 | * Disable reading from a 3215 tty | 1040 | * Disable reading from a 3215 tty |
| 1057 | */ | 1041 | */ |
| 1058 | static void tty3215_throttle(struct tty_struct * tty) | 1042 | static void tty3215_throttle(struct tty_struct * tty) |
| @@ -1117,7 +1101,6 @@ static const struct tty_operations tty3215_ops = { | |||
| 1117 | .write_room = tty3215_write_room, | 1101 | .write_room = tty3215_write_room, |
| 1118 | .chars_in_buffer = tty3215_chars_in_buffer, | 1102 | .chars_in_buffer = tty3215_chars_in_buffer, |
| 1119 | .flush_buffer = tty3215_flush_buffer, | 1103 | .flush_buffer = tty3215_flush_buffer, |
| 1120 | .ioctl = tty3215_ioctl, | ||
| 1121 | .throttle = tty3215_throttle, | 1104 | .throttle = tty3215_throttle, |
| 1122 | .unthrottle = tty3215_unthrottle, | 1105 | .unthrottle = tty3215_unthrottle, |
| 1123 | .stop = tty3215_stop, | 1106 | .stop = tty3215_stop, |
diff --git a/drivers/s390/char/fs3270.c b/drivers/s390/char/fs3270.c index 247b2b93472..31c59b0d6df 100644 --- a/drivers/s390/char/fs3270.c +++ b/drivers/s390/char/fs3270.c | |||
| @@ -15,6 +15,7 @@ | |||
| 15 | #include <linux/types.h> | 15 | #include <linux/types.h> |
| 16 | #include <linux/smp_lock.h> | 16 | #include <linux/smp_lock.h> |
| 17 | 17 | ||
| 18 | #include <asm/compat.h> | ||
| 18 | #include <asm/ccwdev.h> | 19 | #include <asm/ccwdev.h> |
| 19 | #include <asm/cio.h> | 20 | #include <asm/cio.h> |
| 20 | #include <asm/ebcdic.h> | 21 | #include <asm/ebcdic.h> |
| @@ -322,6 +323,7 @@ fs3270_write(struct file *filp, const char __user *data, size_t count, loff_t *o | |||
| 322 | static long | 323 | static long |
| 323 | fs3270_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) | 324 | fs3270_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) |
| 324 | { | 325 | { |
| 326 | char __user *argp; | ||
| 325 | struct fs3270 *fp; | 327 | struct fs3270 *fp; |
| 326 | struct raw3270_iocb iocb; | 328 | struct raw3270_iocb iocb; |
| 327 | int rc; | 329 | int rc; |
| @@ -329,6 +331,10 @@ fs3270_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) | |||
| 329 | fp = filp->private_data; | 331 | fp = filp->private_data; |
| 330 | if (!fp) | 332 | if (!fp) |
| 331 | return -ENODEV; | 333 | return -ENODEV; |
| 334 | if (is_compat_task()) | ||
| 335 | argp = compat_ptr(arg); | ||
| 336 | else | ||
| 337 | argp = (char __user *)arg; | ||
| 332 | rc = 0; | 338 | rc = 0; |
| 333 | mutex_lock(&fs3270_mutex); | 339 | mutex_lock(&fs3270_mutex); |
| 334 | switch (cmd) { | 340 | switch (cmd) { |
| @@ -339,10 +345,10 @@ fs3270_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) | |||
| 339 | fp->write_command = arg; | 345 | fp->write_command = arg; |
| 340 | break; | 346 | break; |
| 341 | case TUBGETI: | 347 | case TUBGETI: |
| 342 | rc = put_user(fp->read_command, (char __user *) arg); | 348 | rc = put_user(fp->read_command, argp); |
| 343 | break; | 349 | break; |
| 344 | case TUBGETO: | 350 | case TUBGETO: |
| 345 | rc = put_user(fp->write_command,(char __user *) arg); | 351 | rc = put_user(fp->write_command, argp); |
| 346 | break; | 352 | break; |
| 347 | case TUBGETMOD: | 353 | case TUBGETMOD: |
| 348 | iocb.model = fp->view.model; | 354 | iocb.model = fp->view.model; |
| @@ -351,8 +357,7 @@ fs3270_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) | |||
| 351 | iocb.pf_cnt = 24; | 357 | iocb.pf_cnt = 24; |
| 352 | iocb.re_cnt = 20; | 358 | iocb.re_cnt = 20; |
| 353 | iocb.map = 0; | 359 | iocb.map = 0; |
| 354 | if (copy_to_user((char __user *) arg, &iocb, | 360 | if (copy_to_user(argp, &iocb, sizeof(struct raw3270_iocb))) |
| 355 | sizeof(struct raw3270_iocb))) | ||
| 356 | rc = -EFAULT; | 361 | rc = -EFAULT; |
| 357 | break; | 362 | break; |
| 358 | } | 363 | } |
| @@ -511,8 +516,8 @@ static const struct file_operations fs3270_fops = { | |||
| 511 | .write = fs3270_write, /* write */ | 516 | .write = fs3270_write, /* write */ |
| 512 | .unlocked_ioctl = fs3270_ioctl, /* ioctl */ | 517 | .unlocked_ioctl = fs3270_ioctl, /* ioctl */ |
| 513 | .compat_ioctl = fs3270_ioctl, /* ioctl */ | 518 | .compat_ioctl = fs3270_ioctl, /* ioctl */ |
| 514 | .open = fs3270_open, /* open */ | 519 | .open = fs3270_open, /* open */ |
| 515 | .release = fs3270_close, /* release */ | 520 | .release = fs3270_close, /* release */ |
| 516 | }; | 521 | }; |
| 517 | 522 | ||
| 518 | /* | 523 | /* |
diff --git a/drivers/s390/char/sclp_vt220.c b/drivers/s390/char/sclp_vt220.c index b9d2a007e93..3796ffdb847 100644 --- a/drivers/s390/char/sclp_vt220.c +++ b/drivers/s390/char/sclp_vt220.c | |||
| @@ -495,6 +495,10 @@ sclp_vt220_open(struct tty_struct *tty, struct file *filp) | |||
| 495 | if (tty->driver_data == NULL) | 495 | if (tty->driver_data == NULL) |
| 496 | return -ENOMEM; | 496 | return -ENOMEM; |
| 497 | tty->low_latency = 0; | 497 | tty->low_latency = 0; |
| 498 | if (!tty->winsize.ws_row && !tty->winsize.ws_col) { | ||
| 499 | tty->winsize.ws_row = 24; | ||
| 500 | tty->winsize.ws_col = 80; | ||
| 501 | } | ||
| 498 | } | 502 | } |
| 499 | return 0; | 503 | return 0; |
| 500 | } | 504 | } |
diff --git a/drivers/s390/char/tape_block.c b/drivers/s390/char/tape_block.c index 96816149368..8d3d720737d 100644 --- a/drivers/s390/char/tape_block.c +++ b/drivers/s390/char/tape_block.c | |||
| @@ -46,8 +46,6 @@ | |||
| 46 | */ | 46 | */ |
| 47 | static int tapeblock_open(struct block_device *, fmode_t); | 47 | static int tapeblock_open(struct block_device *, fmode_t); |
| 48 | static int tapeblock_release(struct gendisk *, fmode_t); | 48 | static int tapeblock_release(struct gendisk *, fmode_t); |
| 49 | static int tapeblock_ioctl(struct block_device *, fmode_t, unsigned int, | ||
| 50 | unsigned long); | ||
| 51 | static int tapeblock_medium_changed(struct gendisk *); | 49 | static int tapeblock_medium_changed(struct gendisk *); |
| 52 | static int tapeblock_revalidate_disk(struct gendisk *); | 50 | static int tapeblock_revalidate_disk(struct gendisk *); |
| 53 | 51 | ||
| @@ -55,7 +53,6 @@ static const struct block_device_operations tapeblock_fops = { | |||
| 55 | .owner = THIS_MODULE, | 53 | .owner = THIS_MODULE, |
| 56 | .open = tapeblock_open, | 54 | .open = tapeblock_open, |
| 57 | .release = tapeblock_release, | 55 | .release = tapeblock_release, |
| 58 | .ioctl = tapeblock_ioctl, | ||
| 59 | .media_changed = tapeblock_medium_changed, | 56 | .media_changed = tapeblock_medium_changed, |
| 60 | .revalidate_disk = tapeblock_revalidate_disk, | 57 | .revalidate_disk = tapeblock_revalidate_disk, |
| 61 | }; | 58 | }; |
| @@ -416,42 +413,6 @@ tapeblock_release(struct gendisk *disk, fmode_t mode) | |||
| 416 | } | 413 | } |
| 417 | 414 | ||
| 418 | /* | 415 | /* |
| 419 | * Support of some generic block device IOCTLs. | ||
| 420 | */ | ||
| 421 | static int | ||
| 422 | tapeblock_ioctl( | ||
| 423 | struct block_device * bdev, | ||
| 424 | fmode_t mode, | ||
| 425 | unsigned int command, | ||
| 426 | unsigned long arg | ||
| 427 | ) { | ||
| 428 | int rc; | ||
| 429 | int minor; | ||
| 430 | struct gendisk *disk = bdev->bd_disk; | ||
| 431 | struct tape_device *device; | ||
| 432 | |||
| 433 | rc = 0; | ||
| 434 | BUG_ON(!disk); | ||
| 435 | device = disk->private_data; | ||
| 436 | BUG_ON(!device); | ||
| 437 | minor = MINOR(bdev->bd_dev); | ||
| 438 | |||
| 439 | DBF_LH(6, "tapeblock_ioctl(0x%0x)\n", command); | ||
| 440 | DBF_LH(6, "device = %d:%d\n", tapeblock_major, minor); | ||
| 441 | |||
| 442 | switch (command) { | ||
| 443 | /* Refuse some IOCTL calls without complaining (mount). */ | ||
| 444 | case 0x5310: /* CDROMMULTISESSION */ | ||
| 445 | rc = -EINVAL; | ||
| 446 | break; | ||
| 447 | default: | ||
| 448 | rc = -EINVAL; | ||
| 449 | } | ||
| 450 | |||
| 451 | return rc; | ||
| 452 | } | ||
| 453 | |||
| 454 | /* | ||
| 455 | * Initialize block device frontend. | 416 | * Initialize block device frontend. |
| 456 | */ | 417 | */ |
| 457 | int | 418 | int |
diff --git a/drivers/s390/char/tape_char.c b/drivers/s390/char/tape_char.c index 2125ec7d95f..539045acaad 100644 --- a/drivers/s390/char/tape_char.c +++ b/drivers/s390/char/tape_char.c | |||
| @@ -18,6 +18,7 @@ | |||
| 18 | #include <linux/proc_fs.h> | 18 | #include <linux/proc_fs.h> |
| 19 | #include <linux/mtio.h> | 19 | #include <linux/mtio.h> |
| 20 | #include <linux/smp_lock.h> | 20 | #include <linux/smp_lock.h> |
| 21 | #include <linux/compat.h> | ||
| 21 | 22 | ||
| 22 | #include <asm/uaccess.h> | 23 | #include <asm/uaccess.h> |
| 23 | 24 | ||
| @@ -37,8 +38,9 @@ static ssize_t tapechar_write(struct file *, const char __user *, size_t, loff_t | |||
| 37 | static int tapechar_open(struct inode *,struct file *); | 38 | static int tapechar_open(struct inode *,struct file *); |
| 38 | static int tapechar_release(struct inode *,struct file *); | 39 | static int tapechar_release(struct inode *,struct file *); |
| 39 | static long tapechar_ioctl(struct file *, unsigned int, unsigned long); | 40 | static long tapechar_ioctl(struct file *, unsigned int, unsigned long); |
| 40 | static long tapechar_compat_ioctl(struct file *, unsigned int, | 41 | #ifdef CONFIG_COMPAT |
| 41 | unsigned long); | 42 | static long tapechar_compat_ioctl(struct file *, unsigned int, unsigned long); |
| 43 | #endif | ||
| 42 | 44 | ||
| 43 | static const struct file_operations tape_fops = | 45 | static const struct file_operations tape_fops = |
| 44 | { | 46 | { |
| @@ -46,7 +48,9 @@ static const struct file_operations tape_fops = | |||
| 46 | .read = tapechar_read, | 48 | .read = tapechar_read, |
| 47 | .write = tapechar_write, | 49 | .write = tapechar_write, |
| 48 | .unlocked_ioctl = tapechar_ioctl, | 50 | .unlocked_ioctl = tapechar_ioctl, |
| 51 | #ifdef CONFIG_COMPAT | ||
| 49 | .compat_ioctl = tapechar_compat_ioctl, | 52 | .compat_ioctl = tapechar_compat_ioctl, |
| 53 | #endif | ||
| 50 | .open = tapechar_open, | 54 | .open = tapechar_open, |
| 51 | .release = tapechar_release, | 55 | .release = tapechar_release, |
| 52 | }; | 56 | }; |
| @@ -457,15 +461,22 @@ tapechar_ioctl(struct file *filp, unsigned int no, unsigned long data) | |||
| 457 | return rc; | 461 | return rc; |
| 458 | } | 462 | } |
| 459 | 463 | ||
| 464 | #ifdef CONFIG_COMPAT | ||
| 460 | static long | 465 | static long |
| 461 | tapechar_compat_ioctl(struct file *filp, unsigned int no, unsigned long data) | 466 | tapechar_compat_ioctl(struct file *filp, unsigned int no, unsigned long data) |
| 462 | { | 467 | { |
| 463 | struct tape_device *device = filp->private_data; | 468 | struct tape_device *device = filp->private_data; |
| 464 | int rval = -ENOIOCTLCMD; | 469 | int rval = -ENOIOCTLCMD; |
| 470 | unsigned long argp; | ||
| 465 | 471 | ||
| 472 | /* The 'arg' argument of any ioctl function may only be used for | ||
| 473 | * pointers because of the compat pointer conversion. | ||
| 474 | * Consider this when adding new ioctls. | ||
| 475 | */ | ||
| 476 | argp = (unsigned long) compat_ptr(data); | ||
| 466 | if (device->discipline->ioctl_fn) { | 477 | if (device->discipline->ioctl_fn) { |
| 467 | mutex_lock(&device->mutex); | 478 | mutex_lock(&device->mutex); |
| 468 | rval = device->discipline->ioctl_fn(device, no, data); | 479 | rval = device->discipline->ioctl_fn(device, no, argp); |
| 469 | mutex_unlock(&device->mutex); | 480 | mutex_unlock(&device->mutex); |
| 470 | if (rval == -EINVAL) | 481 | if (rval == -EINVAL) |
| 471 | rval = -ENOIOCTLCMD; | 482 | rval = -ENOIOCTLCMD; |
| @@ -473,6 +484,7 @@ tapechar_compat_ioctl(struct file *filp, unsigned int no, unsigned long data) | |||
| 473 | 484 | ||
| 474 | return rval; | 485 | return rval; |
| 475 | } | 486 | } |
| 487 | #endif /* CONFIG_COMPAT */ | ||
| 476 | 488 | ||
| 477 | /* | 489 | /* |
| 478 | * Initialize character device frontend. | 490 | * Initialize character device frontend. |
diff --git a/drivers/s390/char/vmcp.c b/drivers/s390/char/vmcp.c index a6087cec55b..921dcda7767 100644 --- a/drivers/s390/char/vmcp.c +++ b/drivers/s390/char/vmcp.c | |||
| @@ -19,6 +19,7 @@ | |||
| 19 | #include <linux/kernel.h> | 19 | #include <linux/kernel.h> |
| 20 | #include <linux/miscdevice.h> | 20 | #include <linux/miscdevice.h> |
| 21 | #include <linux/module.h> | 21 | #include <linux/module.h> |
| 22 | #include <asm/compat.h> | ||
| 22 | #include <asm/cpcmd.h> | 23 | #include <asm/cpcmd.h> |
| 23 | #include <asm/debug.h> | 24 | #include <asm/debug.h> |
| 24 | #include <asm/uaccess.h> | 25 | #include <asm/uaccess.h> |
| @@ -139,21 +140,26 @@ vmcp_write(struct file *file, const char __user *buff, size_t count, | |||
| 139 | static long vmcp_ioctl(struct file *file, unsigned int cmd, unsigned long arg) | 140 | static long vmcp_ioctl(struct file *file, unsigned int cmd, unsigned long arg) |
| 140 | { | 141 | { |
| 141 | struct vmcp_session *session; | 142 | struct vmcp_session *session; |
| 143 | int __user *argp; | ||
| 142 | int temp; | 144 | int temp; |
| 143 | 145 | ||
| 144 | session = (struct vmcp_session *)file->private_data; | 146 | session = (struct vmcp_session *)file->private_data; |
| 147 | if (is_compat_task()) | ||
| 148 | argp = compat_ptr(arg); | ||
| 149 | else | ||
| 150 | argp = (int __user *)arg; | ||
| 145 | if (mutex_lock_interruptible(&session->mutex)) | 151 | if (mutex_lock_interruptible(&session->mutex)) |
| 146 | return -ERESTARTSYS; | 152 | return -ERESTARTSYS; |
| 147 | switch (cmd) { | 153 | switch (cmd) { |
| 148 | case VMCP_GETCODE: | 154 | case VMCP_GETCODE: |
| 149 | temp = session->resp_code; | 155 | temp = session->resp_code; |
| 150 | mutex_unlock(&session->mutex); | 156 | mutex_unlock(&session->mutex); |
| 151 | return put_user(temp, (int __user *)arg); | 157 | return put_user(temp, argp); |
| 152 | case VMCP_SETBUF: | 158 | case VMCP_SETBUF: |
| 153 | free_pages((unsigned long)session->response, | 159 | free_pages((unsigned long)session->response, |
| 154 | get_order(session->bufsize)); | 160 | get_order(session->bufsize)); |
| 155 | session->response=NULL; | 161 | session->response=NULL; |
| 156 | temp = get_user(session->bufsize, (int __user *)arg); | 162 | temp = get_user(session->bufsize, argp); |
| 157 | if (get_order(session->bufsize) > 8) { | 163 | if (get_order(session->bufsize) > 8) { |
| 158 | session->bufsize = PAGE_SIZE; | 164 | session->bufsize = PAGE_SIZE; |
| 159 | temp = -EINVAL; | 165 | temp = -EINVAL; |
| @@ -163,7 +169,7 @@ static long vmcp_ioctl(struct file *file, unsigned int cmd, unsigned long arg) | |||
| 163 | case VMCP_GETSIZE: | 169 | case VMCP_GETSIZE: |
| 164 | temp = session->resp_size; | 170 | temp = session->resp_size; |
| 165 | mutex_unlock(&session->mutex); | 171 | mutex_unlock(&session->mutex); |
| 166 | return put_user(temp, (int __user *)arg); | 172 | return put_user(temp, argp); |
| 167 | default: | 173 | default: |
| 168 | mutex_unlock(&session->mutex); | 174 | mutex_unlock(&session->mutex); |
| 169 | return -ENOIOCTLCMD; | 175 | return -ENOIOCTLCMD; |
diff --git a/drivers/s390/cio/chsc_sch.c b/drivers/s390/cio/chsc_sch.c index cc5144b6f9d..c84ac944307 100644 --- a/drivers/s390/cio/chsc_sch.c +++ b/drivers/s390/cio/chsc_sch.c | |||
| @@ -12,6 +12,7 @@ | |||
| 12 | #include <linux/uaccess.h> | 12 | #include <linux/uaccess.h> |
| 13 | #include <linux/miscdevice.h> | 13 | #include <linux/miscdevice.h> |
| 14 | 14 | ||
| 15 | #include <asm/compat.h> | ||
| 15 | #include <asm/cio.h> | 16 | #include <asm/cio.h> |
| 16 | #include <asm/chsc.h> | 17 | #include <asm/chsc.h> |
| 17 | #include <asm/isc.h> | 18 | #include <asm/isc.h> |
| @@ -770,24 +771,30 @@ out_free: | |||
| 770 | static long chsc_ioctl(struct file *filp, unsigned int cmd, | 771 | static long chsc_ioctl(struct file *filp, unsigned int cmd, |
| 771 | unsigned long arg) | 772 | unsigned long arg) |
| 772 | { | 773 | { |
| 774 | void __user *argp; | ||
| 775 | |||
| 773 | CHSC_MSG(2, "chsc_ioctl called, cmd=%x\n", cmd); | 776 | CHSC_MSG(2, "chsc_ioctl called, cmd=%x\n", cmd); |
| 777 | if (is_compat_task()) | ||
| 778 | argp = compat_ptr(arg); | ||
| 779 | else | ||
| 780 | argp = (void __user *)arg; | ||
| 774 | switch (cmd) { | 781 | switch (cmd) { |
| 775 | case CHSC_START: | 782 | case CHSC_START: |
| 776 | return chsc_ioctl_start((void __user *)arg); | 783 | return chsc_ioctl_start(argp); |
| 777 | case CHSC_INFO_CHANNEL_PATH: | 784 | case CHSC_INFO_CHANNEL_PATH: |
| 778 | return chsc_ioctl_info_channel_path((void __user *)arg); | 785 | return chsc_ioctl_info_channel_path(argp); |
| 779 | case CHSC_INFO_CU: | 786 | case CHSC_INFO_CU: |
| 780 | return chsc_ioctl_info_cu((void __user *)arg); | 787 | return chsc_ioctl_info_cu(argp); |
| 781 | case CHSC_INFO_SCH_CU: | 788 | case CHSC_INFO_SCH_CU: |
| 782 | return chsc_ioctl_info_sch_cu((void __user *)arg); | 789 | return chsc_ioctl_info_sch_cu(argp); |
| 783 | case CHSC_INFO_CI: | 790 | case CHSC_INFO_CI: |
| 784 | return chsc_ioctl_conf_info((void __user *)arg); | 791 | return chsc_ioctl_conf_info(argp); |
| 785 | case CHSC_INFO_CCL: | 792 | case CHSC_INFO_CCL: |
| 786 | return chsc_ioctl_conf_comp_list((void __user *)arg); | 793 | return chsc_ioctl_conf_comp_list(argp); |
| 787 | case CHSC_INFO_CPD: | 794 | case CHSC_INFO_CPD: |
| 788 | return chsc_ioctl_chpd((void __user *)arg); | 795 | return chsc_ioctl_chpd(argp); |
| 789 | case CHSC_INFO_DCAL: | 796 | case CHSC_INFO_DCAL: |
| 790 | return chsc_ioctl_dcal((void __user *)arg); | 797 | return chsc_ioctl_dcal(argp); |
| 791 | default: /* unknown ioctl number */ | 798 | default: /* unknown ioctl number */ |
| 792 | return -ENOIOCTLCMD; | 799 | return -ENOIOCTLCMD; |
| 793 | } | 800 | } |
diff --git a/drivers/s390/cio/qdio_main.c b/drivers/s390/cio/qdio_main.c index 999fe80c405..62b654af923 100644 --- a/drivers/s390/cio/qdio_main.c +++ b/drivers/s390/cio/qdio_main.c | |||
| @@ -531,7 +531,7 @@ static inline int qdio_inbound_q_done(struct qdio_q *q) | |||
| 531 | qdio_siga_sync_q(q); | 531 | qdio_siga_sync_q(q); |
| 532 | get_buf_state(q, q->first_to_check, &state, 0); | 532 | get_buf_state(q, q->first_to_check, &state, 0); |
| 533 | 533 | ||
| 534 | if (state == SLSB_P_INPUT_PRIMED) | 534 | if (state == SLSB_P_INPUT_PRIMED || state == SLSB_P_INPUT_ERROR) |
| 535 | /* more work coming */ | 535 | /* more work coming */ |
| 536 | return 0; | 536 | return 0; |
| 537 | 537 | ||
| @@ -960,6 +960,8 @@ void qdio_int_handler(struct ccw_device *cdev, unsigned long intparm, | |||
| 960 | qdio_handle_activate_check(cdev, intparm, cstat, | 960 | qdio_handle_activate_check(cdev, intparm, cstat, |
| 961 | dstat); | 961 | dstat); |
| 962 | break; | 962 | break; |
| 963 | case QDIO_IRQ_STATE_STOPPED: | ||
| 964 | break; | ||
| 963 | default: | 965 | default: |
| 964 | WARN_ON(1); | 966 | WARN_ON(1); |
| 965 | } | 967 | } |
diff --git a/drivers/s390/crypto/zcrypt_api.c b/drivers/s390/crypto/zcrypt_api.c index 0d4d18bdd45..c68be24e27d 100644 --- a/drivers/s390/crypto/zcrypt_api.c +++ b/drivers/s390/crypto/zcrypt_api.c | |||
| @@ -393,10 +393,12 @@ static long zcrypt_rsa_crt(struct ica_rsa_modexpo_crt *crt) | |||
| 393 | * u_mult_inv > 128 bytes. | 393 | * u_mult_inv > 128 bytes. |
| 394 | */ | 394 | */ |
| 395 | if (copied == 0) { | 395 | if (copied == 0) { |
| 396 | int len; | 396 | unsigned int len; |
| 397 | spin_unlock_bh(&zcrypt_device_lock); | 397 | spin_unlock_bh(&zcrypt_device_lock); |
| 398 | /* len is max 256 / 2 - 120 = 8 */ | 398 | /* len is max 256 / 2 - 120 = 8 */ |
| 399 | len = crt->inputdatalength / 2 - 120; | 399 | len = crt->inputdatalength / 2 - 120; |
| 400 | if (len > sizeof(z1)) | ||
| 401 | return -EFAULT; | ||
| 400 | z1 = z2 = z3 = 0; | 402 | z1 = z2 = z3 = 0; |
| 401 | if (copy_from_user(&z1, crt->np_prime, len) || | 403 | if (copy_from_user(&z1, crt->np_prime, len) || |
| 402 | copy_from_user(&z2, crt->bp_key, len) || | 404 | copy_from_user(&z2, crt->bp_key, len) || |
diff --git a/drivers/s390/crypto/zcrypt_pcicc.c b/drivers/s390/crypto/zcrypt_pcicc.c index a23726a0735..142f72a2ca5 100644 --- a/drivers/s390/crypto/zcrypt_pcicc.c +++ b/drivers/s390/crypto/zcrypt_pcicc.c | |||
| @@ -373,6 +373,8 @@ static int convert_type86(struct zcrypt_device *zdev, | |||
| 373 | zdev->max_mod_size = PCICC_MAX_MOD_SIZE_OLD; | 373 | zdev->max_mod_size = PCICC_MAX_MOD_SIZE_OLD; |
| 374 | return -EAGAIN; | 374 | return -EAGAIN; |
| 375 | } | 375 | } |
| 376 | if (service_rc == 8 && service_rs == 72) | ||
| 377 | return -EINVAL; | ||
| 376 | zdev->online = 0; | 378 | zdev->online = 0; |
| 377 | return -EAGAIN; /* repeat the request on a different device. */ | 379 | return -EAGAIN; /* repeat the request on a different device. */ |
| 378 | } | 380 | } |
diff --git a/drivers/s390/crypto/zcrypt_pcixcc.c b/drivers/s390/crypto/zcrypt_pcixcc.c index 79c120578e6..68f3e6204db 100644 --- a/drivers/s390/crypto/zcrypt_pcixcc.c +++ b/drivers/s390/crypto/zcrypt_pcixcc.c | |||
| @@ -470,6 +470,8 @@ static int convert_type86_ica(struct zcrypt_device *zdev, | |||
| 470 | } | 470 | } |
| 471 | if (service_rc == 12 && service_rs == 769) | 471 | if (service_rc == 12 && service_rs == 769) |
| 472 | return -EINVAL; | 472 | return -EINVAL; |
| 473 | if (service_rc == 8 && service_rs == 72) | ||
| 474 | return -EINVAL; | ||
| 473 | zdev->online = 0; | 475 | zdev->online = 0; |
| 474 | return -EAGAIN; /* repeat the request on a different device. */ | 476 | return -EAGAIN; /* repeat the request on a different device. */ |
| 475 | } | 477 | } |
diff --git a/drivers/s390/net/claw.c b/drivers/s390/net/claw.c index 3c77bfe0764..147bb1a69ab 100644 --- a/drivers/s390/net/claw.c +++ b/drivers/s390/net/claw.c | |||
| @@ -3398,7 +3398,7 @@ claw_init(void) | |||
| 3398 | goto out_err; | 3398 | goto out_err; |
| 3399 | } | 3399 | } |
| 3400 | CLAW_DBF_TEXT(2, setup, "init_mod"); | 3400 | CLAW_DBF_TEXT(2, setup, "init_mod"); |
| 3401 | claw_root_dev = root_device_register("qeth"); | 3401 | claw_root_dev = root_device_register("claw"); |
| 3402 | ret = IS_ERR(claw_root_dev) ? PTR_ERR(claw_root_dev) : 0; | 3402 | ret = IS_ERR(claw_root_dev) ? PTR_ERR(claw_root_dev) : 0; |
| 3403 | if (ret) | 3403 | if (ret) |
| 3404 | goto register_err; | 3404 | goto register_err; |
diff --git a/drivers/s390/scsi/zfcp_cfdc.c b/drivers/s390/scsi/zfcp_cfdc.c index f932400e980..0eb6eefd2c1 100644 --- a/drivers/s390/scsi/zfcp_cfdc.c +++ b/drivers/s390/scsi/zfcp_cfdc.c | |||
| @@ -12,6 +12,7 @@ | |||
| 12 | 12 | ||
| 13 | #include <linux/types.h> | 13 | #include <linux/types.h> |
| 14 | #include <linux/miscdevice.h> | 14 | #include <linux/miscdevice.h> |
| 15 | #include <asm/compat.h> | ||
| 15 | #include <asm/ccwdev.h> | 16 | #include <asm/ccwdev.h> |
| 16 | #include "zfcp_def.h" | 17 | #include "zfcp_def.h" |
| 17 | #include "zfcp_ext.h" | 18 | #include "zfcp_ext.h" |
| @@ -163,7 +164,7 @@ static void zfcp_cfdc_req_to_sense(struct zfcp_cfdc_data *data, | |||
| 163 | } | 164 | } |
| 164 | 165 | ||
| 165 | static long zfcp_cfdc_dev_ioctl(struct file *file, unsigned int command, | 166 | static long zfcp_cfdc_dev_ioctl(struct file *file, unsigned int command, |
| 166 | unsigned long buffer) | 167 | unsigned long arg) |
| 167 | { | 168 | { |
| 168 | struct zfcp_cfdc_data *data; | 169 | struct zfcp_cfdc_data *data; |
| 169 | struct zfcp_cfdc_data __user *data_user; | 170 | struct zfcp_cfdc_data __user *data_user; |
| @@ -175,7 +176,11 @@ static long zfcp_cfdc_dev_ioctl(struct file *file, unsigned int command, | |||
| 175 | if (command != ZFCP_CFDC_IOC) | 176 | if (command != ZFCP_CFDC_IOC) |
| 176 | return -ENOTTY; | 177 | return -ENOTTY; |
| 177 | 178 | ||
| 178 | data_user = (void __user *) buffer; | 179 | if (is_compat_task()) |
| 180 | data_user = compat_ptr(arg); | ||
| 181 | else | ||
| 182 | data_user = (void __user *)arg; | ||
| 183 | |||
| 179 | if (!data_user) | 184 | if (!data_user) |
| 180 | return -EINVAL; | 185 | return -EINVAL; |
| 181 | 186 | ||
diff --git a/drivers/s390/scsi/zfcp_dbf.c b/drivers/s390/scsi/zfcp_dbf.c index 84450955ae1..7369c8911bc 100644 --- a/drivers/s390/scsi/zfcp_dbf.c +++ b/drivers/s390/scsi/zfcp_dbf.c | |||
| @@ -327,7 +327,7 @@ static void zfcp_dbf_hba_view_response(char **p, | |||
| 327 | break; | 327 | break; |
| 328 | zfcp_dbf_out(p, "scsi_cmnd", "0x%0Lx", r->u.fcp.cmnd); | 328 | zfcp_dbf_out(p, "scsi_cmnd", "0x%0Lx", r->u.fcp.cmnd); |
| 329 | zfcp_dbf_out(p, "scsi_serial", "0x%016Lx", r->u.fcp.serial); | 329 | zfcp_dbf_out(p, "scsi_serial", "0x%016Lx", r->u.fcp.serial); |
| 330 | p += sprintf(*p, "\n"); | 330 | *p += sprintf(*p, "\n"); |
| 331 | break; | 331 | break; |
| 332 | 332 | ||
| 333 | case FSF_QTCB_OPEN_PORT_WITH_DID: | 333 | case FSF_QTCB_OPEN_PORT_WITH_DID: |
diff --git a/drivers/s390/scsi/zfcp_ext.h b/drivers/s390/scsi/zfcp_ext.h index 03dec832b46..66bdb34143c 100644 --- a/drivers/s390/scsi/zfcp_ext.h +++ b/drivers/s390/scsi/zfcp_ext.h | |||
| @@ -108,6 +108,7 @@ extern void zfcp_fc_wka_ports_force_offline(struct zfcp_fc_wka_ports *); | |||
| 108 | extern int zfcp_fc_gs_setup(struct zfcp_adapter *); | 108 | extern int zfcp_fc_gs_setup(struct zfcp_adapter *); |
| 109 | extern void zfcp_fc_gs_destroy(struct zfcp_adapter *); | 109 | extern void zfcp_fc_gs_destroy(struct zfcp_adapter *); |
| 110 | extern int zfcp_fc_exec_bsg_job(struct fc_bsg_job *); | 110 | extern int zfcp_fc_exec_bsg_job(struct fc_bsg_job *); |
| 111 | extern int zfcp_fc_timeout_bsg_job(struct fc_bsg_job *); | ||
| 111 | 112 | ||
| 112 | /* zfcp_fsf.c */ | 113 | /* zfcp_fsf.c */ |
| 113 | extern int zfcp_fsf_open_port(struct zfcp_erp_action *); | 114 | extern int zfcp_fsf_open_port(struct zfcp_erp_action *); |
| @@ -129,9 +130,9 @@ extern void zfcp_fsf_req_dismiss_all(struct zfcp_adapter *); | |||
| 129 | extern int zfcp_fsf_status_read(struct zfcp_qdio *); | 130 | extern int zfcp_fsf_status_read(struct zfcp_qdio *); |
| 130 | extern int zfcp_status_read_refill(struct zfcp_adapter *adapter); | 131 | extern int zfcp_status_read_refill(struct zfcp_adapter *adapter); |
| 131 | extern int zfcp_fsf_send_ct(struct zfcp_fc_wka_port *, struct zfcp_fsf_ct_els *, | 132 | extern int zfcp_fsf_send_ct(struct zfcp_fc_wka_port *, struct zfcp_fsf_ct_els *, |
| 132 | mempool_t *); | 133 | mempool_t *, unsigned int); |
| 133 | extern int zfcp_fsf_send_els(struct zfcp_adapter *, u32, | 134 | extern int zfcp_fsf_send_els(struct zfcp_adapter *, u32, |
| 134 | struct zfcp_fsf_ct_els *); | 135 | struct zfcp_fsf_ct_els *, unsigned int); |
| 135 | extern int zfcp_fsf_send_fcp_command_task(struct zfcp_unit *, | 136 | extern int zfcp_fsf_send_fcp_command_task(struct zfcp_unit *, |
| 136 | struct scsi_cmnd *); | 137 | struct scsi_cmnd *); |
| 137 | extern void zfcp_fsf_req_free(struct zfcp_fsf_req *); | 138 | extern void zfcp_fsf_req_free(struct zfcp_fsf_req *); |
diff --git a/drivers/s390/scsi/zfcp_fc.c b/drivers/s390/scsi/zfcp_fc.c index ac5e3b7a357..271399f62f1 100644 --- a/drivers/s390/scsi/zfcp_fc.c +++ b/drivers/s390/scsi/zfcp_fc.c | |||
| @@ -258,7 +258,8 @@ static int zfcp_fc_ns_gid_pn_request(struct zfcp_port *port, | |||
| 258 | gid_pn->gid_pn_req.gid_pn.fn_wwpn = port->wwpn; | 258 | gid_pn->gid_pn_req.gid_pn.fn_wwpn = port->wwpn; |
| 259 | 259 | ||
| 260 | ret = zfcp_fsf_send_ct(&adapter->gs->ds, &gid_pn->ct, | 260 | ret = zfcp_fsf_send_ct(&adapter->gs->ds, &gid_pn->ct, |
| 261 | adapter->pool.gid_pn_req); | 261 | adapter->pool.gid_pn_req, |
| 262 | ZFCP_FC_CTELS_TMO); | ||
| 262 | if (!ret) { | 263 | if (!ret) { |
| 263 | wait_for_completion(&completion); | 264 | wait_for_completion(&completion); |
| 264 | zfcp_fc_ns_gid_pn_eval(gid_pn); | 265 | zfcp_fc_ns_gid_pn_eval(gid_pn); |
| @@ -421,7 +422,8 @@ static int zfcp_fc_adisc(struct zfcp_port *port) | |||
| 421 | hton24(adisc->adisc_req.adisc_port_id, | 422 | hton24(adisc->adisc_req.adisc_port_id, |
| 422 | fc_host_port_id(adapter->scsi_host)); | 423 | fc_host_port_id(adapter->scsi_host)); |
| 423 | 424 | ||
| 424 | ret = zfcp_fsf_send_els(adapter, port->d_id, &adisc->els); | 425 | ret = zfcp_fsf_send_els(adapter, port->d_id, &adisc->els, |
| 426 | ZFCP_FC_CTELS_TMO); | ||
| 425 | if (ret) | 427 | if (ret) |
| 426 | kmem_cache_free(zfcp_data.adisc_cache, adisc); | 428 | kmem_cache_free(zfcp_data.adisc_cache, adisc); |
| 427 | 429 | ||
| @@ -532,7 +534,8 @@ static int zfcp_fc_send_gpn_ft(struct zfcp_fc_gpn_ft *gpn_ft, | |||
| 532 | ct->req = &gpn_ft->sg_req; | 534 | ct->req = &gpn_ft->sg_req; |
| 533 | ct->resp = gpn_ft->sg_resp; | 535 | ct->resp = gpn_ft->sg_resp; |
| 534 | 536 | ||
| 535 | ret = zfcp_fsf_send_ct(&adapter->gs->ds, ct, NULL); | 537 | ret = zfcp_fsf_send_ct(&adapter->gs->ds, ct, NULL, |
| 538 | ZFCP_FC_CTELS_TMO); | ||
| 536 | if (!ret) | 539 | if (!ret) |
| 537 | wait_for_completion(&completion); | 540 | wait_for_completion(&completion); |
| 538 | return ret; | 541 | return ret; |
| @@ -668,15 +671,52 @@ static void zfcp_fc_ct_els_job_handler(void *data) | |||
| 668 | { | 671 | { |
| 669 | struct fc_bsg_job *job = data; | 672 | struct fc_bsg_job *job = data; |
| 670 | struct zfcp_fsf_ct_els *zfcp_ct_els = job->dd_data; | 673 | struct zfcp_fsf_ct_els *zfcp_ct_els = job->dd_data; |
| 671 | int status = zfcp_ct_els->status; | 674 | struct fc_bsg_reply *jr = job->reply; |
| 672 | int reply_status; | ||
| 673 | 675 | ||
| 674 | reply_status = status ? FC_CTELS_STATUS_REJECT : FC_CTELS_STATUS_OK; | 676 | jr->reply_payload_rcv_len = job->reply_payload.payload_len; |
| 675 | job->reply->reply_data.ctels_reply.status = reply_status; | 677 | jr->reply_data.ctels_reply.status = FC_CTELS_STATUS_OK; |
| 676 | job->reply->reply_payload_rcv_len = job->reply_payload.payload_len; | 678 | jr->result = zfcp_ct_els->status ? -EIO : 0; |
| 677 | job->job_done(job); | 679 | job->job_done(job); |
| 678 | } | 680 | } |
| 679 | 681 | ||
| 682 | static struct zfcp_fc_wka_port *zfcp_fc_job_wka_port(struct fc_bsg_job *job) | ||
| 683 | { | ||
| 684 | u32 preamble_word1; | ||
| 685 | u8 gs_type; | ||
| 686 | struct zfcp_adapter *adapter; | ||
| 687 | |||
| 688 | preamble_word1 = job->request->rqst_data.r_ct.preamble_word1; | ||
| 689 | gs_type = (preamble_word1 & 0xff000000) >> 24; | ||
| 690 | |||
| 691 | adapter = (struct zfcp_adapter *) job->shost->hostdata[0]; | ||
| 692 | |||
| 693 | switch (gs_type) { | ||
| 694 | case FC_FST_ALIAS: | ||
| 695 | return &adapter->gs->as; | ||
| 696 | case FC_FST_MGMT: | ||
| 697 | return &adapter->gs->ms; | ||
| 698 | case FC_FST_TIME: | ||
| 699 | return &adapter->gs->ts; | ||
| 700 | break; | ||
| 701 | case FC_FST_DIR: | ||
| 702 | return &adapter->gs->ds; | ||
| 703 | break; | ||
| 704 | default: | ||
| 705 | return NULL; | ||
| 706 | } | ||
| 707 | } | ||
| 708 | |||
| 709 | static void zfcp_fc_ct_job_handler(void *data) | ||
| 710 | { | ||
| 711 | struct fc_bsg_job *job = data; | ||
| 712 | struct zfcp_fc_wka_port *wka_port; | ||
| 713 | |||
| 714 | wka_port = zfcp_fc_job_wka_port(job); | ||
| 715 | zfcp_fc_wka_port_put(wka_port); | ||
| 716 | |||
| 717 | zfcp_fc_ct_els_job_handler(data); | ||
| 718 | } | ||
| 719 | |||
| 680 | static int zfcp_fc_exec_els_job(struct fc_bsg_job *job, | 720 | static int zfcp_fc_exec_els_job(struct fc_bsg_job *job, |
| 681 | struct zfcp_adapter *adapter) | 721 | struct zfcp_adapter *adapter) |
| 682 | { | 722 | { |
| @@ -695,43 +735,27 @@ static int zfcp_fc_exec_els_job(struct fc_bsg_job *job, | |||
| 695 | } else | 735 | } else |
| 696 | d_id = ntoh24(job->request->rqst_data.h_els.port_id); | 736 | d_id = ntoh24(job->request->rqst_data.h_els.port_id); |
| 697 | 737 | ||
| 698 | return zfcp_fsf_send_els(adapter, d_id, els); | 738 | els->handler = zfcp_fc_ct_els_job_handler; |
| 739 | return zfcp_fsf_send_els(adapter, d_id, els, job->req->timeout / HZ); | ||
| 699 | } | 740 | } |
| 700 | 741 | ||
| 701 | static int zfcp_fc_exec_ct_job(struct fc_bsg_job *job, | 742 | static int zfcp_fc_exec_ct_job(struct fc_bsg_job *job, |
| 702 | struct zfcp_adapter *adapter) | 743 | struct zfcp_adapter *adapter) |
| 703 | { | 744 | { |
| 704 | int ret; | 745 | int ret; |
| 705 | u8 gs_type; | ||
| 706 | struct zfcp_fsf_ct_els *ct = job->dd_data; | 746 | struct zfcp_fsf_ct_els *ct = job->dd_data; |
| 707 | struct zfcp_fc_wka_port *wka_port; | 747 | struct zfcp_fc_wka_port *wka_port; |
| 708 | u32 preamble_word1; | ||
| 709 | 748 | ||
| 710 | preamble_word1 = job->request->rqst_data.r_ct.preamble_word1; | 749 | wka_port = zfcp_fc_job_wka_port(job); |
| 711 | gs_type = (preamble_word1 & 0xff000000) >> 24; | 750 | if (!wka_port) |
| 712 | 751 | return -EINVAL; | |
| 713 | switch (gs_type) { | ||
| 714 | case FC_FST_ALIAS: | ||
| 715 | wka_port = &adapter->gs->as; | ||
| 716 | break; | ||
| 717 | case FC_FST_MGMT: | ||
| 718 | wka_port = &adapter->gs->ms; | ||
| 719 | break; | ||
| 720 | case FC_FST_TIME: | ||
| 721 | wka_port = &adapter->gs->ts; | ||
| 722 | break; | ||
| 723 | case FC_FST_DIR: | ||
| 724 | wka_port = &adapter->gs->ds; | ||
| 725 | break; | ||
| 726 | default: | ||
| 727 | return -EINVAL; /* no such service */ | ||
| 728 | } | ||
| 729 | 752 | ||
| 730 | ret = zfcp_fc_wka_port_get(wka_port); | 753 | ret = zfcp_fc_wka_port_get(wka_port); |
| 731 | if (ret) | 754 | if (ret) |
| 732 | return ret; | 755 | return ret; |
| 733 | 756 | ||
| 734 | ret = zfcp_fsf_send_ct(wka_port, ct, NULL); | 757 | ct->handler = zfcp_fc_ct_job_handler; |
| 758 | ret = zfcp_fsf_send_ct(wka_port, ct, NULL, job->req->timeout / HZ); | ||
| 735 | if (ret) | 759 | if (ret) |
| 736 | zfcp_fc_wka_port_put(wka_port); | 760 | zfcp_fc_wka_port_put(wka_port); |
| 737 | 761 | ||
| @@ -752,7 +776,6 @@ int zfcp_fc_exec_bsg_job(struct fc_bsg_job *job) | |||
| 752 | 776 | ||
| 753 | ct_els->req = job->request_payload.sg_list; | 777 | ct_els->req = job->request_payload.sg_list; |
| 754 | ct_els->resp = job->reply_payload.sg_list; | 778 | ct_els->resp = job->reply_payload.sg_list; |
| 755 | ct_els->handler = zfcp_fc_ct_els_job_handler; | ||
| 756 | ct_els->handler_data = job; | 779 | ct_els->handler_data = job; |
| 757 | 780 | ||
| 758 | switch (job->request->msgcode) { | 781 | switch (job->request->msgcode) { |
| @@ -767,6 +790,12 @@ int zfcp_fc_exec_bsg_job(struct fc_bsg_job *job) | |||
| 767 | } | 790 | } |
| 768 | } | 791 | } |
| 769 | 792 | ||
| 793 | int zfcp_fc_timeout_bsg_job(struct fc_bsg_job *job) | ||
| 794 | { | ||
| 795 | /* hardware tracks timeout, reset bsg timeout to not interfere */ | ||
| 796 | return -EAGAIN; | ||
| 797 | } | ||
| 798 | |||
| 770 | int zfcp_fc_gs_setup(struct zfcp_adapter *adapter) | 799 | int zfcp_fc_gs_setup(struct zfcp_adapter *adapter) |
| 771 | { | 800 | { |
| 772 | struct zfcp_fc_wka_ports *wka_ports; | 801 | struct zfcp_fc_wka_ports *wka_ports; |
diff --git a/drivers/s390/scsi/zfcp_fc.h b/drivers/s390/scsi/zfcp_fc.h index cb2a3669a38..0747b087390 100644 --- a/drivers/s390/scsi/zfcp_fc.h +++ b/drivers/s390/scsi/zfcp_fc.h | |||
| @@ -27,6 +27,8 @@ | |||
| 27 | #define ZFCP_FC_GPN_FT_MAX_ENT (ZFCP_FC_GPN_FT_NUM_BUFS * \ | 27 | #define ZFCP_FC_GPN_FT_MAX_ENT (ZFCP_FC_GPN_FT_NUM_BUFS * \ |
| 28 | (ZFCP_FC_GPN_FT_ENT_PAGE + 1)) | 28 | (ZFCP_FC_GPN_FT_ENT_PAGE + 1)) |
| 29 | 29 | ||
| 30 | #define ZFCP_FC_CTELS_TMO (2 * FC_DEF_R_A_TOV / 1000) | ||
| 31 | |||
| 30 | /** | 32 | /** |
| 31 | * struct zfcp_fc_gid_pn_req - container for ct header plus gid_pn request | 33 | * struct zfcp_fc_gid_pn_req - container for ct header plus gid_pn request |
| 32 | * @ct_hdr: FC GS common transport header | 34 | * @ct_hdr: FC GS common transport header |
diff --git a/drivers/s390/scsi/zfcp_fsf.c b/drivers/s390/scsi/zfcp_fsf.c index 482dcd97aa5..e8fb4d9baa8 100644 --- a/drivers/s390/scsi/zfcp_fsf.c +++ b/drivers/s390/scsi/zfcp_fsf.c | |||
| @@ -1068,20 +1068,20 @@ static int zfcp_fsf_setup_ct_els_sbals(struct zfcp_fsf_req *req, | |||
| 1068 | static int zfcp_fsf_setup_ct_els(struct zfcp_fsf_req *req, | 1068 | static int zfcp_fsf_setup_ct_els(struct zfcp_fsf_req *req, |
| 1069 | struct scatterlist *sg_req, | 1069 | struct scatterlist *sg_req, |
| 1070 | struct scatterlist *sg_resp, | 1070 | struct scatterlist *sg_resp, |
| 1071 | int max_sbals) | 1071 | int max_sbals, unsigned int timeout) |
| 1072 | { | 1072 | { |
| 1073 | int ret; | 1073 | int ret; |
| 1074 | unsigned int fcp_chan_timeout; | ||
| 1075 | 1074 | ||
| 1076 | ret = zfcp_fsf_setup_ct_els_sbals(req, sg_req, sg_resp, max_sbals); | 1075 | ret = zfcp_fsf_setup_ct_els_sbals(req, sg_req, sg_resp, max_sbals); |
| 1077 | if (ret) | 1076 | if (ret) |
| 1078 | return ret; | 1077 | return ret; |
| 1079 | 1078 | ||
| 1080 | /* common settings for ct/gs and els requests */ | 1079 | /* common settings for ct/gs and els requests */ |
| 1081 | fcp_chan_timeout = 2 * FC_DEF_R_A_TOV / 1000; | 1080 | if (timeout > 255) |
| 1081 | timeout = 255; /* max value accepted by hardware */ | ||
| 1082 | req->qtcb->bottom.support.service_class = FSF_CLASS_3; | 1082 | req->qtcb->bottom.support.service_class = FSF_CLASS_3; |
| 1083 | req->qtcb->bottom.support.timeout = fcp_chan_timeout; | 1083 | req->qtcb->bottom.support.timeout = timeout; |
| 1084 | zfcp_fsf_start_timer(req, (fcp_chan_timeout + 10) * HZ); | 1084 | zfcp_fsf_start_timer(req, (timeout + 10) * HZ); |
| 1085 | 1085 | ||
| 1086 | return 0; | 1086 | return 0; |
| 1087 | } | 1087 | } |
| @@ -1092,7 +1092,8 @@ static int zfcp_fsf_setup_ct_els(struct zfcp_fsf_req *req, | |||
| 1092 | * @pool: if non-null this mempool is used to allocate struct zfcp_fsf_req | 1092 | * @pool: if non-null this mempool is used to allocate struct zfcp_fsf_req |
| 1093 | */ | 1093 | */ |
| 1094 | int zfcp_fsf_send_ct(struct zfcp_fc_wka_port *wka_port, | 1094 | int zfcp_fsf_send_ct(struct zfcp_fc_wka_port *wka_port, |
| 1095 | struct zfcp_fsf_ct_els *ct, mempool_t *pool) | 1095 | struct zfcp_fsf_ct_els *ct, mempool_t *pool, |
| 1096 | unsigned int timeout) | ||
| 1096 | { | 1097 | { |
| 1097 | struct zfcp_qdio *qdio = wka_port->adapter->qdio; | 1098 | struct zfcp_qdio *qdio = wka_port->adapter->qdio; |
| 1098 | struct zfcp_fsf_req *req; | 1099 | struct zfcp_fsf_req *req; |
| @@ -1111,7 +1112,7 @@ int zfcp_fsf_send_ct(struct zfcp_fc_wka_port *wka_port, | |||
| 1111 | 1112 | ||
| 1112 | req->status |= ZFCP_STATUS_FSFREQ_CLEANUP; | 1113 | req->status |= ZFCP_STATUS_FSFREQ_CLEANUP; |
| 1113 | ret = zfcp_fsf_setup_ct_els(req, ct->req, ct->resp, | 1114 | ret = zfcp_fsf_setup_ct_els(req, ct->req, ct->resp, |
| 1114 | FSF_MAX_SBALS_PER_REQ); | 1115 | FSF_MAX_SBALS_PER_REQ, timeout); |
| 1115 | if (ret) | 1116 | if (ret) |
| 1116 | goto failed_send; | 1117 | goto failed_send; |
| 1117 | 1118 | ||
| @@ -1188,7 +1189,7 @@ skip_fsfstatus: | |||
| 1188 | * @els: pointer to struct zfcp_send_els with data for the command | 1189 | * @els: pointer to struct zfcp_send_els with data for the command |
| 1189 | */ | 1190 | */ |
| 1190 | int zfcp_fsf_send_els(struct zfcp_adapter *adapter, u32 d_id, | 1191 | int zfcp_fsf_send_els(struct zfcp_adapter *adapter, u32 d_id, |
| 1191 | struct zfcp_fsf_ct_els *els) | 1192 | struct zfcp_fsf_ct_els *els, unsigned int timeout) |
| 1192 | { | 1193 | { |
| 1193 | struct zfcp_fsf_req *req; | 1194 | struct zfcp_fsf_req *req; |
| 1194 | struct zfcp_qdio *qdio = adapter->qdio; | 1195 | struct zfcp_qdio *qdio = adapter->qdio; |
| @@ -1206,7 +1207,7 @@ int zfcp_fsf_send_els(struct zfcp_adapter *adapter, u32 d_id, | |||
| 1206 | } | 1207 | } |
| 1207 | 1208 | ||
| 1208 | req->status |= ZFCP_STATUS_FSFREQ_CLEANUP; | 1209 | req->status |= ZFCP_STATUS_FSFREQ_CLEANUP; |
| 1209 | ret = zfcp_fsf_setup_ct_els(req, els->req, els->resp, 2); | 1210 | ret = zfcp_fsf_setup_ct_els(req, els->req, els->resp, 2, timeout); |
| 1210 | 1211 | ||
| 1211 | if (ret) | 1212 | if (ret) |
| 1212 | goto failed_send; | 1213 | goto failed_send; |
diff --git a/drivers/s390/scsi/zfcp_scsi.c b/drivers/s390/scsi/zfcp_scsi.c index 771cc536a98..8e6fc68d6bd 100644 --- a/drivers/s390/scsi/zfcp_scsi.c +++ b/drivers/s390/scsi/zfcp_scsi.c | |||
| @@ -652,6 +652,7 @@ struct fc_function_template zfcp_transport_functions = { | |||
| 652 | .show_host_port_state = 1, | 652 | .show_host_port_state = 1, |
| 653 | .show_host_active_fc4s = 1, | 653 | .show_host_active_fc4s = 1, |
| 654 | .bsg_request = zfcp_fc_exec_bsg_job, | 654 | .bsg_request = zfcp_fc_exec_bsg_job, |
| 655 | .bsg_timeout = zfcp_fc_timeout_bsg_job, | ||
| 655 | /* no functions registered for following dynamic attributes but | 656 | /* no functions registered for following dynamic attributes but |
| 656 | directly set by LLDD */ | 657 | directly set by LLDD */ |
| 657 | .show_host_port_type = 1, | 658 | .show_host_port_type = 1, |
