diff
+	bool frag_freed = false;
 	if (skb_try_coalesce(head, frag, &headstolen, &delta)) {
 		kfree_skb_partial(frag, headstolen);
+		frag_freed = true;
 		tail = TIPC_SKB_CB(head)->tail;
-		if (!skb_has_frag_list(head))
-			skb_shinfo(head)->frag_list = frag;
-		else
-			tail->next = frag;
 		head->truesize += frag->truesize;
 		head->data_len += frag->len;
 		head->len += frag->len;
-		TIPC_SKB_CB(head)->tail = frag;
+		TIPC_SKB_CB(head)->tail = tail;
 	}
+	if (!frag_freed) {
+		if (!skb_has_frag_list(head))
+			skb_shinfo(head)->frag_list = frag;
+		else
+			tail->next = frag;
+		TIPC_SKB_CB(head)->tail = frag;
+	}
