[Devel] [PATCH vz7 v2] ploop: properly restore old delta kobject on replace error
Alexander Atanasov
alexander.atanasov at virtuozzo.com
Fri Jun 9 13:20:45 MSK 2023
On 9.06.23 9:11, Pavel Tikhomirov wrote:
>
>
> On 09.06.2023 00:19, Alexander Atanasov wrote:
>> Current code removes the old_delta kobject before the new delta
>> is ready to be used in case there is an error while reading BAT,
>> the "too short BAT" error we have seen.
>
> The above sentence seems incomplete, as in an opposite case where there
> was no error, old_delta kobject would have been removed before new delta
> is ready anyway =)
Ok, i will try to make it clear.
.... [snip] ...
>> +/*
>> + * Have to implement own version of kobject_rename since it is GPL
>> only symbol
>> + */
>> +static int ploop_rename_delta(struct ploop_delta *delta, int level,
>> char *pref)
>> +{
>> + kobject_del(&delta->kobj);
>> + return KOBJECT_ADD(&delta->kobj, &delta->plo->kobj,
>> + "%s%d", pref ? : "", level);
>> +}
>> +
>
> It would probably be cleaner to put this function just before the
> function using it (rename_deltas).
Ok.
... [snip] ...
>> -
>> -out_kobj_del:
>> - kobject_del(&delta->kobj);
>> kobject_put(&plo->kobj);
>> + return 0;
>> +out_kobj_restore:
>> + /* we haven't dropped our plo->kobj ref just add back */
>> + err = KOBJECT_ADD(&old_delta->kobj, &plo->kobj, "%d",
>> old_delta->level);
>> + if (err < 0) {
>> + PL_ERR(plo, "Failed to restore old delta kobject\n");
>> + /*
>> + * Get an extra ref to parent object as kobject_add does, so it
>> + * later kobject_del doesn't destory it
>> + */
>> + kobject_get(&plo->kobj);
>
> Later kobject_del would not see parent object as first kobject_del did
> "kobj->parent = NULL;", so in this aspect you should not be getting
> reference here.
>
> note: Problem I was talking in my previous message was about kobj->kset
> put.
Yes, the problem comes from doing double kobject_put which results in
double kobj_kset_leave call which results in double kset_put.
I've missed the clearing of kobject->parent so came the idea about the
extra ref. Now i wonder would it help to take an extra ref for the
kobj->kset since there is no other way to handle the error. What do you
think about that ?
--
Regards,
Alexander Atanasov
More information about the Devel
mailing list