|
@@ -127,13 +127,16 @@ static void blk_rq_check_expired(struct request *rq, unsigned long *next_timeout
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
-void blk_rq_timed_out_timer(unsigned long data)
|
|
|
|
|
|
+void blk_timeout_work(struct work_struct *work)
|
|
{
|
|
{
|
|
- struct request_queue *q = (struct request_queue *) data;
|
|
|
|
|
|
+ struct request_queue *q =
|
|
|
|
+ container_of(work, struct request_queue, timeout_work);
|
|
unsigned long flags, next = 0;
|
|
unsigned long flags, next = 0;
|
|
struct request *rq, *tmp;
|
|
struct request *rq, *tmp;
|
|
int next_set = 0;
|
|
int next_set = 0;
|
|
|
|
|
|
|
|
+ if (blk_queue_enter(q, true))
|
|
|
|
+ return;
|
|
spin_lock_irqsave(q->queue_lock, flags);
|
|
spin_lock_irqsave(q->queue_lock, flags);
|
|
|
|
|
|
list_for_each_entry_safe(rq, tmp, &q->timeout_list, timeout_list)
|
|
list_for_each_entry_safe(rq, tmp, &q->timeout_list, timeout_list)
|
|
@@ -143,6 +146,7 @@ void blk_rq_timed_out_timer(unsigned long data)
|
|
mod_timer(&q->timeout, round_jiffies_up(next));
|
|
mod_timer(&q->timeout, round_jiffies_up(next));
|
|
|
|
|
|
spin_unlock_irqrestore(q->queue_lock, flags);
|
|
spin_unlock_irqrestore(q->queue_lock, flags);
|
|
|
|
+ blk_queue_exit(q);
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|