*/
/*
* This file is part of Lustre, http://www.lustre.org/
- * Lustre is a trademark of Sun Microsystems, Inc.
*/
#define DEBUG_SUBSYSTEM S_LNET
list_for_each(tmp, nilist) {
ni = list_entry(tmp, struct lnet_ni, ni_netlist);
- if (ni->ni_interfaces[0] != NULL &&
- strncmp(ni->ni_interfaces[0], iface, strlen(iface)) == 0)
+ if (ni->ni_interface != NULL &&
+ strncmp(ni->ni_interface, iface, strlen(iface)) == 0)
return false;
}
return true;
}
-
-/* check that the NI is unique to the interfaces with in the same NI.
- * This is only a consideration if use_tcp_bonding is set */
-static bool
-lnet_ni_unique_ni(char *iface_list[LNET_INTERFACES_NUM], char *iface)
-{
- int i;
- for (i = 0; i < LNET_INTERFACES_NUM; i++) {
- if (iface_list[i] != NULL &&
- strncmp(iface_list[i], iface, strlen(iface)) == 0)
- return false;
- }
-
- return true;
-}
-
static bool
in_array(__u32 *array, __u32 size, __u32 value)
{
void
lnet_ni_free(struct lnet_ni *ni)
{
- int i;
-
lnet_net_remove_cpts(ni->ni_cpts, ni->ni_ncpts, ni->ni_net);
if (ni->ni_refs != NULL)
if (ni->ni_cpts != NULL)
cfs_expr_list_values_free(ni->ni_cpts, ni->ni_ncpts);
- for (i = 0; i < LNET_INTERFACES_NUM &&
- ni->ni_interfaces[i] != NULL; i++) {
- LIBCFS_FREE(ni->ni_interfaces[i],
- strlen(ni->ni_interfaces[i]) + 1);
+ if (ni->ni_interface != NULL) {
+ LIBCFS_FREE(ni->ni_interface,
+ strlen(ni->ni_interface) + 1);
}
/* release reference to net namespace */
static int
lnet_ni_add_interface(struct lnet_ni *ni, char *iface)
{
- int niface = 0;
+ size_t iface_len = strlen(iface) + 1;
if (ni == NULL)
return -ENOMEM;
- if (!lnet_ni_unique_ni(ni->ni_interfaces, iface))
- return -EINVAL;
-
- /* Allocate a separate piece of memory and copy
- * into it the string, so we don't have
- * a depencency on the tokens string. This way we
- * can free the tokens at the end of the function.
- * The newly allocated ni_interfaces[] can be
- * freed when freeing the NI */
- while (niface < LNET_INTERFACES_NUM &&
- ni->ni_interfaces[niface] != NULL)
- niface++;
-
- if (niface >= LNET_INTERFACES_NUM) {
- LCONSOLE_ERROR_MSG(0x115, "Too many interfaces "
- "for net %s\n",
- libcfs_net2str(LNET_NIDNET(ni->ni_nid)));
+ if (ni->ni_interface != NULL) {
+ LCONSOLE_ERROR_MSG(0x115, "%s: interface %s already set for net %s: rc = %d\n",
+ iface, ni->ni_interface,
+ libcfs_net2str(LNET_NIDNET(ni->ni_nid)),
+ -EINVAL);
return -EINVAL;
}
- LIBCFS_ALLOC(ni->ni_interfaces[niface],
- strlen(iface) + 1);
+ /* Allocate memory for the interface, so the code parsing input into
+ * tokens and adding interfaces can free the input safely.
+ * ni->ni_interface is freed in lnet_ni_free().
+ */
+ LIBCFS_ALLOC(ni->ni_interface, iface_len);
- if (ni->ni_interfaces[niface] == NULL) {
- CERROR("Can't allocate net interface name\n");
+ if (ni->ni_interface == NULL) {
+ CERROR("%s: cannot allocate net interface name: rc = %d\n",
+ iface, -ENOMEM);
return -ENOMEM;
}
- strncpy(ni->ni_interfaces[niface], iface,
- strlen(iface) + 1);
+ strscpy(ni->ni_interface, iface, iface_len);
return 0;
}
* nilist.
*/
int
-lnet_parse_networks(struct list_head *netlist, const char *networks,
- bool use_tcp_bonding)
+lnet_parse_networks(struct list_head *netlist, const char *networks)
{
struct cfs_expr_list *net_el = NULL;
struct cfs_expr_list *ni_el = NULL;
if (IS_ERR_OR_NULL(net))
goto failed;
- if (!nistr ||
- (use_tcp_bonding && LNET_NETTYP(net_id) == SOCKLND)) {
+ if (!nistr) {
/*
* No interface list was specified, allocate a
* ni using the defaults.
goto failed_syntax;
}
- if (use_tcp_bonding &&
- LNET_NETTYP(net->net_id) == SOCKLND) {
- rc = lnet_ni_add_interface(ni, name);
- if (rc != 0)
- goto failed;
- } else {
- ni = lnet_ni_alloc(net, ni_el, name);
- if (IS_ERR_OR_NULL(ni))
- goto failed;
- }
+ ni = lnet_ni_alloc(net, ni_el, name);
+ if (IS_ERR_OR_NULL(ni))
+ goto failed;
if (ni_el) {
if (ni_el != net_el) {