git://git.onelab.eu
/
linux-2.6.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
vserver 1.9.5.x5
[linux-2.6.git]
/
drivers
/
s390
/
block
/
dasd.c
diff --git
a/drivers/s390/block/dasd.c
b/drivers/s390/block/dasd.c
index
2249b78
..
3083759
100644
(file)
--- a/
drivers/s390/block/dasd.c
+++ b/
drivers/s390/block/dasd.c
@@
-7,7
+7,7
@@
* Bugreports.to..: <Linux390@de.ibm.com>
* (C) IBM Corporation, IBM Deutschland Entwicklung GmbH, 1999-2001
*
* Bugreports.to..: <Linux390@de.ibm.com>
* (C) IBM Corporation, IBM Deutschland Entwicklung GmbH, 1999-2001
*
- * $Revision: 1.1
47
$
+ * $Revision: 1.1
56
$
*/
#include <linux/config.h>
*/
#include <linux/config.h>
@@
-179,7
+179,7
@@
dasd_state_known_to_basic(struct dasd_device * device)
device->debug_area = debug_register(device->cdev->dev.bus_id, 0, 2,
8 * sizeof (long));
debug_register_view(device->debug_area, &debug_sprintf_view);
device->debug_area = debug_register(device->cdev->dev.bus_id, 0, 2,
8 * sizeof (long));
debug_register_view(device->debug_area, &debug_sprintf_view);
- debug_set_level(device->debug_area, DBF_E
RR
);
+ debug_set_level(device->debug_area, DBF_E
MERG
);
DBF_DEV_EVENT(DBF_EMERG, device, "%s", "debug area created");
device->state = DASD_STATE_BASIC;
DBF_DEV_EVENT(DBF_EMERG, device, "%s", "debug area created");
device->state = DASD_STATE_BASIC;
@@
-520,10
+520,6
@@
dasd_kmalloc_request(char *magic, int cplength, int datasize,
if ( magic == NULL || datasize > PAGE_SIZE ||
(cplength*sizeof(struct ccw1)) > PAGE_SIZE)
BUG();
if ( magic == NULL || datasize > PAGE_SIZE ||
(cplength*sizeof(struct ccw1)) > PAGE_SIZE)
BUG();
- debug_text_event ( dasd_debug_area, 1, "ALLC");
- debug_text_event ( dasd_debug_area, 1, magic);
- debug_int_event ( dasd_debug_area, 1, cplength);
- debug_int_event ( dasd_debug_area, 1, datasize);
cqr = kmalloc(sizeof(struct dasd_ccw_req), GFP_ATOMIC);
if (cqr == NULL)
cqr = kmalloc(sizeof(struct dasd_ccw_req), GFP_ATOMIC);
if (cqr == NULL)
@@
-570,10
+566,6
@@
dasd_smalloc_request(char *magic, int cplength, int datasize,
if ( magic == NULL || datasize > PAGE_SIZE ||
(cplength*sizeof(struct ccw1)) > PAGE_SIZE)
BUG();
if ( magic == NULL || datasize > PAGE_SIZE ||
(cplength*sizeof(struct ccw1)) > PAGE_SIZE)
BUG();
- debug_text_event ( dasd_debug_area, 1, "ALLC");
- debug_text_event ( dasd_debug_area, 1, magic);
- debug_int_event ( dasd_debug_area, 1, cplength);
- debug_int_event ( dasd_debug_area, 1, datasize);
size = (sizeof(struct dasd_ccw_req) + 7L) & -8L;
if (cplength > 0)
size = (sizeof(struct dasd_ccw_req) + 7L) & -8L;
if (cplength > 0)
@@
-623,8
+615,6
@@
dasd_kfree_request(struct dasd_ccw_req * cqr, struct dasd_device * device)
clear_normalized_cda(ccw);
} while (ccw++->flags & (CCW_FLAG_CC | CCW_FLAG_DC));
#endif
clear_normalized_cda(ccw);
} while (ccw++->flags & (CCW_FLAG_CC | CCW_FLAG_DC));
#endif
- debug_text_event ( dasd_debug_area, 1, "FREE");
- debug_int_event ( dasd_debug_area, 1, (long) cqr);
if (cqr->cpaddr != NULL)
kfree(cqr->cpaddr);
if (cqr->data != NULL)
if (cqr->cpaddr != NULL)
kfree(cqr->cpaddr);
if (cqr->data != NULL)
@@
-638,8
+628,6
@@
dasd_sfree_request(struct dasd_ccw_req * cqr, struct dasd_device * device)
{
unsigned long flags;
{
unsigned long flags;
- debug_text_event(dasd_debug_area, 1, "FREE");
- debug_int_event(dasd_debug_area, 1, (long) cqr);
spin_lock_irqsave(&device->mem_lock, flags);
dasd_free_chunk(&device->ccw_chunks, cqr);
spin_unlock_irqrestore(&device->mem_lock, flags);
spin_lock_irqsave(&device->mem_lock, flags);
dasd_free_chunk(&device->ccw_chunks, cqr);
spin_unlock_irqrestore(&device->mem_lock, flags);
@@
-696,6
+684,9
@@
dasd_term_IO(struct dasd_ccw_req * cqr)
} else
cqr->status = DASD_CQR_FAILED;
cqr->stopclk = get_clock();
} else
cqr->status = DASD_CQR_FAILED;
cqr->stopclk = get_clock();
+ DBF_DEV_EVENT(DBF_DEBUG, device,
+ "terminate cqr %p successful",
+ cqr);
break;
case -ENODEV:
DBF_DEV_EVENT(DBF_ERR, device, "%s",
break;
case -ENODEV:
DBF_DEV_EVENT(DBF_ERR, device, "%s",
@@
-754,6
+745,9
@@
dasd_start_IO(struct dasd_ccw_req * cqr)
switch (rc) {
case 0:
cqr->status = DASD_CQR_IN_IO;
switch (rc) {
case 0:
cqr->status = DASD_CQR_IN_IO;
+ DBF_DEV_EVENT(DBF_DEBUG, device,
+ "start_IO: request %p started successful",
+ cqr);
break;
case -EBUSY:
DBF_DEV_EVENT(DBF_ERR, device, "%s",
break;
case -EBUSY:
DBF_DEV_EVENT(DBF_ERR, device, "%s",
@@
-964,8
+958,8
@@
dasd_int_handler(struct ccw_device *cdev, unsigned long intparm,
cdev->dev.bus_id, cqr->status);
return;
}
cdev->dev.bus_id, cqr->status);
return;
}
- DBF_DEV_EVENT(DBF_DEBUG, device, "Int: CS/DS 0x%04x",
- ((irb->scsw.cstat << 8) | irb->scsw.dstat));
+ DBF_DEV_EVENT(DBF_DEBUG, device, "Int: CS/DS 0x%04x
for cqr %p
",
+ ((irb->scsw.cstat << 8) | irb->scsw.dstat)
, cqr
);
/* Find out the appropriate era_action. */
if (irb->scsw.fctl & SCSW_FCTL_HALT_FUNC)
/* Find out the appropriate era_action. */
if (irb->scsw.fctl & SCSW_FCTL_HALT_FUNC)
@@
-1080,7
+1074,8
@@
restart:
cqr->stopclk = get_clock();
} else {
if (cqr->irb.esw.esw0.erw.cons) {
cqr->stopclk = get_clock();
} else {
if (cqr->irb.esw.esw0.erw.cons) {
- erp_fn = device->discipline->erp_action(cqr);
+ erp_fn = device->discipline->
+ erp_action(cqr);
erp_fn(cqr);
} else
dasd_default_erp_action(cqr);
erp_fn(cqr);
} else
dasd_default_erp_action(cqr);
@@
-1103,13
+1098,16
@@
static void
dasd_end_request_cb(struct dasd_ccw_req * cqr, void *data)
{
struct request *req;
dasd_end_request_cb(struct dasd_ccw_req * cqr, void *data)
{
struct request *req;
+ struct dasd_device *device;
+ int status;
req = (struct request *) data;
req = (struct request *) data;
- dasd_profile_end(cqr->device, cqr, req);
- spin_lock_irq(&cqr->device->request_queue_lock);
- dasd_end_request(req, (cqr->status == DASD_CQR_DONE));
- spin_unlock_irq(&cqr->device->request_queue_lock);
- dasd_sfree_request(cqr, cqr->device);
+ device = cqr->device;
+ dasd_profile_end(device, cqr, req);
+ status = cqr->device->discipline->free_cp(cqr,req);
+ spin_lock_irq(&device->request_queue_lock);
+ dasd_end_request(req, status);
+ spin_unlock_irq(&device->request_queue_lock);
}
}
@@
-1150,10
+1148,9
@@
__dasd_process_blk_queue(struct dasd_device * device)
req = elv_next_request(queue);
if (test_bit(DASD_FLAG_RO, &device->flags) &&
rq_data_dir(req) == WRITE) {
req = elv_next_request(queue);
if (test_bit(DASD_FLAG_RO, &device->flags) &&
rq_data_dir(req) == WRITE) {
- DBF_EVENT(DBF_ERR,
- "(%s) Rejecting write request %p",
- device->cdev->dev.bus_id,
- req);
+ DBF_DEV_EVENT(DBF_ERR, device,
+ "Rejecting write request %p",
+ req);
blkdev_dequeue_request(req);
dasd_end_request(req, 0);
continue;
blkdev_dequeue_request(req);
dasd_end_request(req, 0);
continue;
@@
-1167,10
+1164,10
@@
__dasd_process_blk_queue(struct dasd_device * device)
if (IS_ERR(cqr)) {
if (PTR_ERR(cqr) == -ENOMEM)
break; /* terminate request queue loop */
if (IS_ERR(cqr)) {
if (PTR_ERR(cqr) == -ENOMEM)
break; /* terminate request queue loop */
- DBF_
EVENT(DBF_ERR
,
- "(%s) CCW creation failed on request %p",
-
device->cdev->dev.bus_id
,
- req);
+ DBF_
DEV_EVENT(DBF_ERR, device
,
+ "CCW creation failed (rc=%ld) "
+
"on request %p"
,
+
PTR_ERR(cqr),
req);
blkdev_dequeue_request(req);
dasd_end_request(req, 0);
continue;
blkdev_dequeue_request(req);
dasd_end_request(req, 0);
continue;
@@
-1583,25
+1580,26
@@
do_dasd_request(request_queue_t * queue)
}
/*
}
/*
- * Allocate and initialize request queue.
+ * Allocate and initialize request queue
and default I/O scheduler
.
*/
static int
dasd_alloc_queue(struct dasd_device * device)
{
*/
static int
dasd_alloc_queue(struct dasd_device * device)
{
+ int rc;
+
device->request_queue = blk_init_queue(do_dasd_request,
&device->request_queue_lock);
if (device->request_queue == NULL)
return -ENOMEM;
device->request_queue->queuedata = device;
device->request_queue = blk_init_queue(do_dasd_request,
&device->request_queue_lock);
if (device->request_queue == NULL)
return -ENOMEM;
device->request_queue->queuedata = device;
-#if 0
- elevator_exit(device->request_queue);
- rc = elevator_init(device->request_queue,
&elevator_noop
);
+
+ elevator_exit(device->request_queue
->elevator
);
+ rc = elevator_init(device->request_queue,
"deadline"
);
if (rc) {
blk_cleanup_queue(device->request_queue);
return rc;
}
if (rc) {
blk_cleanup_queue(device->request_queue);
return rc;
}
-#endif
return 0;
}
return 0;
}
@@
-1675,9
+1673,8
@@
dasd_open(struct inode *inp, struct file *filp)
}
if (dasd_probeonly) {
}
if (dasd_probeonly) {
- MESSAGE(KERN_INFO,
- "No access to device %s due to probeonly mode",
- disk->disk_name);
+ DEV_MESSAGE(KERN_INFO, device, "%s",
+ "No access to device due to probeonly mode");
rc = -EPERM;
goto out;
}
rc = -EPERM;
goto out;
}
@@
-1906,8
+1903,10
@@
dasd_generic_notify(struct ccw_device *cdev, int event)
dasd_schedule_bh(device);
} else {
list_for_each_entry(cqr, &device->ccw_queue, list)
dasd_schedule_bh(device);
} else {
list_for_each_entry(cqr, &device->ccw_queue, list)
- if (cqr->status == DASD_CQR_IN_IO)
+ if (cqr->status == DASD_CQR_IN_IO)
{
cqr->status = DASD_CQR_QUEUED;
cqr->status = DASD_CQR_QUEUED;
+ cqr->retries++;
+ }
device->stopped |= DASD_STOPPED_DC_WAIT;
dasd_set_timer(device, 0);
}
device->stopped |= DASD_STOPPED_DC_WAIT;
dasd_set_timer(device, 0);
}
@@
-1965,8
+1964,8
@@
dasd_init(void)
rc = -ENOMEM;
goto failed;
}
rc = -ENOMEM;
goto failed;
}
- debug_register_view(dasd_debug_area, &debug_
hex_ascii
_view);
- debug_set_level(dasd_debug_area, DBF_E
RR
);
+ debug_register_view(dasd_debug_area, &debug_
sprintf
_view);
+ debug_set_level(dasd_debug_area, DBF_E
MERG
);
DBF_EVENT(DBF_EMERG, "%s", "debug area created");
DBF_EVENT(DBF_EMERG, "%s", "debug area created");