diff
-	if (skb_try_coalesce(head, frag, &headstolen, &delta)) {
-		kfree_skb_partial(frag, headstolen);
-		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;
-	}
 	if (fragid == LAST_FRAGMENT) {
 		TIPC_SKB_CB(head)->validated = false;
 		if (unlikely(!tipc_msg_validate(&head)))
 			goto err;
 		TIPC_SKB_CB(head)->tail = NULL;
+		if (skb_try_coalesce(head, frag, &headstolen, &delta)) {
+			kfree_skb_partial(frag, headstolen);
+			return 1;
+		}
 		return 1;
 	}
+	if (skb_try_coalesce(head, frag, &headstolen, &delta)) {
+		kfree_skb_partial(frag, headstolen);
+		return 0;
+	}
+	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;
 	return 0;
