[dm-devel] Re: dm-multipath based engenio-lsi hardware handler

Mike Christie michaelc at cs.wisc.edu
Thu Mar 22 18:04:35 UTC 2007


Chandra Seetharaman wrote:

Did you see may later revisions on this or Ed's updated handler? In the
current kernel we do not need to allocate or manage our own bios. That
was a old old hack from when the request did not have a end io. The hack
is probably only needed for old distros. It is not needed upstream.

For dm based hw handlers you want to do something more like this:
http://www.cs.wisc.edu/~michaelc/block/dm/v4/

> static struct bio *get_rdac_bio(struct path *path, unsigned data_size,
> 		bio_end_io_t endio, int rw, struct rdac_handler *h)
> {
> 	struct bio *bio;
> 	struct page *page;
> 	struct rdac_private *p;
> 
> 	bio = bio_alloc(GFP_ATOMIC, 1);
> 	if (!bio)
> 		return NULL;
> 
> 	if (rw == WRITE)
> 		bio->bi_rw |= (1 << BIO_RW);
> 	bio->bi_bdev = path->dev->bdev;
> 	bio->bi_sector = 0;
> 	bio->bi_end_io = endio;
> 
> 	p = kmalloc(sizeof(*p), GFP_ATOMIC);
> 	if (!p)
> 		goto bio;
> 
> 	p->path = path;
> 	p->h = h;
> 	bio->bi_private = p;
> 	page = alloc_page(GFP_ATOMIC);
> 	if (!page)
> 		goto free_private;
> 
> 	if (bio_add_page(bio, page, data_size, 0) == data_size)
> 		return bio;
> 
> 	__free_page(page);
> free_private:
> 	kfree(p);
> bio:
> 	bio_put(bio);
> 	return NULL;
> }



> 
> static void rdac_pg_init(struct hw_handler *hwh, unsigned bypassed,
> 			struct path *path)
> {
> 	struct rdac_handler *h = hwh->context;
> 
> 	switch (h->lun) {
> 	case UNINITIALIZED_LUN:
> 		submit_c8_inquiry(h, path);
> 		break;
> 	case UNSUPPORTED_LUN:
> 		dm_pg_init_complete(path, MP_FAIL_PATH);
> 		break;
> 	default:
> 		submit_c9_inquiry(h, path);
> 	}
> }
> 

Why not just have userspace check and pass the LUN to the create
function? This is not a review comment to do it. I am just asking if it
is difficult to gather info in userspace and pass it down?




More information about the dm-devel mailing list