IPoIB: Fix crash in path_rec_completion()

Fix a crash in path_rec_completion() during an SM up/down loop. If
more than one path record request is issued, the first completion
releases path->done, allowing ipoib_flush_paths() to free the path,
and thus corrupting it for the second completion.

Commit ee1e2c82 ("IPoIB: Refresh paths instead of flushing them on SM
change events") added the field path->valid and changed the test "if
(!path)" to "if (!path || !path->valid)". This change made it
possible for a path with an outstanding query to pass the test and
issue another query on the same path. Having two queries on the same
path leads to a crash.

This fixes <https://bugs.openfabrics.org/show_bug.cgi?id=1325>.

Signed-off-by: Yossi Etigin <yosefe@voltaire.com>
Signed-off-by: Roland Dreier <rolandd@cisco.com>

authored by Yossi Etigin and committed by Roland Dreier ff79ae80 93a3ab93

+1 -1
+1 -1
drivers/infiniband/ulp/ipoib/ipoib_main.c
··· 664 skb_push(skb, sizeof *phdr); 665 __skb_queue_tail(&path->queue, skb); 666 667 - if (path_rec_start(dev, path)) { 668 spin_unlock_irqrestore(&priv->lock, flags); 669 path_free(dev, path); 670 return;
··· 664 skb_push(skb, sizeof *phdr); 665 __skb_queue_tail(&path->queue, skb); 666 667 + if (!path->query && path_rec_start(dev, path)) { 668 spin_unlock_irqrestore(&priv->lock, flags); 669 path_free(dev, path); 670 return;