|
@@ -71,19 +71,28 @@ void rds_trans_unregister(struct rds_transport *trans)
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(rds_trans_unregister);
|
|
|
|
|
|
+void rds_trans_put(struct rds_transport *trans)
|
|
|
+{
|
|
|
+ if (trans && trans->t_owner)
|
|
|
+ module_put(trans->t_owner);
|
|
|
+}
|
|
|
+
|
|
|
struct rds_transport *rds_trans_get_preferred(__be32 addr)
|
|
|
{
|
|
|
struct rds_transport *ret = NULL;
|
|
|
- int i;
|
|
|
+ struct rds_transport *trans;
|
|
|
+ unsigned int i;
|
|
|
|
|
|
if (IN_LOOPBACK(ntohl(addr)))
|
|
|
return &rds_loop_transport;
|
|
|
|
|
|
down_read(&rds_trans_sem);
|
|
|
- for (i = 0; i < RDS_TRANS_COUNT; i++)
|
|
|
- {
|
|
|
- if (transports[i] && (transports[i]->laddr_check(addr) == 0)) {
|
|
|
- ret = transports[i];
|
|
|
+ for (i = 0; i < RDS_TRANS_COUNT; i++) {
|
|
|
+ trans = transports[i];
|
|
|
+
|
|
|
+ if (trans && (trans->laddr_check(addr) == 0) &&
|
|
|
+ (!trans->t_owner || try_module_get(trans->t_owner))) {
|
|
|
+ ret = trans;
|
|
|
break;
|
|
|
}
|
|
|
}
|