diff --git a/net/qrtr/qrtr.c b/net/qrtr/qrtr.c index 90c558f89d46..20cebd3179ae 100644 --- a/net/qrtr/qrtr.c +++ b/net/qrtr/qrtr.c @@ -190,11 +190,11 @@ static void __qrtr_node_release(struct kref *kref) } /* Increment reference to node. */ -static struct qrtr_node *qrtr_node_acquire(struct qrtr_node *node) +static int qrtr_node_acquire(struct qrtr_node *node) { if (node) - kref_get(&node->ref); - return node; + return kref_get_unless_zero(&node->ref); + return 0; } /* Decrement reference to node and release as necessary. */ @@ -380,12 +380,15 @@ static int qrtr_node_enqueue(struct qrtr_node *node, struct sk_buff *skb, */ static struct qrtr_node *qrtr_node_lookup(unsigned int nid) { + int ret = 0; struct qrtr_node *node; unsigned long flags; spin_lock_irqsave(&qrtr_nodes_lock, flags); node = radix_tree_lookup(&qrtr_nodes, nid); - node = qrtr_node_acquire(node); + ret = qrtr_node_acquire(node); + if(!ret) + node = NULL; spin_unlock_irqrestore(&qrtr_nodes_lock, flags); return node;