X-Git-Url: http://git.cascardo.info/?a=blobdiff_plain;f=block%2Fas-iosched.c;h=8c3946787dbbbaedd3381a195ab7851e84ec8272;hb=3bc217ffe6774e7971d6a7ce6350ce806ebab044;hp=96036846a0017505691060d62734afc0dcad9529;hpb=44c3b59102e3ecc7a01e9811862633e670595e51;p=cascardo%2Flinux.git diff --git a/block/as-iosched.c b/block/as-iosched.c index 96036846a001..8c3946787dbb 100644 --- a/block/as-iosched.c +++ b/block/as-iosched.c @@ -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 */ @@ -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)); @@ -1266,22 +1268,8 @@ static void as_merged_requests(struct request_queue *q, struct request *req, */ if (!list_empty(&req->queuelist) && !list_empty(&next->queuelist)) { if (time_before(rq_fifo_time(next), rq_fifo_time(req))) { - struct io_context *rioc = RQ_IOC(req); - struct io_context *nioc = RQ_IOC(next); - list_move(&req->queuelist, &next->queuelist); rq_set_fifo_time(req, rq_fifo_time(next)); - /* - * Don't copy here but swap, because when anext is - * removed below, it must contain the unused context - */ - if (rioc != nioc) { - double_spin_lock(&rioc->lock, &nioc->lock, - rioc < nioc); - swap_io_context(&rioc, &nioc); - double_spin_unlock(&rioc->lock, &nioc->lock, - rioc < nioc); - } } }