On Tue, May 29, 2018 at 01:40:34PM +0800, Anand Jain wrote:
> >>> v3->v4: As we traverse through the seed device, fs_device gets 
> >>> updated with
> >>>     the child seed fs_devices, so make sure we use the same fs_devices
> >>>     pointer for the mutex_unlock as used for the mutex_lock.
> >>
> >> Well, now that I see the change, shouldn't we always hold the
> >> device_list_mutex of the fs_devices that's being processed? Ie. each
> >> time it's switched, the previous is unlocked and new one locked.
> > 
> >   No David. That's because we organize seed device under its parent
> >   fs_devices ((fs_devices::seed)::seed)..so on, and they are a local
> >   cloned copy of the original seed fs_devices. So parent's
> >   fs_devices::device_list_mutex lock will suffice.
> 
>   On the 2nd thought, though theoretically you are right. But practically
>   there isn't any use case which can benefit by using the intricate
>   locking as you suggested above.

I don't think it's intricate or complex, just lock the fs_devices that
can be potentially modified in the following loop.

Schematically:

function called with some fs_devices

again:
        lock fs_devices->device_list_mutex
        foreach device in fs_devices
                if ...
                        fs_devices counters get changed after device
                        deletion
        endfor

        if (fs_devices->seed)
                unlock fs_devices->device_list_mutex
                fs_devices = fs_devices->seed
                lock fs_devices->device_list_mutex      <-- lock the new one
                goto again
        endif

        unlock fs_devices->device_list_mutex            <-- correctly unlock
endfunc

>   I am following the following method:-
>   By holding the parent fs_devices (which is also the mounted fs_devices
>   lock) it would imply to lock its dependent cloned seed fs_devices, as
>   to reach the cloned seed device, first we need to traverse from the
>   parent fs_devices.

Locking the parent fs_devices might be the right scheme, but if any
child fs_devices pointer gets passed to a random function that will
change it, then the locking will not protect it.

This might need a deeper audit how the seeding device is done and maybe
add some helpers that eg. lock the whole chain so all of them are
protected.
--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to