Keith Mitchell wrote:
>>
>> be_list.c
>> -------------
>> 777-782 - this is another usage of err that seems suspect.
>> These lines can be simplified to:
>>
>>    if (zfs_prop_get(zhp, ZFS_PROP_MOUNTPOINT, prop_buf,
>>        ZFS_MAXPROPLEN, NULL, NULL, 0, B_FALSE) != 0)
>>            be_node->be_mntpt = NULL;
>>    else
>>            be_node->be_mntpt = strdup(prop_bug);
>>
>>
>> Otherwise, err seems like it would get set to some non-zero
>> number here and the function continues on, and at the end
>> of the function at line 820, we potentially return something
>> gathered from the zfs_prop_get() function call which is not
>> a be_errno_t type.  This doesn't look right.
> What should the correct return be in this case? At present, if 
> zfs_prop_get fails, be_node->be_mntpt is set to NULL, and the error 
> code from zfs_prop_get is returned at the end of the function (which 
> is not a be_errno_t, as you mention). Should the code actually stay as 
> is, capturing err = zfs_prop_get? If so, is there a libzfs err to be 
> err function somewhere, and should that conversion & return be done at 
> the end of the function, or immediately after the failure? If not, 
> with your suggested change, there is a change in functionality: a 
> failure to find the mountpoint returns BE_SUCCESS (0) where previously 
> it returned a non-zero error code.

I just looked at the code[1], zfs_prop_get() returns 0 on success
and -1 on error.  We should definitely not be returning -1 from
our function here in any cases.  I looked around at our other
uses of zfs_prop_get() and a non-zero return is (except for one
special usage of it in be_activate.c) always interpreted as an
unrecoverable error and we return at that point right away.
An non-zero return from zfs_prop_get() isn't a normal
occurrence so I think that the existing err path here probably
wasn't ever exercised at all anyway.

So I think this code should be:

    if (zfs_prop_get(zhp, ZFS_PROP_MOUNTPOINT, prop_buf,
        ZFS_MAXPROPLEN, NULL, NULL, 0, B_FALSE) != 0) {
            be_node->be_mntpt = strdup(prop_buf);
    } else {
            return (zfs_err_to_be_err(g_zfs));
    }


And the last line of the function should return BE_SUCCESS
explicitly.

[1] fyi, the zfs code lives in the ON gate.  On the swan, you can
get to it here /ws/onnv-gate

>
>> 879-885 can be simplified to:
>>
>>    if (zfs_prop_get(zfshp, ZFS_PROP_MOUNTPOINT,
>>        prop_buf, ZFS_MAXPROPLEN, NULL, NULL, 0,
>>        B_FALSE) != 0)
>>            dataset->be_ds_mntpt = NULL;
>>    else
>>            dataset->be_ds_mntpt = strdup(prop_buf);
>>
>>
>> Otherwise err gets set and return as a non be_errno_t
>> type.
> Same response as above.

See above.  It applies here as well.


>>
> Thanks for the comments. By the way, if you have any tips for getting 
> DIY to run, I'm having issues with that... 

I've actually yet to do a DIY request for libbe changes so can't
really help you there.  What are you having issues with?

> I'll post an updated webrev once I know what to do in regards to the 
> zfs_prop_get question above.

Okay, I'll have another go around when you've updated
everything.


thanks,
-ethan

>
> - Keith
>>
>>
>> Keith Mitchell wrote:
>>> A new webrev has been posted at:
>>> http://cr.opensolaris.org/~kemitche/3837a/
>>>
>>> Evan Layton wrote:
>>>> Keith Mitchell wrote:
>>>>>
>>>>>>
>>>>>> line  591 zret should be initialized to 0 (or BE_SUCESS since 
>>>>>> it's used for both zfs_iter function return codes and 
>>>>>> be_clone_fs_callback).
>>>>> Done.
>>>>>> It might be best as part of this to clean up these return 
>>>>>> variables so we make the use of things like err, zret and ret 
>>>>>> consistent. This needs to be looked at throughout...
>>>>>> Maybe something like:
>>>>>> err for capturing errno's
>>>>>> zret for capturing zfs related errors
>>>>>> ret for returning BE errors and errors that have been translated 
>>>>>> into BE errors.
>>>>> Ok. I'll go through again and clean up these instances.
>>>>
>>>> It's probably not worth having you look through all of these right 
>>>> now but would be helpful to have you look at the areas that you've 
>>>> touched only. As for the rest of these could you file a bug to 
>>>> state that we should be more consistent with these error variables 
>>>> and attach that to 9941 as well?
>>> Agreed. 10481 filed.
>>> http://defect.opensolaris.org/bz/show_bug.cgi?id=10481
>>>>
>>>>>>
>>>>>> 1796 ret is defined here and again at line 1886. The second one 
>>>>>> isn't needed and should be removed.
>>>>> Fixed.
>>>>>>
>>>>>> 2148 - 2150 returns err but doesn't set it so we could be sending 
>>>>>> an error from somewhere else or just what was initialized. This 
>>>>>> needs an actual error message.
>>>>> err is set at line 2139. However, The inner 'if' statement is kind 
>>>>> of backwards. I'll change it to:
>>>>>
>>>>> 2139         if ((err = zfs_iter_filesystems(zhp, 
>>>>> be_clone_fs_callback, bt)) != 0) {
>>>>> 2140                 /*
>>>>> 2141                  * Error occurred while processing a child 
>>>>> dataset.
>>>>> 2142                  * Destroy this dataset and return error.
>>>>> 2143                  */
>>>>> 2144                 zfs_handle_t    *d_zhp = NULL;
>>>>> 2145 2146                 ZFS_CLOSE(zhp);
>>>>> 2147 2148                 if ((d_zhp = zfs_open(g_zfs, clone_ds, 
>>>>> ZFS_TYPE_FILESYSTEM))
>>>>> 2149                     != NULL) {
>>>>>                             (void) zfs_destroy(d_zhp);
>>>>>                             ZFS_CLOSE(d_zhp);
>>>>> 2150                         2151                 }
>>>>> 2155                 return (err);
>>>>> 2156         }
>>>>>
>>>>> This is logically equivalent to the previous but doesn't have the 
>>>>> same 'backwardness' to it.
>>>>
>>>> I think this is fine for now. What I was originally worried about 
>>>> was the fact that if the zfs_destroy fails we would not catch that 
>>>> error and we could silently leave the clone dataset hanging around. 
>>>> However I think fixing that so we provide some notice that the 
>>>> clean-up after the original failure was also not successful is 
>>>> really more something that should be addressed in bug 9941 and the 
>>>> BE management observability project.
>>>>
>>>> All this being said, I'm fine with the changes now.
>>> Excellent. As mentioned, a new webrev was posted. I had an issue 
>>> setting up the DIY test so I'm still awaiting those results.
>>>
>>> - Keith
>>>>
>>>> -evan
>>>>
>>>>>>
>>>>>> be_mount.c:
>>>>>> ===========
>>>>>> lines 238 and 395 ret should also be set to BE_SUCCESS
>>>>> Fixed.
>>>>>>
>>>>>> 1441 set err = BE_SUCCESS?
>>>>> Yes, done.
>>>>>>
>>>>>>
>>>>>> Other than these I don't see anything that hasn't already been 
>>>>>> mentioned.
>>>>>>
>>>>>> -evan 
>>>>> New webrev will be posted after I've:
>>>>> * changed relevant "== 0" statements to "== BE_SUCCESS"
>>>>> * reviewed instances of err, errno, ret and zret for consistent usage
>>>>> * run the DIY libbe test against the changes
>>>>>
>>>>> - Keith
>>>>
>>> _______________________________________________
>>> caiman-discuss mailing list
>>> caiman-discuss at opensolaris.org
>>> http://mail.opensolaris.org/mailman/listinfo/caiman-discuss

Reply via email to