mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-26 02:39:48 +00:00
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] Make sure the restore psw masks are initialized. [S390] Fix compile error on 31bit without preemption [S390] dcssblk: prevent early access without own make_request function [S390] cio: add missing reprobe loop end statement [S390] cio: Issue SenseID per path.
This commit is contained in:
commit
2254c2e018
5 changed files with 34 additions and 14 deletions
|
@ -1079,8 +1079,10 @@ cleanup_io_leave_insn:
|
|||
.Lexecve_tail: .long execve_tail
|
||||
.Ljump_table: .long pgm_check_table
|
||||
.Lschedule: .long schedule
|
||||
#ifdef CONFIG_PREEMPT
|
||||
.Lpreempt_schedule_irq:
|
||||
.long preempt_schedule_irq
|
||||
#endif
|
||||
.Ltrace: .long syscall_trace
|
||||
.Lschedtail: .long schedule_tail
|
||||
.Lsysc_table: .long sys_call_table
|
||||
|
|
|
@ -486,9 +486,7 @@ static void setup_addressing_mode(void)
|
|||
if (s390_noexec) {
|
||||
printk("S390 execute protection active, ");
|
||||
set_amode_and_uaccess(PSW_ASC_SECONDARY, PSW32_ASC_SECONDARY);
|
||||
return;
|
||||
}
|
||||
if (switch_amode) {
|
||||
} else if (switch_amode) {
|
||||
printk("S390 address spaces switched, ");
|
||||
set_amode_and_uaccess(PSW_ASC_PRIMARY, PSW32_ASC_PRIMARY);
|
||||
}
|
||||
|
|
|
@ -472,11 +472,11 @@ dcssblk_add_store(struct device *dev, struct device_attribute *attr, const char
|
|||
if (rc)
|
||||
goto unregister_dev;
|
||||
|
||||
add_disk(dev_info->gd);
|
||||
|
||||
blk_queue_make_request(dev_info->dcssblk_queue, dcssblk_make_request);
|
||||
blk_queue_hardsect_size(dev_info->dcssblk_queue, 4096);
|
||||
|
||||
add_disk(dev_info->gd);
|
||||
|
||||
switch (dev_info->segment_type) {
|
||||
case SEG_TYPE_SR:
|
||||
case SEG_TYPE_ER:
|
||||
|
|
|
@ -451,6 +451,7 @@ static int reprobe_subchannel(struct subchannel_id schid, void *data)
|
|||
break;
|
||||
case -ENXIO:
|
||||
case -ENOMEM:
|
||||
case -EIO:
|
||||
/* These should abort looping */
|
||||
break;
|
||||
default:
|
||||
|
|
|
@ -113,6 +113,7 @@ __ccw_device_sense_id_start(struct ccw_device *cdev)
|
|||
{
|
||||
struct subchannel *sch;
|
||||
struct ccw1 *ccw;
|
||||
int ret;
|
||||
|
||||
sch = to_subchannel(cdev->dev.parent);
|
||||
/* Setup sense channel program. */
|
||||
|
@ -124,9 +125,25 @@ __ccw_device_sense_id_start(struct ccw_device *cdev)
|
|||
|
||||
/* Reset device status. */
|
||||
memset(&cdev->private->irb, 0, sizeof(struct irb));
|
||||
cdev->private->flags.intretry = 0;
|
||||
|
||||
return cio_start(sch, ccw, LPM_ANYPATH);
|
||||
/* Try on every path. */
|
||||
ret = -ENODEV;
|
||||
while (cdev->private->imask != 0) {
|
||||
if ((sch->opm & cdev->private->imask) != 0 &&
|
||||
cdev->private->iretry > 0) {
|
||||
cdev->private->iretry--;
|
||||
/* Reset internal retry indication. */
|
||||
cdev->private->flags.intretry = 0;
|
||||
ret = cio_start (sch, cdev->private->iccws,
|
||||
cdev->private->imask);
|
||||
/* ret is 0, -EBUSY, -EACCES or -ENODEV */
|
||||
if (ret != -EACCES)
|
||||
return ret;
|
||||
}
|
||||
cdev->private->imask >>= 1;
|
||||
cdev->private->iretry = 5;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -136,7 +153,8 @@ ccw_device_sense_id_start(struct ccw_device *cdev)
|
|||
|
||||
memset (&cdev->private->senseid, 0, sizeof (struct senseid));
|
||||
cdev->private->senseid.cu_type = 0xFFFF;
|
||||
cdev->private->iretry = 3;
|
||||
cdev->private->imask = 0x80;
|
||||
cdev->private->iretry = 5;
|
||||
ret = __ccw_device_sense_id_start(cdev);
|
||||
if (ret && ret != -EBUSY)
|
||||
ccw_device_sense_id_done(cdev, ret);
|
||||
|
@ -252,13 +270,14 @@ ccw_device_sense_id_irq(struct ccw_device *cdev, enum dev_event dev_event)
|
|||
ccw_device_sense_id_done(cdev, ret);
|
||||
break;
|
||||
case -EACCES: /* channel is not operational. */
|
||||
sch->lpm &= ~cdev->private->imask;
|
||||
cdev->private->imask >>= 1;
|
||||
cdev->private->iretry = 5;
|
||||
/* fall through. */
|
||||
case -EAGAIN: /* try again. */
|
||||
cdev->private->iretry--;
|
||||
if (cdev->private->iretry > 0) {
|
||||
ret = __ccw_device_sense_id_start(cdev);
|
||||
if (ret == 0 || ret == -EBUSY)
|
||||
break;
|
||||
}
|
||||
ret = __ccw_device_sense_id_start(cdev);
|
||||
if (ret == 0 || ret == -EBUSY)
|
||||
break;
|
||||
/* fall through. */
|
||||
default: /* Sense ID failed. Try asking VM. */
|
||||
if (MACHINE_IS_VM) {
|
||||
|
|
Loading…
Reference in a new issue