Fix AS io contexts drivers/block/as-iosched.c | 8 ++++---- 1 files changed, 4 insertions(+), 4 deletions(-) diff -puN drivers/block/as-iosched.c~as-handle-exitted-tasks-fix drivers/block/as-iosched.c --- 25/drivers/block/as-iosched.c~as-handle-exitted-tasks-fix 2003-02-27 02:01:30.000000000 -0800 +++ 25-akpm/drivers/block/as-iosched.c 2003-02-27 02:01:50.000000000 -0800 @@ -196,7 +196,7 @@ static void put_as_io_context(struct as_ void exit_as_io_context(struct as_io_context *aic) { clear_bit(AS_IO_RUNNING, &aic->state); - put_as_io_context(&aic); + put_as_io_context(aic); } /* @@ -220,6 +220,7 @@ static struct as_io_context *get_as_io_c tsk->as_io_context = ret; } } + /* TODO What if ret is free'ed here? */ atomic_inc(&ret->refcount); return ret; } @@ -413,7 +414,6 @@ static void as_add_request(struct as_dat { const int data_dir = rq_data_dir(arq->request); - put_as_io_context(&arq->as_io_context); arq->as_io_context = get_as_io_context(); as_add_arq_rb(ad, arq); @@ -467,6 +467,8 @@ static void as_remove_request(request_qu arq_next, arq_prev); } as_del_arq_rb(ad, arq); + if (ON_RB(&arq->rb_node)) + put_as_io_context(&arq->as_io_context); } if (q->last_merge == &rq->queuelist) @@ -596,7 +598,6 @@ as_merged_requests(request_queue_t *q, s * kill knowledge of next, this one is a goner */ as_remove_request(q, next); - put_as_io_context(&arq->as_io_context); } /* @@ -1222,7 +1223,6 @@ static void as_exit(request_queue_t *q, if ((arq = RQ_DATA(rq)) == NULL) continue; - put_as_io_context(&arq->as_io_context); rq->elevator_private = NULL; kmem_cache_free(arq_pool, arq); } _