On Tue, Sep 24, 2013 at 3:20 PM, Dan Carpenter <[email protected]> wrote:
> On Tue, Sep 24, 2013 at 02:40:10PM -0400, Lidza Louina wrote:
>> Instead of writing:
>> brd->SerialDriver = alloc_tty_driver(MAXPORTS);
>> if (!brd->SerialDriver){
>> goto free_stuff;
>> return -ENOMEM;
>> }
>>
>> Would it correct if I wrote:
>> brd->SerialDriver = alloc_tty_driver((MAXPORTS);
>> if (!brd->SerialDriver){
>> kfree(brd->SerialDriver);
>> return -ENOMEM;
>> }
>>
>> Just to avoid writing goto statements? >_<
>
> No. The problem with doing it that way is that we end up with multiple
> calls to kfree(brd->SerialDriver);. The error handling becomes more
> complex and error prone.
>
> This is explained in Documentation/CodingStyle.
Okay, I read that. Thanks.
> It should be written in mirror format. All the resources are freed in
> the reverse order that they are allocated.
>
> one = kmalloc();
> if (!one)
> return -ENOMEM;
>
> two = kmalloc();
> if (!two) {
> ret = -ENOMEM;
> goto err_free_one;
> }
>
> three = kmalloc();
> if (!three) {
> ret = -ENOMEM;
> goto err_free_two;
> }
> ret = frob();
> if (ret)
> goto err_free_three;
>
>
> err_free_three:
> kfree(three);
> err_free_two:
> kfree(two);
> err_free_one:
> kfree(one);
>
> return ret;
I looked at other uses of the function alloc_tty_driver() in
the kernel and none of them seem to follow up with a
call to kfree(). Are they supposed to? I realize that
because the allocation failed, I wouldn't need to call
kfree afterward. >_< So this should be enough:
if(!brd->PrintDriver){
rc = -ENOMEM;
}
The code then returns rc at the end of the function.
Is this code supposed to include a call to kfree? If so,
what makes this driver different from the others?
> Most of the time, there shouldn't be any if statements in the cleanup.
>
> A common mistake is to use GW-BASIC names.
> err_1:
> kfree(foo);
> err_2:
> kfree(bar);
>
> That's not useful because it doesn't describe what happens at the label.
>
> Another mistake is to choose label names based on the goto location.
>
> if (kmalloc_failed)
> goto err_kmalloc_failed;
>
> I already know kmalloc failed so the label name is totally useless.
Okay, thanks for the tip. I'll keep that in mind
whenever I use goto statements. :)
> Once you have your error handling cleanup block at the end of the
> function, then that should almost match the release() function. Btw, I
> notice this dgap_tty_register() function doesn't have a matching
> unregister function and actually dgap_tty_register() is never called.
> :P
Hmm, ok, I'll do that next on this driver. >_< Add
dgap_tty_unregister() and make sure it and
dgap_tty_register() get called.
_______________________________________________
devel mailing list
[email protected]
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel