Commit 2254c2e0 authored by Linus Torvalds's avatar Linus Torvalds

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.
parents a3aaabd6 7af0d6f7
...@@ -1079,8 +1079,10 @@ cleanup_io_leave_insn: ...@@ -1079,8 +1079,10 @@ cleanup_io_leave_insn:
.Lexecve_tail: .long execve_tail .Lexecve_tail: .long execve_tail
.Ljump_table: .long pgm_check_table .Ljump_table: .long pgm_check_table
.Lschedule: .long schedule .Lschedule: .long schedule
#ifdef CONFIG_PREEMPT
.Lpreempt_schedule_irq: .Lpreempt_schedule_irq:
.long preempt_schedule_irq .long preempt_schedule_irq
#endif
.Ltrace: .long syscall_trace .Ltrace: .long syscall_trace
.Lschedtail: .long schedule_tail .Lschedtail: .long schedule_tail
.Lsysc_table: .long sys_call_table .Lsysc_table: .long sys_call_table
......
...@@ -486,9 +486,7 @@ static void setup_addressing_mode(void) ...@@ -486,9 +486,7 @@ static void setup_addressing_mode(void)
if (s390_noexec) { if (s390_noexec) {
printk("S390 execute protection active, "); printk("S390 execute protection active, ");
set_amode_and_uaccess(PSW_ASC_SECONDARY, PSW32_ASC_SECONDARY); set_amode_and_uaccess(PSW_ASC_SECONDARY, PSW32_ASC_SECONDARY);
return; } else if (switch_amode) {
}
if (switch_amode) {
printk("S390 address spaces switched, "); printk("S390 address spaces switched, ");
set_amode_and_uaccess(PSW_ASC_PRIMARY, PSW32_ASC_PRIMARY); 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 ...@@ -472,11 +472,11 @@ dcssblk_add_store(struct device *dev, struct device_attribute *attr, const char
if (rc) if (rc)
goto unregister_dev; goto unregister_dev;
add_disk(dev_info->gd);
blk_queue_make_request(dev_info->dcssblk_queue, dcssblk_make_request); blk_queue_make_request(dev_info->dcssblk_queue, dcssblk_make_request);
blk_queue_hardsect_size(dev_info->dcssblk_queue, 4096); blk_queue_hardsect_size(dev_info->dcssblk_queue, 4096);
add_disk(dev_info->gd);
switch (dev_info->segment_type) { switch (dev_info->segment_type) {
case SEG_TYPE_SR: case SEG_TYPE_SR:
case SEG_TYPE_ER: case SEG_TYPE_ER:
......
...@@ -451,6 +451,7 @@ static int reprobe_subchannel(struct subchannel_id schid, void *data) ...@@ -451,6 +451,7 @@ static int reprobe_subchannel(struct subchannel_id schid, void *data)
break; break;
case -ENXIO: case -ENXIO:
case -ENOMEM: case -ENOMEM:
case -EIO:
/* These should abort looping */ /* These should abort looping */
break; break;
default: default:
......
...@@ -113,6 +113,7 @@ __ccw_device_sense_id_start(struct ccw_device *cdev) ...@@ -113,6 +113,7 @@ __ccw_device_sense_id_start(struct ccw_device *cdev)
{ {
struct subchannel *sch; struct subchannel *sch;
struct ccw1 *ccw; struct ccw1 *ccw;
int ret;
sch = to_subchannel(cdev->dev.parent); sch = to_subchannel(cdev->dev.parent);
/* Setup sense channel program. */ /* Setup sense channel program. */
...@@ -124,9 +125,25 @@ __ccw_device_sense_id_start(struct ccw_device *cdev) ...@@ -124,9 +125,25 @@ __ccw_device_sense_id_start(struct ccw_device *cdev)
/* Reset device status. */ /* Reset device status. */
memset(&cdev->private->irb, 0, sizeof(struct irb)); 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 void
...@@ -136,7 +153,8 @@ ccw_device_sense_id_start(struct ccw_device *cdev) ...@@ -136,7 +153,8 @@ ccw_device_sense_id_start(struct ccw_device *cdev)
memset (&cdev->private->senseid, 0, sizeof (struct senseid)); memset (&cdev->private->senseid, 0, sizeof (struct senseid));
cdev->private->senseid.cu_type = 0xFFFF; 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); ret = __ccw_device_sense_id_start(cdev);
if (ret && ret != -EBUSY) if (ret && ret != -EBUSY)
ccw_device_sense_id_done(cdev, ret); 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) ...@@ -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); ccw_device_sense_id_done(cdev, ret);
break; break;
case -EACCES: /* channel is not operational. */ 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. */ case -EAGAIN: /* try again. */
cdev->private->iretry--; ret = __ccw_device_sense_id_start(cdev);
if (cdev->private->iretry > 0) { if (ret == 0 || ret == -EBUSY)
ret = __ccw_device_sense_id_start(cdev); break;
if (ret == 0 || ret == -EBUSY)
break;
}
/* fall through. */ /* fall through. */
default: /* Sense ID failed. Try asking VM. */ default: /* Sense ID failed. Try asking VM. */
if (MACHINE_IS_VM) { if (MACHINE_IS_VM) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment