/* * Get the external interruption subcode. VM stores * this in the 'cpu address' field associated with * the external interrupt. For diag 250 the subcode * needs to be 3. */ if ((S390_lowcore.cpu_addr & 0xff00) != 0x0300) 
int_code = *((u8 *) DASD_DIAG_LC_INT_CODE); status = *((u8 *) DASD_DIAG_LC_INT_STATUS); switch (int_code) { case DASD_DIAG_CODE_31BIT: ip = (addr_t) *((u32 *) DASD_DIAG_LC_INT_PARM_31BIT); break; case DASD_DIAG_CODE_64BIT: ip = (addr_t) *((u64 *) DASD_DIAG_LC_INT_PARM_64BIT); break; default: 
dasd_ext_handler(struct pt_regs *regs, __u16 code){	struct dasd_ccw_req *cqr, *next;	struct dasd_device *device;	unsigned long long expires;	unsigned long flags;	char status;	int ip;	/*	 * Get the external interruption subcode. VM stores	 * this in the 'cpu address' field associated with	 * the external interrupt. For diag 250 the subcode	 * needs to be 3.	 */	if ((S390_lowcore.cpu_addr & 0xff00) != 0x0300)		return;	status = *((char *) &S390_lowcore.ext_params + 5);	ip = S390_lowcore.ext_params;	if (!ip) {		/* no intparm: unsolicited interrupt */		MESSAGE(KERN_DEBUG, "%s", "caught unsolicited interrupt");		return;	}	cqr = (struct dasd_ccw_req *)(addr_t) ip;	device = (struct dasd_device *) cqr->device;	if (strncmp(device->discipline->ebcname, (char *) &cqr->magic, 4)) {		DEV_MESSAGE(KERN_WARNING, device,			    " magic number of dasd_ccw_req 0x%08X doesn't"			    " match discipline 0x%08X",			    cqr->magic, *(int *) (&device->discipline->name));		return;	}	/* get irq lock to modify request queue */	spin_lock_irqsave(get_ccwdev_lock(device->cdev), flags);	cqr->stopclk = get_clock();	expires = 0;	if (status == 0) {		cqr->status = DASD_CQR_DONE;		/* Start first request on queue if possible -> fast_io. */		if (!list_empty(&device->ccw_queue)) {			next = list_entry(device->ccw_queue.next,					  struct dasd_ccw_req, list);			if (next->status == DASD_CQR_QUEUED) {				if (dasd_start_diag(next) == 0)					expires = next->expires;				else					DEV_MESSAGE(KERN_WARNING, device, "%s",						    "Interrupt fastpath "						    "failed!");			}		}	} else 		cqr->status = DASD_CQR_FAILED;	if (expires != 0)		dasd_set_timer(device, expires);	else		dasd_clear_timer(device);	dasd_schedule_bh(device);	spin_unlock_irqrestore(get_ccwdev_lock(device->cdev), flags);}
4520	/local/tlutelli/issta_data/temp/c/2005_temp/2005/4520/fd49f41aa0c125ec649c56a45337b3024d6b1736/dasd_diag.c/buggy/drivers/s390/block/dasd_diag.c