On Tue 16-06-26 16:08:19, Christian Brauner wrote:
> __put_super() required the caller to hold sb_lock, so put_super()
> wrapped it. The per-device superblock table introduced later drops its
> passive references from contexts that do not hold sb_lock, so make
> put_super() self-locking: drop the count first and take sb_lock only for
> the final list_del.
> 
> With the count now dropped outside sb_lock a superblock can briefly sit
> on @super_blocks with s_passive == 0 before it is unlinked, so the list
> walkers (__iterate_supers(), iterate_supers_type(), user_get_super())
> switch to refcount_inc_not_zero() and skip it.
> 
> Signed-off-by: Christian Brauner (Amutable) <[email protected]>

Looks good, just one style nit below. Feel free to add:

Reviewed-by: Jan Kara <[email protected]>

> -static void __put_super(struct super_block *s)
> +void put_super(struct super_block *s)
>  {
>       if (refcount_dec_and_test(&s->s_passive)) {
> +

I'd delete this empty line.

> +             spin_lock(&sb_lock);
>               list_del_init(&s->s_list);
> +             spin_unlock(&sb_lock);
> +


                                                                Honza
-- 
Jan Kara <[email protected]>
SUSE Labs, CR

Reply via email to