[S390] New DASD feature for ERP related logging
It is now possible to enable/disable ERP related logging without re-compile and re-ipl. A additional sysfs-attribute 'erplog' allows to switch the logging non-interruptive. Signed-off-by: Horst Hummel <horst.hummel@de.ibm.com> Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
This commit is contained in:
parent
85eca85039
commit
9575bf2657
|
@ -1050,10 +1050,10 @@ dasd_int_handler(struct ccw_device *cdev, unsigned long intparm,
|
||||||
}
|
}
|
||||||
} else { /* error */
|
} else { /* error */
|
||||||
memcpy(&cqr->irb, irb, sizeof (struct irb));
|
memcpy(&cqr->irb, irb, sizeof (struct irb));
|
||||||
#ifdef ERP_DEBUG
|
if (device->features & DASD_FEATURE_ERPLOG) {
|
||||||
/* dump sense data */
|
/* dump sense data */
|
||||||
dasd_log_sense(cqr, irb);
|
dasd_log_sense(cqr, irb);
|
||||||
#endif
|
}
|
||||||
switch (era) {
|
switch (era) {
|
||||||
case dasd_era_fatal:
|
case dasd_era_fatal:
|
||||||
cqr->status = DASD_CQR_FAILED;
|
cqr->status = DASD_CQR_FAILED;
|
||||||
|
|
|
@ -2641,14 +2641,12 @@ dasd_3990_erp_action(struct dasd_ccw_req * cqr)
|
||||||
struct dasd_ccw_req *erp = NULL;
|
struct dasd_ccw_req *erp = NULL;
|
||||||
struct dasd_device *device = cqr->device;
|
struct dasd_device *device = cqr->device;
|
||||||
__u32 cpa = cqr->irb.scsw.cpa;
|
__u32 cpa = cqr->irb.scsw.cpa;
|
||||||
|
struct dasd_ccw_req *temp_erp = NULL;
|
||||||
|
|
||||||
#ifdef ERP_DEBUG
|
if (device->features & DASD_FEATURE_ERPLOG) {
|
||||||
/* print current erp_chain */
|
/* print current erp_chain */
|
||||||
DEV_MESSAGE(KERN_ERR, device, "%s",
|
DEV_MESSAGE(KERN_ERR, device, "%s",
|
||||||
"ERP chain at BEGINNING of ERP-ACTION");
|
"ERP chain at BEGINNING of ERP-ACTION");
|
||||||
{
|
|
||||||
struct dasd_ccw_req *temp_erp = NULL;
|
|
||||||
|
|
||||||
for (temp_erp = cqr;
|
for (temp_erp = cqr;
|
||||||
temp_erp != NULL; temp_erp = temp_erp->refers) {
|
temp_erp != NULL; temp_erp = temp_erp->refers) {
|
||||||
|
|
||||||
|
@ -2658,7 +2656,6 @@ dasd_3990_erp_action(struct dasd_ccw_req * cqr)
|
||||||
temp_erp->refers);
|
temp_erp->refers);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif /* ERP_DEBUG */
|
|
||||||
|
|
||||||
/* double-check if current erp/cqr was successfull */
|
/* double-check if current erp/cqr was successfull */
|
||||||
if ((cqr->irb.scsw.cstat == 0x00) &&
|
if ((cqr->irb.scsw.cstat == 0x00) &&
|
||||||
|
@ -2695,11 +2692,10 @@ dasd_3990_erp_action(struct dasd_ccw_req * cqr)
|
||||||
erp = dasd_3990_erp_handle_match_erp(cqr, erp);
|
erp = dasd_3990_erp_handle_match_erp(cqr, erp);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef ERP_DEBUG
|
if (device->features & DASD_FEATURE_ERPLOG) {
|
||||||
/* print current erp_chain */
|
/* print current erp_chain */
|
||||||
DEV_MESSAGE(KERN_ERR, device, "%s", "ERP chain at END of ERP-ACTION");
|
DEV_MESSAGE(KERN_ERR, device, "%s",
|
||||||
{
|
"ERP chain at END of ERP-ACTION");
|
||||||
struct dasd_ccw_req *temp_erp = NULL;
|
|
||||||
for (temp_erp = erp;
|
for (temp_erp = erp;
|
||||||
temp_erp != NULL; temp_erp = temp_erp->refers) {
|
temp_erp != NULL; temp_erp = temp_erp->refers) {
|
||||||
|
|
||||||
|
@ -2709,7 +2705,6 @@ dasd_3990_erp_action(struct dasd_ccw_req * cqr)
|
||||||
temp_erp->refers);
|
temp_erp->refers);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif /* ERP_DEBUG */
|
|
||||||
|
|
||||||
if (erp->status == DASD_CQR_FAILED)
|
if (erp->status == DASD_CQR_FAILED)
|
||||||
dasd_log_ccw(erp, 1, cpa);
|
dasd_log_ccw(erp, 1, cpa);
|
||||||
|
|
|
@ -202,6 +202,8 @@ dasd_feature_list(char *str, char **endp)
|
||||||
features |= DASD_FEATURE_READONLY;
|
features |= DASD_FEATURE_READONLY;
|
||||||
else if (len == 4 && !strncmp(str, "diag", 4))
|
else if (len == 4 && !strncmp(str, "diag", 4))
|
||||||
features |= DASD_FEATURE_USEDIAG;
|
features |= DASD_FEATURE_USEDIAG;
|
||||||
|
else if (len == 6 && !strncmp(str, "erplog", 6))
|
||||||
|
features |= DASD_FEATURE_ERPLOG;
|
||||||
else {
|
else {
|
||||||
MESSAGE(KERN_WARNING,
|
MESSAGE(KERN_WARNING,
|
||||||
"unsupported feature: %*s, "
|
"unsupported feature: %*s, "
|
||||||
|
@ -709,6 +711,52 @@ dasd_ro_store(struct device *dev, struct device_attribute *attr,
|
||||||
}
|
}
|
||||||
|
|
||||||
static DEVICE_ATTR(readonly, 0644, dasd_ro_show, dasd_ro_store);
|
static DEVICE_ATTR(readonly, 0644, dasd_ro_show, dasd_ro_store);
|
||||||
|
/*
|
||||||
|
* erplog controls the logging of ERP related data
|
||||||
|
* (e.g. failing channel programs).
|
||||||
|
*/
|
||||||
|
static ssize_t
|
||||||
|
dasd_erplog_show(struct device *dev, struct device_attribute *attr, char *buf)
|
||||||
|
{
|
||||||
|
struct dasd_devmap *devmap;
|
||||||
|
int erplog;
|
||||||
|
|
||||||
|
devmap = dasd_find_busid(dev->bus_id);
|
||||||
|
if (!IS_ERR(devmap))
|
||||||
|
erplog = (devmap->features & DASD_FEATURE_ERPLOG) != 0;
|
||||||
|
else
|
||||||
|
erplog = (DASD_FEATURE_DEFAULT & DASD_FEATURE_ERPLOG) != 0;
|
||||||
|
return snprintf(buf, PAGE_SIZE, erplog ? "1\n" : "0\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
static ssize_t
|
||||||
|
dasd_erplog_store(struct device *dev, struct device_attribute *attr,
|
||||||
|
const char *buf, size_t count)
|
||||||
|
{
|
||||||
|
struct dasd_devmap *devmap;
|
||||||
|
int val;
|
||||||
|
char *endp;
|
||||||
|
|
||||||
|
devmap = dasd_devmap_from_cdev(to_ccwdev(dev));
|
||||||
|
if (IS_ERR(devmap))
|
||||||
|
return PTR_ERR(devmap);
|
||||||
|
|
||||||
|
val = simple_strtoul(buf, &endp, 0);
|
||||||
|
if (((endp + 1) < (buf + count)) || (val > 1))
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
spin_lock(&dasd_devmap_lock);
|
||||||
|
if (val)
|
||||||
|
devmap->features |= DASD_FEATURE_ERPLOG;
|
||||||
|
else
|
||||||
|
devmap->features &= ~DASD_FEATURE_ERPLOG;
|
||||||
|
if (devmap->device)
|
||||||
|
devmap->device->features = devmap->features;
|
||||||
|
spin_unlock(&dasd_devmap_lock);
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
|
||||||
|
static DEVICE_ATTR(erplog, 0644, dasd_erplog_show, dasd_erplog_store);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* use_diag controls whether the driver should use diag rather than ssch
|
* use_diag controls whether the driver should use diag rather than ssch
|
||||||
|
@ -896,6 +944,7 @@ static struct attribute * dasd_attrs[] = {
|
||||||
&dev_attr_uid.attr,
|
&dev_attr_uid.attr,
|
||||||
&dev_attr_use_diag.attr,
|
&dev_attr_use_diag.attr,
|
||||||
&dev_attr_eer_enabled.attr,
|
&dev_attr_eer_enabled.attr,
|
||||||
|
&dev_attr_erplog.attr,
|
||||||
NULL,
|
NULL,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -13,10 +13,6 @@
|
||||||
|
|
||||||
#ifdef __KERNEL__
|
#ifdef __KERNEL__
|
||||||
|
|
||||||
/* erp debugging in dasd.c and dasd_3990_erp.c */
|
|
||||||
#define ERP_DEBUG
|
|
||||||
|
|
||||||
|
|
||||||
/* we keep old device allocation scheme; IOW, minors are still in 0..255 */
|
/* we keep old device allocation scheme; IOW, minors are still in 0..255 */
|
||||||
#define DASD_PER_MAJOR (1U << (MINORBITS - DASD_PARTN_BITS))
|
#define DASD_PER_MAJOR (1U << (MINORBITS - DASD_PARTN_BITS))
|
||||||
#define DASD_PARTN_MASK ((1 << DASD_PARTN_BITS) - 1)
|
#define DASD_PARTN_MASK ((1 << DASD_PARTN_BITS) - 1)
|
||||||
|
|
|
@ -69,11 +69,13 @@ typedef struct dasd_information2_t {
|
||||||
* 0x01: readonly (ro)
|
* 0x01: readonly (ro)
|
||||||
* 0x02: use diag discipline (diag)
|
* 0x02: use diag discipline (diag)
|
||||||
* 0x04: set the device initially online (internal use only)
|
* 0x04: set the device initially online (internal use only)
|
||||||
|
* 0x08: enable ERP related logging
|
||||||
*/
|
*/
|
||||||
#define DASD_FEATURE_DEFAULT 0x00
|
#define DASD_FEATURE_DEFAULT 0x00
|
||||||
#define DASD_FEATURE_READONLY 0x01
|
#define DASD_FEATURE_READONLY 0x01
|
||||||
#define DASD_FEATURE_USEDIAG 0x02
|
#define DASD_FEATURE_USEDIAG 0x02
|
||||||
#define DASD_FEATURE_INITIAL_ONLINE 0x04
|
#define DASD_FEATURE_INITIAL_ONLINE 0x04
|
||||||
|
#define DASD_FEATURE_ERPLOG 0x08
|
||||||
|
|
||||||
#define DASD_PARTN_BITS 2
|
#define DASD_PARTN_BITS 2
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue