diff options
| author | Linus Torvalds <torvalds@g5.osdl.org> | 2006-10-28 14:38:39 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-10-28 14:38:39 -0400 |
| commit | 2da6dc28867b6cad6181291ed03093a487587d61 (patch) | |
| tree | b69255137267b8ac217705d2c19eb30ff2cdfc0d | |
| parent | 0c6cb974636dd29681b03f8eb0ae227decab01fb (diff) | |
| parent | 3c9da7ba049d11caccc219576a3a23404aa2fc50 (diff) | |
Merge branch 'for-linus' of git://git390.osdl.marist.edu/pub/scm/linux-2.6
* 'for-linus' of git://git390.osdl.marist.edu/pub/scm/linux-2.6:
[S390] cio: Make ccw_device_register() static.
[S390] Improve AP bus device removal.
[S390] uaccess error handling.
[S390] cio: css_probe_device() must be called enabled.
[S390] Initialize interval value to 0.
[S390] sys_getcpu compat wrapper.
| -rw-r--r-- | arch/s390/appldata/appldata_base.c | 1 | ||||
| -rw-r--r-- | arch/s390/kernel/compat_linux.c | 4 | ||||
| -rw-r--r-- | arch/s390/kernel/compat_signal.c | 12 | ||||
| -rw-r--r-- | arch/s390/kernel/compat_wrapper.S | 2 | ||||
| -rw-r--r-- | arch/s390/kernel/signal.c | 12 | ||||
| -rw-r--r-- | arch/s390/kernel/traps.c | 20 | ||||
| -rw-r--r-- | drivers/s390/cio/css.c | 7 | ||||
| -rw-r--r-- | drivers/s390/cio/device.c | 3 | ||||
| -rw-r--r-- | drivers/s390/cio/device.h | 1 | ||||
| -rw-r--r-- | drivers/s390/crypto/ap_bus.c | 7 |
10 files changed, 40 insertions, 29 deletions
diff --git a/arch/s390/appldata/appldata_base.c b/arch/s390/appldata/appldata_base.c index 45c9fa7d7545..af1e8fc7d985 100644 --- a/arch/s390/appldata/appldata_base.c +++ b/arch/s390/appldata/appldata_base.c | |||
| @@ -310,6 +310,7 @@ appldata_interval_handler(ctl_table *ctl, int write, struct file *filp, | |||
| 310 | if (copy_from_user(buf, buffer, len > sizeof(buf) ? sizeof(buf) : len)) { | 310 | if (copy_from_user(buf, buffer, len > sizeof(buf) ? sizeof(buf) : len)) { |
| 311 | return -EFAULT; | 311 | return -EFAULT; |
| 312 | } | 312 | } |
| 313 | interval = 0; | ||
| 313 | sscanf(buf, "%i", &interval); | 314 | sscanf(buf, "%i", &interval); |
| 314 | if (interval <= 0) { | 315 | if (interval <= 0) { |
| 315 | P_ERROR("Timer CPU interval has to be > 0!\n"); | 316 | P_ERROR("Timer CPU interval has to be > 0!\n"); |
diff --git a/arch/s390/kernel/compat_linux.c b/arch/s390/kernel/compat_linux.c index 2001767e1dc7..5b33f823863a 100644 --- a/arch/s390/kernel/compat_linux.c +++ b/arch/s390/kernel/compat_linux.c | |||
| @@ -757,7 +757,9 @@ asmlinkage long sys32_sysctl(struct __sysctl_args32 __user *args) | |||
| 757 | put_user(oldlen, (u32 __user *)compat_ptr(tmp.oldlenp))) | 757 | put_user(oldlen, (u32 __user *)compat_ptr(tmp.oldlenp))) |
| 758 | error = -EFAULT; | 758 | error = -EFAULT; |
| 759 | } | 759 | } |
| 760 | copy_to_user(args->__unused, tmp.__unused, sizeof(tmp.__unused)); | 760 | if (copy_to_user(args->__unused, tmp.__unused, |
| 761 | sizeof(tmp.__unused))) | ||
| 762 | error = -EFAULT; | ||
| 761 | } | 763 | } |
| 762 | return error; | 764 | return error; |
| 763 | } | 765 | } |
diff --git a/arch/s390/kernel/compat_signal.c b/arch/s390/kernel/compat_signal.c index d49b876a83bf..861888ab8c13 100644 --- a/arch/s390/kernel/compat_signal.c +++ b/arch/s390/kernel/compat_signal.c | |||
| @@ -169,12 +169,12 @@ sys32_sigaction(int sig, const struct old_sigaction32 __user *act, | |||
| 169 | compat_old_sigset_t mask; | 169 | compat_old_sigset_t mask; |
| 170 | if (!access_ok(VERIFY_READ, act, sizeof(*act)) || | 170 | if (!access_ok(VERIFY_READ, act, sizeof(*act)) || |
| 171 | __get_user(sa_handler, &act->sa_handler) || | 171 | __get_user(sa_handler, &act->sa_handler) || |
| 172 | __get_user(sa_restorer, &act->sa_restorer)) | 172 | __get_user(sa_restorer, &act->sa_restorer) || |
| 173 | __get_user(new_ka.sa.sa_flags, &act->sa_flags) || | ||
| 174 | __get_user(mask, &act->sa_mask)) | ||
| 173 | return -EFAULT; | 175 | return -EFAULT; |
| 174 | new_ka.sa.sa_handler = (__sighandler_t) sa_handler; | 176 | new_ka.sa.sa_handler = (__sighandler_t) sa_handler; |
| 175 | new_ka.sa.sa_restorer = (void (*)(void)) sa_restorer; | 177 | new_ka.sa.sa_restorer = (void (*)(void)) sa_restorer; |
| 176 | __get_user(new_ka.sa.sa_flags, &act->sa_flags); | ||
| 177 | __get_user(mask, &act->sa_mask); | ||
| 178 | siginitset(&new_ka.sa.sa_mask, mask); | 178 | siginitset(&new_ka.sa.sa_mask, mask); |
| 179 | } | 179 | } |
| 180 | 180 | ||
| @@ -185,10 +185,10 @@ sys32_sigaction(int sig, const struct old_sigaction32 __user *act, | |||
| 185 | sa_restorer = (unsigned long) old_ka.sa.sa_restorer; | 185 | sa_restorer = (unsigned long) old_ka.sa.sa_restorer; |
| 186 | if (!access_ok(VERIFY_WRITE, oact, sizeof(*oact)) || | 186 | if (!access_ok(VERIFY_WRITE, oact, sizeof(*oact)) || |
| 187 | __put_user(sa_handler, &oact->sa_handler) || | 187 | __put_user(sa_handler, &oact->sa_handler) || |
| 188 | __put_user(sa_restorer, &oact->sa_restorer)) | 188 | __put_user(sa_restorer, &oact->sa_restorer) || |
| 189 | __put_user(old_ka.sa.sa_flags, &oact->sa_flags) || | ||
| 190 | __put_user(old_ka.sa.sa_mask.sig[0], &oact->sa_mask)) | ||
| 189 | return -EFAULT; | 191 | return -EFAULT; |
| 190 | __put_user(old_ka.sa.sa_flags, &oact->sa_flags); | ||
| 191 | __put_user(old_ka.sa.sa_mask.sig[0], &oact->sa_mask); | ||
| 192 | } | 192 | } |
| 193 | 193 | ||
| 194 | return ret; | 194 | return ret; |
diff --git a/arch/s390/kernel/compat_wrapper.S b/arch/s390/kernel/compat_wrapper.S index cb0efae6802f..71e54ef0931e 100644 --- a/arch/s390/kernel/compat_wrapper.S +++ b/arch/s390/kernel/compat_wrapper.S | |||
| @@ -1664,4 +1664,4 @@ sys_getcpu_wrapper: | |||
| 1664 | llgtr %r2,%r2 # unsigned * | 1664 | llgtr %r2,%r2 # unsigned * |
| 1665 | llgtr %r3,%r3 # unsigned * | 1665 | llgtr %r3,%r3 # unsigned * |
| 1666 | llgtr %r4,%r4 # struct getcpu_cache * | 1666 | llgtr %r4,%r4 # struct getcpu_cache * |
| 1667 | jg sys_tee | 1667 | jg sys_getcpu |
diff --git a/arch/s390/kernel/signal.c b/arch/s390/kernel/signal.c index 4392a77cbae8..4c8a7954ef48 100644 --- a/arch/s390/kernel/signal.c +++ b/arch/s390/kernel/signal.c | |||
| @@ -80,10 +80,10 @@ sys_sigaction(int sig, const struct old_sigaction __user *act, | |||
| 80 | old_sigset_t mask; | 80 | old_sigset_t mask; |
| 81 | if (!access_ok(VERIFY_READ, act, sizeof(*act)) || | 81 | if (!access_ok(VERIFY_READ, act, sizeof(*act)) || |
| 82 | __get_user(new_ka.sa.sa_handler, &act->sa_handler) || | 82 | __get_user(new_ka.sa.sa_handler, &act->sa_handler) || |
| 83 | __get_user(new_ka.sa.sa_restorer, &act->sa_restorer)) | 83 | __get_user(new_ka.sa.sa_restorer, &act->sa_restorer) || |
| 84 | __get_user(new_ka.sa.sa_flags, &act->sa_flags) || | ||
| 85 | __get_user(mask, &act->sa_mask)) | ||
| 84 | return -EFAULT; | 86 | return -EFAULT; |
| 85 | __get_user(new_ka.sa.sa_flags, &act->sa_flags); | ||
| 86 | __get_user(mask, &act->sa_mask); | ||
| 87 | siginitset(&new_ka.sa.sa_mask, mask); | 87 | siginitset(&new_ka.sa.sa_mask, mask); |
| 88 | } | 88 | } |
| 89 | 89 | ||
| @@ -92,10 +92,10 @@ sys_sigaction(int sig, const struct old_sigaction __user *act, | |||
| 92 | if (!ret && oact) { | 92 | if (!ret && oact) { |
| 93 | if (!access_ok(VERIFY_WRITE, oact, sizeof(*oact)) || | 93 | if (!access_ok(VERIFY_WRITE, oact, sizeof(*oact)) || |
| 94 | __put_user(old_ka.sa.sa_handler, &oact->sa_handler) || | 94 | __put_user(old_ka.sa.sa_handler, &oact->sa_handler) || |
| 95 | __put_user(old_ka.sa.sa_restorer, &oact->sa_restorer)) | 95 | __put_user(old_ka.sa.sa_restorer, &oact->sa_restorer) || |
| 96 | __put_user(old_ka.sa.sa_flags, &oact->sa_flags) || | ||
| 97 | __put_user(old_ka.sa.sa_mask.sig[0], &oact->sa_mask)) | ||
| 96 | return -EFAULT; | 98 | return -EFAULT; |
| 97 | __put_user(old_ka.sa.sa_flags, &oact->sa_flags); | ||
| 98 | __put_user(old_ka.sa.sa_mask.sig[0], &oact->sa_mask); | ||
| 99 | } | 99 | } |
| 100 | 100 | ||
| 101 | return ret; | 101 | return ret; |
diff --git a/arch/s390/kernel/traps.c b/arch/s390/kernel/traps.c index 66375a5e3d12..92ecffbc8d82 100644 --- a/arch/s390/kernel/traps.c +++ b/arch/s390/kernel/traps.c | |||
| @@ -462,7 +462,8 @@ asmlinkage void illegal_op(struct pt_regs * regs, long interruption_code) | |||
| 462 | local_irq_enable(); | 462 | local_irq_enable(); |
| 463 | 463 | ||
| 464 | if (regs->psw.mask & PSW_MASK_PSTATE) { | 464 | if (regs->psw.mask & PSW_MASK_PSTATE) { |
| 465 | get_user(*((__u16 *) opcode), (__u16 __user *) location); | 465 | if (get_user(*((__u16 *) opcode), (__u16 __user *) location)) |
| 466 | return; | ||
| 466 | if (*((__u16 *) opcode) == S390_BREAKPOINT_U16) { | 467 | if (*((__u16 *) opcode) == S390_BREAKPOINT_U16) { |
| 467 | if (current->ptrace & PT_PTRACED) | 468 | if (current->ptrace & PT_PTRACED) |
| 468 | force_sig(SIGTRAP, current); | 469 | force_sig(SIGTRAP, current); |
| @@ -470,20 +471,25 @@ asmlinkage void illegal_op(struct pt_regs * regs, long interruption_code) | |||
| 470 | signal = SIGILL; | 471 | signal = SIGILL; |
| 471 | #ifdef CONFIG_MATHEMU | 472 | #ifdef CONFIG_MATHEMU |
| 472 | } else if (opcode[0] == 0xb3) { | 473 | } else if (opcode[0] == 0xb3) { |
| 473 | get_user(*((__u16 *) (opcode+2)), location+1); | 474 | if (get_user(*((__u16 *) (opcode+2)), location+1)) |
| 475 | return; | ||
| 474 | signal = math_emu_b3(opcode, regs); | 476 | signal = math_emu_b3(opcode, regs); |
| 475 | } else if (opcode[0] == 0xed) { | 477 | } else if (opcode[0] == 0xed) { |
| 476 | get_user(*((__u32 *) (opcode+2)), | 478 | if (get_user(*((__u32 *) (opcode+2)), |
| 477 | (__u32 __user *)(location+1)); | 479 | (__u32 __user *)(location+1))) |
| 480 | return; | ||
| 478 | signal = math_emu_ed(opcode, regs); | 481 | signal = math_emu_ed(opcode, regs); |
| 479 | } else if (*((__u16 *) opcode) == 0xb299) { | 482 | } else if (*((__u16 *) opcode) == 0xb299) { |
| 480 | get_user(*((__u16 *) (opcode+2)), location+1); | 483 | if (get_user(*((__u16 *) (opcode+2)), location+1)) |
| 484 | return; | ||
| 481 | signal = math_emu_srnm(opcode, regs); | 485 | signal = math_emu_srnm(opcode, regs); |
| 482 | } else if (*((__u16 *) opcode) == 0xb29c) { | 486 | } else if (*((__u16 *) opcode) == 0xb29c) { |
| 483 | get_user(*((__u16 *) (opcode+2)), location+1); | 487 | if (get_user(*((__u16 *) (opcode+2)), location+1)) |
| 488 | return; | ||
| 484 | signal = math_emu_stfpc(opcode, regs); | 489 | signal = math_emu_stfpc(opcode, regs); |
| 485 | } else if (*((__u16 *) opcode) == 0xb29d) { | 490 | } else if (*((__u16 *) opcode) == 0xb29d) { |
| 486 | get_user(*((__u16 *) (opcode+2)), location+1); | 491 | if (get_user(*((__u16 *) (opcode+2)), location+1)) |
| 492 | return; | ||
| 487 | signal = math_emu_lfpc(opcode, regs); | 493 | signal = math_emu_lfpc(opcode, regs); |
| 488 | #endif | 494 | #endif |
| 489 | } else | 495 | } else |
diff --git a/drivers/s390/cio/css.c b/drivers/s390/cio/css.c index a2dee5bf5a17..ad7f7e1c0163 100644 --- a/drivers/s390/cio/css.c +++ b/drivers/s390/cio/css.c | |||
| @@ -271,10 +271,6 @@ static int css_evaluate_known_subchannel(struct subchannel *sch, int slow) | |||
| 271 | /* Reset intparm to zeroes. */ | 271 | /* Reset intparm to zeroes. */ |
| 272 | sch->schib.pmcw.intparm = 0; | 272 | sch->schib.pmcw.intparm = 0; |
| 273 | cio_modify(sch); | 273 | cio_modify(sch); |
| 274 | |||
| 275 | /* Probe if necessary. */ | ||
| 276 | if (action == UNREGISTER_PROBE) | ||
| 277 | ret = css_probe_device(sch->schid); | ||
| 278 | break; | 274 | break; |
| 279 | case REPROBE: | 275 | case REPROBE: |
| 280 | device_trigger_reprobe(sch); | 276 | device_trigger_reprobe(sch); |
| @@ -283,6 +279,9 @@ static int css_evaluate_known_subchannel(struct subchannel *sch, int slow) | |||
| 283 | break; | 279 | break; |
| 284 | } | 280 | } |
| 285 | spin_unlock_irqrestore(&sch->lock, flags); | 281 | spin_unlock_irqrestore(&sch->lock, flags); |
| 282 | /* Probe if necessary. */ | ||
| 283 | if (action == UNREGISTER_PROBE) | ||
| 284 | ret = css_probe_device(sch->schid); | ||
| 286 | 285 | ||
| 287 | return ret; | 286 | return ret; |
| 288 | } | 287 | } |
diff --git a/drivers/s390/cio/device.c b/drivers/s390/cio/device.c index 94bdd4d8a4c9..39c98f940507 100644 --- a/drivers/s390/cio/device.c +++ b/drivers/s390/cio/device.c | |||
| @@ -532,8 +532,7 @@ device_remove_files(struct device *dev) | |||
| 532 | 532 | ||
| 533 | /* this is a simple abstraction for device_register that sets the | 533 | /* this is a simple abstraction for device_register that sets the |
| 534 | * correct bus type and adds the bus specific files */ | 534 | * correct bus type and adds the bus specific files */ |
| 535 | int | 535 | static int ccw_device_register(struct ccw_device *cdev) |
| 536 | ccw_device_register(struct ccw_device *cdev) | ||
| 537 | { | 536 | { |
| 538 | struct device *dev = &cdev->dev; | 537 | struct device *dev = &cdev->dev; |
| 539 | int ret; | 538 | int ret; |
diff --git a/drivers/s390/cio/device.h b/drivers/s390/cio/device.h index c6140cc97a80..9233b5c0bcc8 100644 --- a/drivers/s390/cio/device.h +++ b/drivers/s390/cio/device.h | |||
| @@ -78,7 +78,6 @@ void io_subchannel_recog_done(struct ccw_device *cdev); | |||
| 78 | 78 | ||
| 79 | int ccw_device_cancel_halt_clear(struct ccw_device *); | 79 | int ccw_device_cancel_halt_clear(struct ccw_device *); |
| 80 | 80 | ||
| 81 | int ccw_device_register(struct ccw_device *); | ||
| 82 | void ccw_device_do_unreg_rereg(void *); | 81 | void ccw_device_do_unreg_rereg(void *); |
| 83 | void ccw_device_call_sch_unregister(void *); | 82 | void ccw_device_call_sch_unregister(void *); |
| 84 | 83 | ||
diff --git a/drivers/s390/crypto/ap_bus.c b/drivers/s390/crypto/ap_bus.c index c5ccd20b110c..79d89c368919 100644 --- a/drivers/s390/crypto/ap_bus.c +++ b/drivers/s390/crypto/ap_bus.c | |||
| @@ -739,11 +739,16 @@ static void ap_scan_bus(void *data) | |||
| 739 | dev = bus_find_device(&ap_bus_type, NULL, | 739 | dev = bus_find_device(&ap_bus_type, NULL, |
| 740 | (void *)(unsigned long)qid, | 740 | (void *)(unsigned long)qid, |
| 741 | __ap_scan_bus); | 741 | __ap_scan_bus); |
| 742 | rc = ap_query_queue(qid, &queue_depth, &device_type); | ||
| 743 | if (dev && rc) { | ||
| 744 | put_device(dev); | ||
| 745 | device_unregister(dev); | ||
| 746 | continue; | ||
| 747 | } | ||
| 742 | if (dev) { | 748 | if (dev) { |
| 743 | put_device(dev); | 749 | put_device(dev); |
| 744 | continue; | 750 | continue; |
| 745 | } | 751 | } |
| 746 | rc = ap_query_queue(qid, &queue_depth, &device_type); | ||
| 747 | if (rc) | 752 | if (rc) |
| 748 | continue; | 753 | continue; |
| 749 | rc = ap_init_queue(qid); | 754 | rc = ap_init_queue(qid); |
