Ethan Quach wrote: > > > 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) {
Ooops, this should have been a " == 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 > _______________________________________________ > caiman-discuss mailing list > caiman-discuss at opensolaris.org > http://mail.opensolaris.org/mailman/listinfo/caiman-discuss