[dm-devel] Re: dm-emc hardware handler patches
Edward Goggin
egoggin at emc.com
Wed Dec 6 22:32:06 UTC 2006
On Wednesday, December 06, 2006 5:06 PM, Alasdair G Kergon wrote
> How about this instead?
Much better idea. I wish I thought of it!
Is the rest of the patch OK?
Do I need to do anything more with this?
>
> --- linux-2.6.19.orig/drivers/md/dm-hw-handler.h
> 2006-12-06 20:49:24.000000000 +0000
> +++ linux-2.6.19/drivers/md/dm-hw-handler.h 2006-12-06
> 21:18:46.000000000 +0000
> @@ -16,6 +16,7 @@
> struct hw_handler_type;
> struct hw_handler {
> struct hw_handler_type *type;
> + struct mapped_device *md;
> void *context;
> };
>
>
> Then each hw-handler wouldn't need its own code to store it and
> we'd just have:
>
> --- linux-2.6.19.orig/drivers/md/dm-mpath.c 2006-12-06
> 20:55:37.000000000 +0000
> +++ linux-2.6.19/drivers/md/dm-mpath.c 2006-12-06
> 21:35:09.000000000 +0000
> @@ -666,6 +666,9 @@ static int parse_hw_handler(struct arg_s
> return -EINVAL;
> }
>
> + m->hw_handler.md = dm_table_get_md(ti->table);
> + dm_put(m->hw_handler.md);
> +
> r = hwht->create(&m->hw_handler, hw_argc - 1, as->argv);
> if (r) {
> dm_put_hw_handler(hwht);
>
>
>
> > + /*
> > + * No need to hold a reference on the mapped device here
> > + * since one is already held for the duration of the
> > + * mapped device open.
> > + */
>
> I think it's stronger than that: a (self-)reference must not
> be held here,
> or how would the reference count ever subsequently drop to zero?
>
Agreed, that is the way I initially implemented it and I ran into
the exact problem you describe.
> Makes you wonder in what circumstances the dm_get() in
> dm_table_get_md()
> is ever required.
Yup, but while it's a stretch, possibly some code path may
want to hold a reference to the mapped device even if the
device was already removed from the hash table.
More information about the dm-devel
mailing list