diff options
Diffstat (limited to 'kernel/net/rds/transport.c')
-rw-r--r-- | kernel/net/rds/transport.c | 27 |
1 files changed, 24 insertions, 3 deletions
diff --git a/kernel/net/rds/transport.c b/kernel/net/rds/transport.c index 7f2ac4fec..f3afd1d60 100644 --- a/kernel/net/rds/transport.c +++ b/kernel/net/rds/transport.c @@ -73,11 +73,11 @@ EXPORT_SYMBOL_GPL(rds_trans_unregister); void rds_trans_put(struct rds_transport *trans) { - if (trans && trans->t_owner) + if (trans) module_put(trans->t_owner); } -struct rds_transport *rds_trans_get_preferred(__be32 addr) +struct rds_transport *rds_trans_get_preferred(struct net *net, __be32 addr) { struct rds_transport *ret = NULL; struct rds_transport *trans; @@ -90,7 +90,28 @@ struct rds_transport *rds_trans_get_preferred(__be32 addr) for (i = 0; i < RDS_TRANS_COUNT; i++) { trans = transports[i]; - if (trans && (trans->laddr_check(addr) == 0) && + if (trans && (trans->laddr_check(net, addr) == 0) && + (!trans->t_owner || try_module_get(trans->t_owner))) { + ret = trans; + break; + } + } + up_read(&rds_trans_sem); + + return ret; +} + +struct rds_transport *rds_trans_get(int t_type) +{ + struct rds_transport *ret = NULL; + struct rds_transport *trans; + unsigned int i; + + down_read(&rds_trans_sem); + for (i = 0; i < RDS_TRANS_COUNT; i++) { + trans = transports[i]; + + if (trans && trans->t_type == t_type && (!trans->t_owner || try_module_get(trans->t_owner))) { ret = trans; break; |