Wiadomość napisana przez Pawel Jakub Dawidek w dniu 7 lip 2012, o godz. 23:54:
> On Sat, Jul 07, 2012 at 08:13:41PM +0000, Edward Tomasz Napierala wrote:
>> Author: trasz
>> Date: Sat Jul  7 20:13:40 2012
>> New Revision: 238213
>> URL: http://svn.freebsd.org/changeset/base/238213
>> 
>> Log:
>>  Add a new GEOM method, resize(), which is called after provider size 
>> changes.
>>  Add a new routine, g_resize_provider(), to use to notify GEOM about provider
>>  change.
>> 
>>  Reviewed by:        mav
>>  Sponsored by:       FreeBSD Foundation
> [...]
>> -    void                    *spare2;
>> +    g_resize_t              *resize;
> [...]
>> -    void                    *spare1;
>> +    g_resize_t              *resize;
> [...]
> 
> If you take the time to actually read the commit log from the change
> that added those spare fields, you will notice they were not added for
> you to consume them.

Perhaps it wasn't your original intent, but they are spares.  One of these
was already reused for some other task, btw.

> You will also notice that one of those fields were left for more
> universal method to handle various provider's property changes (ie.
> provider's name, apart from its mediasize). The initial patch was even
> published a year ago:
> 
>       http://people.freebsd.org/~pjd/patches/geom_property_change.patch
> 
> Even if it was somehow totally not reusable it would at least give you a
> hint that mediasize is not the only thing that can change and if we are
> making that change it should be done right.

I was not aware of that patch.  What I've considered was to use attributes
instead, but that would complicate notifying consumers about resizing
and would require some special-casing in the attribute code.

>> +static void
>> +g_resize_provider_event(void *arg, int flag)
>> +{
> [...]
>> +    if (flag == EV_CANCEL)
>> +            return;
> 
> How it can be canceled? Because I'm clearly missing something. You post
> this event without giving any pointers, so how g_cancel_event() can find
> this event can cancel it?

Copy-pasto, my bad.  Thanks for spotting this.

>> +    hh = arg;
>> +    pp = hh->pp;
>> +    size = hh->size;
> 
> Where do you free the memory allocated for 'hh'?

It should be here, and it will be added soon.

>> +    G_VALID_PROVIDER(pp);
> 
> Is this your protection from a provider going away?

Can you suggest a way to do it in a safe way that doesn't involve
rewriting most of GEOM?

>> +    LIST_FOREACH_SAFE(cp, &pp->consumers, consumers, cp2) {
>> +            gp = cp->geom;
>> +            if (gp->resize == NULL && size < pp->mediasize)
>> +                    cp->geom->orphan(cp);
>> +    }
> 
> Why is this safe to call the orphan method directly and not use
> g_orphan_provider()? I don't know if using g_orphan_provider() is safe
> to use here either, but I'm under impression that you assume no orphan
> method will ever drop the topology lock? We have tools to assert that,
> no need to introduce such weak assumptions.

It's not that using g_orphan_provider() would be safer here - it simply
wouldn't work.  The way it works is by adding providers to a queue
(g_doorstep).  _Providers_, and we need to orphan individual consumers.
So, this would involve rewriting the orphanisation mechanism.  Also,
most of the classes were fixed by mav@ to handle this correctly, IIRC.

>> +void
>> +g_resize_provider(struct g_provider *pp, off_t size)
>> +{
>> +    struct g_hh00 *hh;
>> +
>> +    G_VALID_PROVIDER(pp);
>> +
>> +    if (size == pp->mediasize)
>> +            return;
>> +
>> +    hh = g_malloc(sizeof *hh, M_WAITOK | M_ZERO);
>> +    hh->pp = pp;
> 
> Care to explain why the provider can't disappear between now and the
> event thread calling g_resize_provider_event()?

See above.

-- 
If you cut off my head, what would I say?  Me and my head, or me and my body?

_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to