|
@@ -509,7 +509,6 @@ ok_to_write:
|
|
|
if (i > 0) {
|
|
|
SET_HANDLER(&write_intr);
|
|
|
outsw(HD_DATA, req->buffer, 256);
|
|
|
- local_irq_enable();
|
|
|
} else {
|
|
|
#if (HD_DELAY > 0)
|
|
|
last_req = read_timer();
|
|
@@ -541,8 +540,7 @@ static void hd_times_out(unsigned long dummy)
|
|
|
if (!CURRENT)
|
|
|
return;
|
|
|
|
|
|
- disable_irq(HD_IRQ);
|
|
|
- local_irq_enable();
|
|
|
+ spin_lock_irq(hd_queue->queue_lock);
|
|
|
reset = 1;
|
|
|
name = CURRENT->rq_disk->disk_name;
|
|
|
printk("%s: timeout\n", name);
|
|
@@ -552,9 +550,8 @@ static void hd_times_out(unsigned long dummy)
|
|
|
#endif
|
|
|
end_request(CURRENT, 0);
|
|
|
}
|
|
|
- local_irq_disable();
|
|
|
hd_request();
|
|
|
- enable_irq(HD_IRQ);
|
|
|
+ spin_unlock_irq(hd_queue->queue_lock);
|
|
|
}
|
|
|
|
|
|
static int do_special_op(struct hd_i_struct *disk, struct request *req)
|
|
@@ -592,7 +589,6 @@ static void hd_request(void)
|
|
|
return;
|
|
|
repeat:
|
|
|
del_timer(&device_timer);
|
|
|
- local_irq_enable();
|
|
|
|
|
|
req = CURRENT;
|
|
|
if (!req) {
|
|
@@ -601,7 +597,6 @@ repeat:
|
|
|
}
|
|
|
|
|
|
if (reset) {
|
|
|
- local_irq_disable();
|
|
|
reset_hd();
|
|
|
return;
|
|
|
}
|
|
@@ -660,9 +655,7 @@ repeat:
|
|
|
|
|
|
static void do_hd_request(struct request_queue *q)
|
|
|
{
|
|
|
- disable_irq(HD_IRQ);
|
|
|
hd_request();
|
|
|
- enable_irq(HD_IRQ);
|
|
|
}
|
|
|
|
|
|
static int hd_getgeo(struct block_device *bdev, struct hd_geometry *geo)
|
|
@@ -684,12 +677,16 @@ static irqreturn_t hd_interrupt(int irq, void *dev_id)
|
|
|
{
|
|
|
void (*handler)(void) = do_hd;
|
|
|
|
|
|
+ spin_lock(hd_queue->queue_lock);
|
|
|
+
|
|
|
do_hd = NULL;
|
|
|
del_timer(&device_timer);
|
|
|
if (!handler)
|
|
|
handler = unexpected_hd_interrupt;
|
|
|
handler();
|
|
|
- local_irq_enable();
|
|
|
+
|
|
|
+ spin_unlock(hd_queue->queue_lock);
|
|
|
+
|
|
|
return IRQ_HANDLED;
|
|
|
}
|
|
|
|