diff options
| author | Horst Hummel <horst.hummel@de.ibm.com> | 2006-12-08 15:54:15 +0100 | 
|---|---|---|
| committer | Martin Schwidefsky <schwidefsky@de.ibm.com> | 2006-12-08 15:54:15 +0100 | 
| commit | 9575bf265711cabe7147a68003a56a9f19f034da (patch) | |
| tree | d13dc1c76470ba24fc1d8333adf6890a45df327a /drivers/s390/block | |
| parent | 85eca8503997cf3a869b159954f703530c865299 (diff) | |
[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>
Diffstat (limited to 'drivers/s390/block')
| -rw-r--r-- | drivers/s390/block/dasd.c | 8 | ||||
| -rw-r--r-- | drivers/s390/block/dasd_3990_erp.c | 23 | ||||
| -rw-r--r-- | drivers/s390/block/dasd_devmap.c | 49 | ||||
| -rw-r--r-- | drivers/s390/block/dasd_int.h | 4 | 
4 files changed, 62 insertions, 22 deletions
| diff --git a/drivers/s390/block/dasd.c b/drivers/s390/block/dasd.c index 2af2d9b53d18..492b68bcd7cc 100644 --- a/drivers/s390/block/dasd.c +++ b/drivers/s390/block/dasd.c @@ -1050,10 +1050,10 @@ dasd_int_handler(struct ccw_device *cdev, unsigned long intparm,  		}  	} else {		/* error */  		memcpy(&cqr->irb, irb, sizeof (struct irb)); -#ifdef ERP_DEBUG -		/* dump sense data */ -		dasd_log_sense(cqr, irb); -#endif +		if (device->features & DASD_FEATURE_ERPLOG) { +			/* dump sense data */ +			dasd_log_sense(cqr, irb); +		}  		switch (era) {  		case dasd_era_fatal:  			cqr->status = DASD_CQR_FAILED; diff --git a/drivers/s390/block/dasd_3990_erp.c b/drivers/s390/block/dasd_3990_erp.c index 669805d4402d..4d01040c2c63 100644 --- a/drivers/s390/block/dasd_3990_erp.c +++ b/drivers/s390/block/dasd_3990_erp.c @@ -2641,14 +2641,12 @@ dasd_3990_erp_action(struct dasd_ccw_req * cqr)  	struct dasd_ccw_req *erp = NULL;  	struct dasd_device *device = cqr->device;  	__u32 cpa = cqr->irb.scsw.cpa; +	struct dasd_ccw_req *temp_erp = NULL; -#ifdef ERP_DEBUG -	/* print current erp_chain */ -	DEV_MESSAGE(KERN_ERR, device, "%s", -		    "ERP chain at BEGINNING of ERP-ACTION"); -	{ -		struct dasd_ccw_req *temp_erp = NULL; - +	if (device->features & DASD_FEATURE_ERPLOG) { +		/* print current erp_chain */ +		DEV_MESSAGE(KERN_ERR, device, "%s", +			    "ERP chain at BEGINNING of ERP-ACTION");  		for (temp_erp = cqr;  		     temp_erp != NULL; temp_erp = temp_erp->refers) { @@ -2658,7 +2656,6 @@ dasd_3990_erp_action(struct dasd_ccw_req * cqr)  				    temp_erp->refers);  		}  	} -#endif				/* ERP_DEBUG */  	/* double-check if current erp/cqr was successfull */  	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);  	} -#ifdef ERP_DEBUG -	/* print current erp_chain */ -	DEV_MESSAGE(KERN_ERR, device, "%s", "ERP chain at END of ERP-ACTION"); -	{ -		struct dasd_ccw_req *temp_erp = NULL; +	if (device->features & DASD_FEATURE_ERPLOG) { +		/* print current erp_chain */ +		DEV_MESSAGE(KERN_ERR, device, "%s", +			    "ERP chain at END of ERP-ACTION");  		for (temp_erp = erp;  		     temp_erp != NULL; temp_erp = temp_erp->refers) { @@ -2709,7 +2705,6 @@ dasd_3990_erp_action(struct dasd_ccw_req * cqr)  				    temp_erp->refers);  		}  	} -#endif				/* ERP_DEBUG */  	if (erp->status == DASD_CQR_FAILED)  		dasd_log_ccw(erp, 1, cpa); diff --git a/drivers/s390/block/dasd_devmap.c b/drivers/s390/block/dasd_devmap.c index cf28ccc57948..5943266152f5 100644 --- a/drivers/s390/block/dasd_devmap.c +++ b/drivers/s390/block/dasd_devmap.c @@ -202,6 +202,8 @@ dasd_feature_list(char *str, char **endp)  			features |= DASD_FEATURE_READONLY;  		else if (len == 4 && !strncmp(str, "diag", 4))  			features |= DASD_FEATURE_USEDIAG; +		else if (len == 6 && !strncmp(str, "erplog", 6)) +			features |= DASD_FEATURE_ERPLOG;  		else {  			MESSAGE(KERN_WARNING,  				"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); +/* + * 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 @@ -896,6 +944,7 @@ static struct attribute * dasd_attrs[] = {  	&dev_attr_uid.attr,  	&dev_attr_use_diag.attr,  	&dev_attr_eer_enabled.attr, +	&dev_attr_erplog.attr,  	NULL,  }; diff --git a/drivers/s390/block/dasd_int.h b/drivers/s390/block/dasd_int.h index dc5dd509434d..fb725e3b08fe 100644 --- a/drivers/s390/block/dasd_int.h +++ b/drivers/s390/block/dasd_int.h @@ -13,10 +13,6 @@  #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 */  #define DASD_PER_MAJOR (1U << (MINORBITS - DASD_PARTN_BITS))  #define DASD_PARTN_MASK ((1 << DASD_PARTN_BITS) - 1) | 
