Hi Sarah,
I'll address the comments towards the bottom.
On 12/18/09 09:30, Sarah Jelinek wrote:
> Hi Keith and all,
>
> My code review comments for the library code. I reviewed all files in:
>
> libtarget_pymod
> libtd
> libzoneinfo
>
> If a file is not listed I had no comments for it. I will send my review
> of the profile code later today.
>
> thanks,
> sarah
> ****
>
> libtarget_pymod/discover.c:
>> 69 //PyThreadState *_save;
>> 70 //_save = PyEval_SaveThread();
>
> These need to be removed or used.
>
>
>> 319 if (attrl != NULL)
>> 320 td_attribute_list_free(attrl);
>
> Not sure you need to check for attrl != NULL here. Looks like the
> function will do the right thing, either way. Ditto for other places you
> are checking for this.
>
>> 483 disk = Tgt_NEW(TgtDisk);
>> 484 if (disk == NULL) {
>> 485 PyErr_NoMemory();
>> 486 goto TgtDisk_Create_CLEANUP;
>> 487 }
>> 488
>
>
> disk.c:
>
> Seems like you could just return the PyErr_NoMemory() here. No need to
> do the 'goto'. I don't think you need to call the Py_XDECREF() on this.
>
>> 97 PyObject *blocks = NULL; /* Python2.4 missing uint64_t
>> fmt spec */
>
> This reference to an issue in python 2.4 should no longer be an issue,
> right?
>
>> 136 /* Python 2.4 has no scan code for a potentially 64-bit
>> value */
>
> So, does python 2.6 have scan code for a potential 64-bit value?
>
> instantiate.c:
>
> -General: I am a bit confused here. Why do we have libti code in the
> libtarget_pymod library? I know we need to translate the text installer
> objects to libti type of attributes, but in looking at the libti_pymod,
> it seems that there are already functions in there to do what we need to
> do. Specifically, py_ti_create_target(). You would have to translate
> the text installer object tuples to the TI attributes and create a new
> tuple. Is there a reason you felt that setting up the nvlist and calling
> ti_create_target() here was required, instead of setting up the tuple
> and calling the libti_pymod functions? If there are gaps in the
> libti_pymod code, or you plan to merge this in, can you please file a
> bug to move/merge this code with that as we move forward?
>
>
> partition.c:
>> 33 /*
>> 34 * NOTE: libdiskmgmt has labelled partition data incorrectly. We
>> correct it here
>> 35 * in the Python names. TgtPartition data structure still
>> use the
>> 36 * libdiskmgmt naming scheme. Here is the conversion:
>> 37 *
>> 38 * libdiskmgmt | Python | example
>> 39 * --------------+--------+----------------
>> 40 * id | number | 1
>> 41 * type | id | 0xBF (Solaris2)
>> 42 * typetypething | type | ??? (Primary)
>> 43 *
>> 44 * libdiskmgt doesn't yet recognize anything but Primary
>> partitions but will
>> 45 * soon change.
>> 46 */
>
> Two things.. if there are bugs in libdiskmgt, please file a bug report.
> The last comment is no longer valid, so please remove.
>
>> 57 * XXX until extended partitions project goes back 1-4 are only
>> partition
>> 58 * "id" libdiskmgmt understands.
>> 59 */
>> 60 #define MAXID 4
>> 61 #define STR_MAXID STRINGIZE(MAXID)
>
> This needs to be changed. And, we should use the fdisk defines for this,
> not our own. Extended partition support has been integrated into
> libdiskmgt.
>
>> 502 assert(result != NULL);
>
> We are asserting here that there are always slice objects as children of
> a partition. Is this always true?
>
> General question:
> -Is it possible to have more than one 'label' in python for goto's? It
> seems like the answer is no, but I see that we have errors handled
> sometimes inline and sometimes with a 'goto'. I actually find this
> confusing. Especially, when we have an error label but we don't always
> use it. For example:
>> f (newblk % geo->cylsz != 0) {
>> 603 PyErr_SetString(PyExc_ValueError,
>> 604 "\"blocks\" must be a multiple of "
>> 605 "tgt.Geometry.cylsz");
>> 606 return (-1);
>> 607 }
>
> Is there anyway to combine this with the other label and use a goto?
>
> Another general comment: Sometimes in the code we comment the reference
> counting manipulation that is done, and sometimes we don't. Perhaps we
> should be more liberal in the areas where it might be confusing. For
> example:
>
>> 663 static PyObject *
>> 664 TgtPartition_get_id(TgtPartition *self, void *closure)
>> 665 {
>> 666 PyObject *result = PyInt_FromLong((long)self->id);
>> 667 if (result == NULL)
>> 668 return (PyErr_NoMemory());
>> 669 return (result);
>> 670 }
>
> The call to PyIn_FromLong returns a new reference, but this may not be
> obvious to other folks. Not a deal breaker, just a suggestion.
>
>> 40 #define MAXNUM 15
>
> Is there a define somewhere we can use that is more 'official'. Kind of
> like what is provided in fdisk.h?
>
> slice.c:
>
> It looks like the definition for
>> 200 #define SET_BOOL(nm) self->nm = (nm == Py_True) ? 1 : 0
>
> SET_BOOL is the same wherever it is used. I think it would be cleaner to
> use #defines in the header files as required and only if the macro is
> really different to the #define and #undef inline.
>
>> 214 * type: type object, do *NOT* assume it is TgtSliceType!
>
> This comment implies you are going to do some checking with regard to
> the 'type' value passed in,but in the code it is simply
> assumed to be a slice object:
> 225 self = (TgtSlice *)type->tp_alloc(type, 0);
>
> But, it's certainly possible I misunderstand how tp_alloc() works.
>> 439 if (self->user != NULL)
>
> This check isn't required.
>> 518 return (PyLong_FromLongLong(self->blocks));
>
>
> Sometimes you return the value from these calls, and sometimes you check
> for NULL and return PyErr_NoMemory():
>
>> 550 if (result == NULL)
>> 551 return (PyErr_NoMemory());
>
> It would be good if this was consistent, unless there is a specific
> reason that this is different in some cases.
>
> zpool.c:
> -The printfs are for debugging I presume? It would probably be better ro
> have an explicit debug value that can be set and print accordingly.
>> 114 if (self->mountpoint == NULL) {
>> 115 PyErr_NoMemory();
>> 116 return (-1);
>> 117 }
>
> This type of error in this file seems like a good candidate for a goto.
>
> Nit:
>> 219 * type: type object, do *NOT* assume it is TgtDiskType!
>
> This comment is wrong, it is a TgtZFSDataset type.
>
> libtd/td_dd.c:
>> if (errn != 0 || slice_stats == NULL) {
>> 1965 DDM_DEBUG(DDM_DBGLVL_ERROR,
>> 1966 "ddm_get_slice_stats(): Can't get slice inuse
>> data, "
>> 1967 "for %s, err=%d\n", name, errn);
>> 1968 return (errn);
>> 1969 }
>
> Shouldn't this be a && here? If the err == 0, then returning and error
> seems incorrect, even if the slice_stats are NULL. Not sure if this can
> happen.
Per our chat, will change this to just check errn != 0 here.
> libzoneinfo_pymod/libzoneinfo.c:
>
> -Kind of an unfortunate name for this, at first I thought that this code
> had to do with Solaris Zones. maybe consider renaming. Not a huge deal,
> just a thought. I suppose you modeled the name after the system
> libzoneinfo?
Yes. Although I am also not enamored with the name libzoneinfo for the reason
you mentioned, I felt the consistency in naming with the system library was
important.
Thanks for the comments,
Sue
> sarah
> ****