c
static int handle_first_fragment(struct sk_buff **headbuf, struct sk_buff **buf) {
    struct sk_buff *frag = *buf;
    if (skb_has_frag_list(frag) && __skb_linearize(frag))
        goto err;
    frag = skb_unshare(frag, GFP_ATOMIC);
    if (unlikely(!frag))
        goto err;
    *headbuf = frag;
    TIPC_SKB_CB(*headbuf)->tail = NULL;
    *buf = NULL;
    return 0;
err:
    kfree_skb(*buf);
    *buf = NULL;
    return 0;
}

if (fragid == FIRST_FRAGMENT) {
    if (unlikely(head))
        goto err;
    return handle_first_fragment(headbuf, buf);
}
