From: Maxim Patlasov Date: Mon, 22 Feb 2010 22:20:43 +0000 (-0800) Subject: b=21911 fix for double release of ibc_lock in o2iblnd X-Git-Tag: 1.10.0.38~27 X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=commitdiff_plain;h=6f8830c1c286c03717f67c2bf1fa446517e5cc8f;ds=sidebyside b=21911 fix for double release of ibc_lock in o2iblnd Re-acquire ibc_lock in kiblnd_post_tx_locked(). Add extra reference to conn before calling kiblnd_post_tx_locked() to avoid scenario when conn disappears inside kiblnd_post_tx_locked(). i=liang --- diff --git a/lnet/klnds/o2iblnd/o2iblnd_cb.c b/lnet/klnds/o2iblnd/o2iblnd_cb.c index f869420..afbb352 100644 --- a/lnet/klnds/o2iblnd/o2iblnd_cb.c +++ b/lnet/klnds/o2iblnd/o2iblnd_cb.c @@ -874,6 +874,9 @@ kiblnd_post_tx_locked (kib_conn_t *conn, kib_tx_t *tx, int credit) if (done) kiblnd_tx_done(peer->ibp_ni, tx); + + cfs_spin_lock(&conn->ibc_lock); + return -EIO; } @@ -919,6 +922,8 @@ kiblnd_check_sends (kib_conn_t *conn) kiblnd_queue_tx_locked(tx, conn); } + kiblnd_conn_addref(conn); /* 1 ref for me.... (see b21911) */ + for (;;) { int credit; @@ -938,6 +943,8 @@ kiblnd_check_sends (kib_conn_t *conn) } cfs_spin_unlock(&conn->ibc_lock); + + kiblnd_conn_decref(conn); /* ...until here */ } void