Skip to content

Commit

Permalink
as-iosched: fix inconsistent ioc->lock context
Browse files Browse the repository at this point in the history
Since it's acquired from irq context, all locking must be of the
irq safe variant. Most are already inside the queue lock (which
already disables interrupts), but the io scheduler rmmod path
always has irqs enabled and the put_io_context() path may legally
be called with irqs enabled (even if it isn't usually). So fixup
those two.

Signed-off-by: Jens Axboe <[email protected]>
  • Loading branch information
Jens Axboe committed Feb 1, 2008
1 parent 4f4f6c2 commit 8bdd3f8
Showing 1 changed file with 6 additions and 4 deletions.
10 changes: 6 additions & 4 deletions block/as-iosched.c
Original file line number Diff line number Diff line change
Expand Up @@ -170,11 +170,11 @@ static void free_as_io_context(struct as_io_context *aic)

static void as_trim(struct io_context *ioc)
{
spin_lock(&ioc->lock);
spin_lock_irq(&ioc->lock);
if (ioc->aic)
free_as_io_context(ioc->aic);
ioc->aic = NULL;
spin_unlock(&ioc->lock);
spin_unlock_irq(&ioc->lock);
}

/* Called when the task exits */
Expand Down Expand Up @@ -235,10 +235,12 @@ static void as_put_io_context(struct request *rq)
aic = RQ_IOC(rq)->aic;

if (rq_is_sync(rq) && aic) {
spin_lock(&aic->lock);
unsigned long flags;

spin_lock_irqsave(&aic->lock, flags);
set_bit(AS_TASK_IORUNNING, &aic->state);
aic->last_end_request = jiffies;
spin_unlock(&aic->lock);
spin_unlock_irqrestore(&aic->lock, flags);
}

put_io_context(RQ_IOC(rq));
Expand Down

0 comments on commit 8bdd3f8

Please sign in to comment.