[S390] dasd: fix message flood for unsolicited interrupts
[firefly-linux-kernel-4.4.55.git] / drivers / s390 / block / dasd_eckd.c
index 773b3fe275b239b08968c6a7e72e1356bf06674e..8095629bc493f69b661d7c2c811ba2fc5777f023 100644 (file)
@@ -84,7 +84,7 @@ dasd_eckd_probe (struct ccw_device *cdev)
        if (ret) {
                printk(KERN_WARNING
                       "dasd_eckd_probe: could not set ccw-device options "
-                      "for %s\n", cdev->dev.bus_id);
+                      "for %s\n", dev_name(&cdev->dev));
                return ret;
        }
        ret = dasd_generic_probe(cdev, &dasd_eckd_discipline);
@@ -1501,12 +1501,27 @@ static void dasd_eckd_handle_unsolicited_interrupt(struct dasd_device *device,
                return;
        }
 
-       /* just report other unsolicited interrupts */
-       DEV_MESSAGE(KERN_DEBUG, device, "%s",
-                   "unsolicited interrupt received");
-       device->discipline->dump_sense(device, NULL, irb);
-       dasd_schedule_device_bh(device);
+       if ((irb->scsw.cmd.cc == 1) &&
+           (irb->scsw.cmd.fctl & SCSW_FCTL_START_FUNC) &&
+           (irb->scsw.cmd.actl & SCSW_ACTL_START_PEND) &&
+           (irb->scsw.cmd.stctl & SCSW_STCTL_STATUS_PEND)) {
+               /* fake irb do nothing, they are handled elsewhere */
+               dasd_schedule_device_bh(device);
+               return;
+       }
 
+       if (!(irb->esw.esw0.erw.cons)) {
+               /* just report other unsolicited interrupts */
+               DEV_MESSAGE(KERN_ERR, device, "%s",
+                           "unsolicited interrupt received");
+       } else {
+               DEV_MESSAGE(KERN_ERR, device, "%s",
+                           "unsolicited interrupt received "
+                           "(sense available)");
+               device->discipline->dump_sense(device, NULL, irb);
+       }
+
+       dasd_schedule_device_bh(device);
        return;
 };
 
@@ -2145,13 +2160,13 @@ static void dasd_eckd_dump_sense(struct dasd_device *device,
        /* dump the sense data */
        len = sprintf(page,  KERN_ERR PRINTK_HEADER
                      " I/O status report for device %s:\n",
-                     device->cdev->dev.bus_id);
+                     dev_name(&device->cdev->dev));
        len += sprintf(page + len, KERN_ERR PRINTK_HEADER
                       " in req: %p CS: 0x%02X DS: 0x%02X\n", req,
                       irb->scsw.cmd.cstat, irb->scsw.cmd.dstat);
        len += sprintf(page + len, KERN_ERR PRINTK_HEADER
                       " device %s: Failing CCW: %p\n",
-                      device->cdev->dev.bus_id,
+                      dev_name(&device->cdev->dev),
                       (void *) (addr_t) irb->scsw.cmd.cpa);
        if (irb->esw.esw0.erw.cons) {
                for (sl = 0; sl < 4; sl++) {