@@ -607,7 +607,7 @@ struct ksock_peer *
write_unlock_bh(&ksocknal_data.ksnd_global_lock);
- ksocknal_txlist_done(ni, &zombies, 1);
+ ksocknal_txlist_done(ni, &zombies, -ENETDOWN);
return rc;
}
@@ -1023,6 +1023,7 @@ struct ksock_peer *
int cpt;
struct ksock_tx *tx;
struct ksock_tx *txtmp;
+ int rc2;
int rc;
int active;
char *warn = NULL;
@@ -1406,7 +1407,13 @@ struct ksock_peer *
write_unlock_bh(global_lock);
}
- ksocknal_txlist_done(ni, &zombies, 1);
+ /*
+ * If we get here without an error code, just use -EALREADY.
+ * Depending on how we got here, the error may be positive
+ * or negative. Normalize the value for ksocknal_txlist_done().
+ */
+ rc2 = (rc == 0 ? -EALREADY : (rc > 0 ? -rc : rc));
+ ksocknal_txlist_done(ni, &zombies, rc2);
ksocknal_peer_decref(peer_ni);
failed_1:
@@ -582,14 +582,14 @@ struct ksock_proto {
}
void ksocknal_tx_prep(struct ksock_conn *, struct ksock_tx *tx);
-void ksocknal_tx_done(struct lnet_ni *ni, struct ksock_tx *tx);
+void ksocknal_tx_done(struct lnet_ni *ni, struct ksock_tx *tx, int error);
static inline void
ksocknal_tx_decref(struct ksock_tx *tx)
{
LASSERT(atomic_read(&tx->tx_refcount) > 0);
if (atomic_dec_and_test(&tx->tx_refcount))
- ksocknal_tx_done(NULL, tx);
+ ksocknal_tx_done(NULL, tx, 0);
}
static inline void
@@ -328,19 +328,18 @@ struct ksock_tx *
}
void
-ksocknal_tx_done(struct lnet_ni *ni, struct ksock_tx *tx)
+ksocknal_tx_done(struct lnet_ni *ni, struct ksock_tx *tx, int rc)
{
struct lnet_msg *lnetmsg = tx->tx_lnetmsg;
- int rc = (!tx->tx_resid && !tx->tx_zc_aborted) ? 0 : -EIO;
LASSERT(ni || tx->tx_conn);
+ if (!rc && (tx->tx_resid != 0 || tx->tx_zc_aborted))
+ rc = -EIO;
+
if (tx->tx_conn)
ksocknal_conn_decref(tx->tx_conn);
- if (!ni && tx->tx_conn)
- ni = tx->tx_conn->ksnc_peer->ksnp_ni;
-
ksocknal_free_tx(tx);
if (lnetmsg) /* KSOCK_MSG_NOOP go without lnetmsg */
lnet_finalize(lnetmsg, rc);
@@ -367,7 +366,7 @@ struct ksock_tx *
list_del(&tx->tx_list);
LASSERT(atomic_read(&tx->tx_refcount) == 1);
- ksocknal_tx_done(ni, tx);
+ ksocknal_tx_done(ni, tx, error);
}
}
@@ -1923,7 +1922,7 @@ void ksocknal_write_callback(struct ksock_conn *conn)
write_unlock_bh(&ksocknal_data.ksnd_global_lock);
ksocknal_peer_failed(peer_ni);
- ksocknal_txlist_done(peer_ni->ksnp_ni, &zombies, 1);
+ ksocknal_txlist_done(peer_ni->ksnp_ni, &zombies, rc);
return 0;
}
@@ -2268,7 +2267,7 @@ void ksocknal_write_callback(struct ksock_conn *conn)
write_unlock_bh(&ksocknal_data.ksnd_global_lock);
- ksocknal_txlist_done(peer_ni->ksnp_ni, &stale_txs, 1);
+ ksocknal_txlist_done(peer_ni->ksnp_ni, &stale_txs, -ETIMEDOUT);
}
static int