Latest patches for s390
Subsystems (2)
cover Latest patches for s390
The following patches have been added to the 2.6.24 queue:
Christian Borntraeger (2):
[S390] dcssblk: prevent early access without own make_request function [S390] Fix compile error on 31bit without preemption
Cornelia Huck (1):
[S390] cio: Issue SenseID per path.
Peter Oberparleiter (1):
[S390] cio: add missing reprobe loop end statement
Signature · 4 lines
blue skies, Martin. "Reality continues to ruin my life." - Calvin.
PATCH 1/4 cio: Issue SenseID per path.
From: Cornelia Huck <[email protected]>
We may receive a unit check for every path when we issue a SenseID. Unfortunately, the channel subsystem will try on a different path every time if we use a lpm of 0xff, which will exhaust our retry counter.
Therefore, revert SenseID to its previous per-path behaviour and just leave out the suspend multipath reconnect.
---
drivers/s390/cio/device_id.c | 37 ++++++++++++++++++++++++++++--------- 1 file changed, 28 insertions(+), 9 deletions(-)
drivers/s390/cio/device_id.c +28 -9
@@ -113,6 +113,7 @@ __ccw_device_sense_id_start(struct ccw_d {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_d/* 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_devmemset (&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_devicccw_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 ) {
Signature · 4 lines
blue skies, Martin. "Reality continues to ruin my life." - Calvin.
PATCH 2/4 cio: add missing reprobe loop end statement
In reply to Martin SchwidefskyFrom: Peter Oberparleiter <[email protected]>
Add loop end statement to prevent looping over empty subchannel sets.
---
drivers/s390/cio/css.c | 1 + 1 file changed, 1 insertion(+)
drivers/s390/cio/css.c +1 -0
@@ -451,6 +451,7 @@ static int reprobe_subchannel(struct subbreak ;case -ENXIO :case -ENOMEM : +case -EIO :/* These should abort looping */ break ;default :
Signature · 4 lines
blue skies, Martin. "Reality continues to ruin my life." - Calvin.
PATCH 3/4 dcssblk: prevent early access without own make_request function
In reply to Martin SchwidefskyFrom: Christian Borntraeger <[email protected]>
When loading a dcss segment with the dcssblk driver, sometimes the following kind of message appears:
bio too big device dcssblk0 (8 > 0)
Buffer I/O error on device dcssblk0, logical block 172016 ..
The fix is to move the disk registration after setting the make_request function, to avoid calls into generic_make_request for dcssblock without having the make_request function set up properly.
---
drivers/s390/block/dcssblk.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/s390/block/dcssblk.c +2 -2
@@ -472,11 +472,11 @@ dcssblk_add_store(struct device *dev, stif (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 :
Signature · 4 lines
blue skies, Martin. "Reality continues to ruin my life." - Calvin.
PATCH 4/4 Fix compile error on 31bit without preemption
In reply to Martin SchwidefskyFrom: Christian Borntraeger <[email protected]>
Commit b8e7a54cd06b0b0174029ef3a7f5a1415a2c28f2 introduced a compile error if CONFIG_PREEMPT is not set:
arch/s390/kernel/built-in.o: In function `cleanup_io_leave_insn':
/space/kvm/arch/s390/kernel/entry.S:(.text+0xbfce): undefined reference to `preempt_schedule_irq'
This patch hides preempt_schedule_irq if CONFIG_PREEMPT is not set.
---
arch/s390/kernel/entry.S | 2 ++ 1 file changed, 2 insertions(+)
arch/s390/kernel/entry.S +2 -0
@@ -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
Signature · 4 lines
blue skies, Martin. "Reality continues to ruin my life." - Calvin.