Sparse gets confused because of the unused "_success_exit:" label. If you delete that it should go away. In "real" kernel code GCC will warn about unused labels. I created a more minimal test case while I was looking at this, if anyone is interested. static int foo; int recv_indicatepkt_reorder(_adapter *padapter, union recv_frame *prframe) { struct rx_pkt_attrib *pattrib = &prframe->u.hdr.attrib; struct recv_reorder_ctrl *preorder_ctrl = prframe->u.hdr.preorder_ctrl; _queue *ppending_recvframe_queue = &preorder_ctrl->pending_recvframe_queue; spin_lock(&ppending_recvframe_queue->lock); if (foo) goto err; spin_unlock(&ppending_recvframe_queue->lock); unused_label: return 0; err: spin_unlock(&ppending_recvframe_queue->lock); return -1; } regards, dan carpenter -- To unsubscribe from this list: send the line "unsubscribe linux-sparse" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html