Skip to content

Commit

Permalink
bfq-iosched: fix NULL ioc check in bfq_get_rq_private
Browse files Browse the repository at this point in the history
icq_to_bic is a container_of operation, so we need to check for NULL
before it.  Also move the check outside the spinlock while we're at
it.

Signed-off-by: Christoph Hellwig <[email protected]>
Signed-off-by: Jens Axboe <[email protected]>
  • Loading branch information
Christoph Hellwig authored and axboe committed Jun 18, 2017
1 parent 037cebb commit 9f21073
Showing 1 changed file with 5 additions and 10 deletions.
15 changes: 5 additions & 10 deletions block/bfq-iosched.c
Original file line number Diff line number Diff line change
Expand Up @@ -4398,16 +4398,17 @@ static int bfq_get_rq_private(struct request_queue *q, struct request *rq,
struct bio *bio)
{
struct bfq_data *bfqd = q->elevator->elevator_data;
struct bfq_io_cq *bic = icq_to_bic(rq->elv.icq);
struct bfq_io_cq *bic;
const int is_sync = rq_is_sync(rq);
struct bfq_queue *bfqq;
bool new_queue = false;
bool split = false;

spin_lock_irq(&bfqd->lock);
if (!rq->elv.icq)
return 1;
bic = icq_to_bic(rq->elv.icq);

if (!bic)
goto queue_fail;
spin_lock_irq(&bfqd->lock);

bfq_check_ioprio_change(bic, bio);

Expand Down Expand Up @@ -4465,13 +4466,7 @@ static int bfq_get_rq_private(struct request_queue *q, struct request *rq,
bfq_handle_burst(bfqd, bfqq);

spin_unlock_irq(&bfqd->lock);

return 0;

queue_fail:
spin_unlock_irq(&bfqd->lock);

return 1;
}

static void bfq_idle_slice_timer_body(struct bfq_queue *bfqq)
Expand Down

0 comments on commit 9f21073

Please sign in to comment.