Code Review
/
linux-2.6.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
review
|
tree
raw
|
inline
| side by side
Merge branch 'post-2.6.15' of git://brick.kernel.dk/data/git/linux-2.6-block
[linux-2.6.git]
/
drivers
/
s390
/
block
/
dasd.c
diff --git
a/drivers/s390/block/dasd.c
b/drivers/s390/block/dasd.c
index fdb61380c5237679047a34719f801c3427552deb..f779f674dfa0414b498f1cf0be497e4a87a89291 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
67
$
+ * $Revision: 1.1
72
$
*/
#include <linux/config.h>
*/
#include <linux/config.h>
@@
-604,7
+604,7
@@
dasd_smalloc_request(char *magic, int cplength, int datasize,
void
dasd_kfree_request(struct dasd_ccw_req * cqr, struct dasd_device * device)
{
void
dasd_kfree_request(struct dasd_ccw_req * cqr, struct dasd_device * device)
{
-#ifdef CONFIG_
ARCH_S390X
+#ifdef CONFIG_
64BIT
struct ccw1 *ccw;
/* Clear any idals used for the request. */
struct ccw1 *ccw;
/* Clear any idals used for the request. */
@@
-1224,6
+1224,12
@@
__dasd_start_head(struct dasd_device * device)
if (list_empty(&device->ccw_queue))
return;
cqr = list_entry(device->ccw_queue.next, struct dasd_ccw_req, list);
if (list_empty(&device->ccw_queue))
return;
cqr = list_entry(device->ccw_queue.next, struct dasd_ccw_req, list);
+ /* check FAILFAST */
+ if (device->stopped & ~DASD_STOPPED_PENDING &&
+ test_bit(DASD_CQR_FLAGS_FAILFAST, &cqr->flags)) {
+ cqr->status = DASD_CQR_FAILED;
+ dasd_schedule_bh(device);
+ }
if ((cqr->status == DASD_CQR_QUEUED) &&
(!device->stopped)) {
/* try to start the first I/O that can be started */
if ((cqr->status == DASD_CQR_QUEUED) &&
(!device->stopped)) {
/* try to start the first I/O that can be started */
@@
-1323,7
+1329,7
@@
void
dasd_schedule_bh(struct dasd_device * device)
{
/* Protect against rescheduling. */
dasd_schedule_bh(struct dasd_device * device)
{
/* Protect against rescheduling. */
- if (atomic_c
ompare_and_swap (0, 1, &device->tasklet_scheduled)
)
+ if (atomic_c
mpxchg (&device->tasklet_scheduled, 0, 1) != 0
)
return;
dasd_get_device(device);
tasklet_hi_schedule(&device->tasklet);
return;
dasd_get_device(device);
tasklet_hi_schedule(&device->tasklet);
@@
-1750,8
+1756,10
@@
dasd_exit(void)
* SECTION: common functions for ccw_driver use
*/
* SECTION: common functions for ccw_driver use
*/
-/* initial attempt at a probe function. this can be simplified once
- * the other detection code is gone */
+/*
+ * Initial attempt at a probe function. this can be simplified once
+ * the other detection code is gone.
+ */
int
dasd_generic_probe (struct ccw_device *cdev,
struct dasd_discipline *discipline)
int
dasd_generic_probe (struct ccw_device *cdev,
struct dasd_discipline *discipline)
@@
-1770,8
+1778,10
@@
dasd_generic_probe (struct ccw_device *cdev,
return ret;
}
return ret;
}
-/* this will one day be called from a global not_oper handler.
- * It is also used by driver_unregister during module unload */
+/*
+ * This will one day be called from a global not_oper handler.
+ * It is also used by driver_unregister during module unload.
+ */
void
dasd_generic_remove (struct ccw_device *cdev)
{
void
dasd_generic_remove (struct ccw_device *cdev)
{
@@
-1798,9
+1808,11
@@
dasd_generic_remove (struct ccw_device *cdev)
dasd_delete_device(device);
}
dasd_delete_device(device);
}
-/* activate a device. This is called from dasd_{eckd,fba}_probe() when either
+/*
+ * Activate a device. This is called from dasd_{eckd,fba}_probe() when either
* the device is detected for the first time and is supposed to be used
* the device is detected for the first time and is supposed to be used
- * or the user has started activation through sysfs */
+ * or the user has started activation through sysfs.
+ */
int
dasd_generic_set_online (struct ccw_device *cdev,
struct dasd_discipline *discipline)
int
dasd_generic_set_online (struct ccw_device *cdev,
struct dasd_discipline *discipline)
@@
-1917,7
+1929,6
@@
dasd_generic_notify(struct ccw_device *cdev, int event)
if (cqr->status == DASD_CQR_IN_IO)
cqr->status = DASD_CQR_FAILED;
device->stopped |= DASD_STOPPED_DC_EIO;
if (cqr->status == DASD_CQR_IN_IO)
cqr->status = DASD_CQR_FAILED;
device->stopped |= DASD_STOPPED_DC_EIO;
- dasd_schedule_bh(device);
} else {
list_for_each_entry(cqr, &device->ccw_queue, list)
if (cqr->status == DASD_CQR_IN_IO) {
} else {
list_for_each_entry(cqr, &device->ccw_queue, list)
if (cqr->status == DASD_CQR_IN_IO) {
@@
-1927,6
+1938,7
@@
dasd_generic_notify(struct ccw_device *cdev, int event)
device->stopped |= DASD_STOPPED_DC_WAIT;
dasd_set_timer(device, 0);
}
device->stopped |= DASD_STOPPED_DC_WAIT;
dasd_set_timer(device, 0);
}
+ dasd_schedule_bh(device);
ret = 1;
break;
case CIO_OPER:
ret = 1;
break;
case CIO_OPER: