

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);
 		}

_
