X-Git-Url: https://err.no/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=drivers%2Fs390%2Fblock%2Fdasd_eer.c;h=6e53ab606e9720f531ba8ad218fb0a7524cf212a;hb=9732b6112343df2872518ec6701c8ef729310a05;hp=4b8a95fba1e5dc706e4e5e8b2bbfaf0185f57cad;hpb=463020ce428e2f00d4f33a383d6f39c7453a6854;p=linux-2.6 diff --git a/drivers/s390/block/dasd_eer.c b/drivers/s390/block/dasd_eer.c index 4b8a95fba1..6e53ab606e 100644 --- a/drivers/s390/block/dasd_eer.c +++ b/drivers/s390/block/dasd_eer.c @@ -14,9 +14,9 @@ #include #include #include +#include #include -#include #include #include @@ -336,7 +336,7 @@ static void dasd_eer_write_snss_trigger(struct dasd_device *device, unsigned long flags; struct eerbuffer *eerb; - snss_rc = (cqr->status == DASD_CQR_FAILED) ? -EIO : 0; + snss_rc = (cqr->status == DASD_CQR_DONE) ? 0 : -EIO; if (snss_rc) data_size = 0; else @@ -404,10 +404,11 @@ void dasd_eer_snss(struct dasd_device *device) set_bit(DASD_FLAG_EER_SNSS, &device->flags); return; } + /* cdev is already locked, can't use dasd_add_request_head */ clear_bit(DASD_FLAG_EER_SNSS, &device->flags); cqr->status = DASD_CQR_QUEUED; - list_add(&cqr->list, &device->ccw_queue); - dasd_schedule_bh(device); + list_add(&cqr->devlist, &device->ccw_queue); + dasd_schedule_device_bh(device); } /* @@ -415,7 +416,7 @@ void dasd_eer_snss(struct dasd_device *device) */ static void dasd_eer_snss_cb(struct dasd_ccw_req *cqr, void *data) { - struct dasd_device *device = cqr->device; + struct dasd_device *device = cqr->startdev; unsigned long flags; dasd_eer_write(device, cqr, DASD_EER_STATECHANGE); @@ -458,9 +459,10 @@ int dasd_eer_enable(struct dasd_device *device) if (!cqr) return -ENOMEM; - cqr->device = device; + cqr->startdev = device; cqr->retries = 255; cqr->expires = 10 * HZ; + clear_bit(DASD_CQR_FLAGS_USE_ERP, &cqr->flags); cqr->cpaddr->cmd_code = DASD_ECKD_CCW_SNSS; cqr->cpaddr->count = SNSS_DATA_SIZE; @@ -513,7 +515,7 @@ void dasd_eer_disable(struct dasd_device *device) * to transfer in a readbuffer, which is protected by the readbuffer_mutex. */ static char readbuffer[PAGE_SIZE]; -static DECLARE_MUTEX(readbuffer_mutex); +static DEFINE_MUTEX(readbuffer_mutex); static int dasd_eer_open(struct inode *inp, struct file *filp) { @@ -578,7 +580,7 @@ static ssize_t dasd_eer_read(struct file *filp, char __user *buf, struct eerbuffer *eerb; eerb = (struct eerbuffer *) filp->private_data; - if (down_interruptible(&readbuffer_mutex)) + if (mutex_lock_interruptible(&readbuffer_mutex)) return -ERESTARTSYS; spin_lock_irqsave(&bufferlock, flags); @@ -587,7 +589,7 @@ static ssize_t dasd_eer_read(struct file *filp, char __user *buf, /* has been deleted */ eerb->residual = 0; spin_unlock_irqrestore(&bufferlock, flags); - up(&readbuffer_mutex); + mutex_unlock(&readbuffer_mutex); return -EIO; } else if (eerb->residual > 0) { /* OK we still have a second half of a record to deliver */ @@ -601,7 +603,7 @@ static ssize_t dasd_eer_read(struct file *filp, char __user *buf, if (!tc) { /* no data available */ spin_unlock_irqrestore(&bufferlock, flags); - up(&readbuffer_mutex); + mutex_unlock(&readbuffer_mutex); if (filp->f_flags & O_NONBLOCK) return -EAGAIN; rc = wait_event_interruptible( @@ -609,7 +611,7 @@ static ssize_t dasd_eer_read(struct file *filp, char __user *buf, eerb->head != eerb->tail); if (rc) return rc; - if (down_interruptible(&readbuffer_mutex)) + if (mutex_lock_interruptible(&readbuffer_mutex)) return -ERESTARTSYS; spin_lock_irqsave(&bufferlock, flags); } @@ -625,11 +627,11 @@ static ssize_t dasd_eer_read(struct file *filp, char __user *buf, spin_unlock_irqrestore(&bufferlock, flags); if (copy_to_user(buf, readbuffer, effective_count)) { - up(&readbuffer_mutex); + mutex_unlock(&readbuffer_mutex); return -EFAULT; } - up(&readbuffer_mutex); + mutex_unlock(&readbuffer_mutex); return effective_count; }