On Sun, 23 Mar 2008, Robert P. J. Day wrote: ... snip ... > an obvious fix is, once you do the splice, initialize that list > header to designate an empty list, and in fact, there's a list > function that does just that: > > ===== > static inline void list_splice_init(struct list_head *list, > struct list_head *head) > { > if (!list_empty(list)) { > __list_splice(list, head); > INIT_LIST_HEAD(list); <-- that solves the problem > } > } > ===== > > which makes me wonder ... why aren't *all* list splices treated that > way? what is the value of using just the first form and leaving that > potentially dangerous head element lying around? in short, as long as > i've understood this correctly, it would seem to make more sense for > all list_splice() calls to be list_splice_init() instead, for safety. > or did i screw something up? just to follow up on this post, i was wondering why anyone would call list_splice() *without* doing a list head init on that detached list head element just to play it safe, so i did a grep for calls to list_splice() under drivers and, lo and behold, here's the very first example that showed up (drivers/ieee1394/ohci1394.c): ... list_splice(&d->fifo_list, &packet_list); list_splice(&d->pending_list, &packet_list); INIT_LIST_HEAD(&d->fifo_list); INIT_LIST_HEAD(&d->pending_list); ... exactly. i'm betting that code was written before list_splice_init() was written, so that's the sort of thing that *could* be rewritten as two calls to list_splice_init(). i'm wondering how many other examples of the above there are. i'm betting lots. :-) rday -- ======================================================================== Robert P. J. Day Linux Consulting, Training and Annoying Kernel Pedantry: Have classroom, will lecture. http://crashcourse.ca Waterloo, Ontario, CANADA ======================================================================== -- To unsubscribe from this list: send an email with "unsubscribe kernelnewbies" to ecartis@xxxxxxxxxxxx Please read the FAQ at http://kernelnewbies.org/FAQ