Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9575bf26 authored by Horst Hummel's avatar Horst Hummel Committed by Martin Schwidefsky
Browse files

[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: default avatarHorst Hummel <horst.hummel@de.ibm.com>
Signed-off-by: default avatarMartin Schwidefsky <schwidefsky@de.ibm.com>
parent 85eca850
Loading
Loading
Loading
Loading
+4 −4
Original line number Diff line number Diff line
@@ -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
		if (device->features & DASD_FEATURE_ERPLOG) {
			/* dump sense data */
			dasd_log_sense(cqr, irb);
#endif
		}
		switch (era) {
		case dasd_era_fatal:
			cqr->status = DASD_CQR_FAILED;
+9 −14
Original line number Diff line number Diff line
@@ -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
	if (device->features & DASD_FEATURE_ERPLOG) {
		/* print current erp_chain */
		DEV_MESSAGE(KERN_ERR, device, "%s",
			    "ERP chain at BEGINNING of ERP-ACTION");
	{
		struct dasd_ccw_req *temp_erp = NULL;

		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
	if (device->features & DASD_FEATURE_ERPLOG) {
		/* print current erp_chain */
	DEV_MESSAGE(KERN_ERR, device, "%s", "ERP chain at END of ERP-ACTION");
	{
		struct dasd_ccw_req *temp_erp = NULL;
		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);
+49 −0
Original line number Diff line number Diff line
@@ -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,
};

+0 −4
Original line number Diff line number Diff line
@@ -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)
+2 −0
Original line number Diff line number Diff line
@@ -69,11 +69,13 @@ typedef struct dasd_information2_t {
 * 0x01: readonly (ro)
 * 0x02: use diag discipline (diag)
 * 0x04: set the device initially online (internal use only)
 * 0x08: enable ERP related logging
 */
#define DASD_FEATURE_DEFAULT	     0x00
#define DASD_FEATURE_READONLY	     0x01
#define DASD_FEATURE_USEDIAG	     0x02
#define DASD_FEATURE_INITIAL_ONLINE  0x04
#define DASD_FEATURE_ERPLOG	     0x08

#define DASD_PARTN_BITS 2