[dm-devel] Re: [PATCH] add endio fn to request structures

Jens Axboe axboe at suse.de
Tue May 25 06:42:40 UTC 2004


On Mon, May 24 2004, Mike Christie wrote:
> Jens,
> 
> Some storage devices have a mode where they require a special
> command be sent inorder to perform failover. IBM's fastt is one of
> these devices we are trying to add support for using the dm-multipath
> framework.
> 
> The problem is that dm works at the bio level and we need to send down
> something like a block pc or special request. So from dm multipath we could
> have a thread and do a blk_execute_rq, or if we had some sort of end_request
> function similar to the bio's and bh's endio function we could send the
> failover command asynchronously. The attached patch adds an end_request fn
> to the request structure for this purpose.
> 
> Maybe the fact that I have to ask for such a change should indidcate that
> I am doing something brain dead, in which case please be gentle in your 
> review
> of my patch :)

I don't think you are, on and off I've added this feature myself
privately for various reasons. I can think of several places in the
kernel right now that could be made a lot easier with this sort of async
notication.

> @@ -2752,9 +2769,16 @@ void end_that_request_last(struct reques
>  		disk->in_flight--;
>  	}
>  	__blk_put_request(req->q, req);
> -	/* Do this LAST! The structure may be freed immediately afterwards */
> -	if (waiting)
> -		complete(waiting);
> +
> +	/*
> +	 * If you are allocating reqs from the block layer you
> +	 * should get a handle to the req and release it after
> +	 * your end_request_fn is run.
> +	 */
> +	if (end_fn) {
> +		req->end_request = NULL;
> +		end_fn(req);
> +	}

Uh oh, this is bad news. Let __blk_put_request() clear ->end_request()
if you need to, you definitely cannot do it here after putting your
reference to it.

> diff -aurp linux-2.6.6/drivers/ide/ide-cd.c linux-2.6.6-work/drivers/ide/ide-cd.c
> --- linux-2.6.6/drivers/ide/ide-cd.c	2004-05-09 19:32:29.000000000 -0700
> +++ linux-2.6.6-work/drivers/ide/ide-cd.c	2004-05-22 15:17:05.000000000 -0700
> @@ -555,6 +555,8 @@ static void cdrom_queue_request_sense(id
>  
>  	rq->flags = REQ_SENSE;
>  	rq->waiting = wait;
> +	if (wait)
> +		rq->end_request = blk_end_sync_rq;
>  
>  	/* NOTE! Save the failed command in "rq->buffer" */
>  	rq->buffer = (void *) failed_command;
> @@ -719,6 +721,7 @@ static int cdrom_decode_status(ide_drive
>  		if ((stat & ERR_STAT) != 0) {
>  			wait = rq->waiting;
>  			rq->waiting = NULL;
> +			rq->end_request = NULL;
>  			if ((rq->flags & REQ_BLOCK_PC) != 0) {
>  				cdrom_queue_request_sense(drive, wait,
>  							  rq->sense, rq);

I'd rather you don't 'convert' any drivers. blk_execute_rq() change is
fine, but leave these alone. They need seperate checking imo since cases
like the above aren't straight forward.

-- 
Jens Axboe




More information about the dm-devel mailing list