|
|
@@ -1886,9 +1886,14 @@ static void bfq_request_merged(struct request_queue *q, struct request *req,
|
|
|
blk_rq_pos(container_of(rb_prev(&req->rb_node),
|
|
|
struct request, rb_node))) {
|
|
|
struct bfq_queue *bfqq = bfq_init_rq(req);
|
|
|
- struct bfq_data *bfqd = bfqq->bfqd;
|
|
|
+ struct bfq_data *bfqd;
|
|
|
struct request *prev, *next_rq;
|
|
|
|
|
|
+ if (!bfqq)
|
|
|
+ return;
|
|
|
+
|
|
|
+ bfqd = bfqq->bfqd;
|
|
|
+
|
|
|
/* Reposition request in its sort_list */
|
|
|
elv_rb_del(&bfqq->sort_list, req);
|
|
|
elv_rb_add(&bfqq->sort_list, req);
|
|
|
@@ -1930,6 +1935,9 @@ static void bfq_requests_merged(struct request_queue *q, struct request *rq,
|
|
|
struct bfq_queue *bfqq = bfq_init_rq(rq),
|
|
|
*next_bfqq = bfq_init_rq(next);
|
|
|
|
|
|
+ if (!bfqq)
|
|
|
+ return;
|
|
|
+
|
|
|
/*
|
|
|
* If next and rq belong to the same bfq_queue and next is older
|
|
|
* than rq, then reposition rq in the fifo (by substituting next
|
|
|
@@ -4590,12 +4598,12 @@ static void bfq_insert_request(struct blk_mq_hw_ctx *hctx, struct request *rq,
|
|
|
|
|
|
spin_lock_irq(&bfqd->lock);
|
|
|
bfqq = bfq_init_rq(rq);
|
|
|
- if (at_head || blk_rq_is_passthrough(rq)) {
|
|
|
+ if (!bfqq || at_head || blk_rq_is_passthrough(rq)) {
|
|
|
if (at_head)
|
|
|
list_add(&rq->queuelist, &bfqd->dispatch);
|
|
|
else
|
|
|
list_add_tail(&rq->queuelist, &bfqd->dispatch);
|
|
|
- } else { /* bfqq is assumed to be non null here */
|
|
|
+ } else {
|
|
|
idle_timer_disabled = __bfq_insert_request(bfqd, rq);
|
|
|
/*
|
|
|
* Update bfqq, because, if a queue merge has occurred
|