Commit be8240ac authored by Amir Shehata's avatar Amir Shehata Committed by Greg Kroah-Hartman

staging: lustre: return appropriate errno when adding route

When adding route it ignored specific scenarios, namely:
1. route already exists
2. route is on a local net
3. route is unreacheable

This patch returns the appropriate return codes from the lower level
function lnet_add_route(), and then ignores the above case from the
calling function, lnet_parse_route().  This is needed so we don't
halt processing routes in the module parameters.

However, we can now add routes dynamically, and it should be returned
to the user whether adding the requested route succeeded or failed.

In userspace it is determined whether to continue adding routes or to
halt processing.  Currently "lnetctl import < config" continues
adding the rest of the configuration and reports at the end which
operations passed and which ones failed.
Signed-off-by: default avatarAmir Shehata <amir.shehata@intel.com>
Intel-bug-id: https://jira.hpdd.intel.com/browse/LU-6045
Reviewed-on: http://review.whamcloud.com/13116Reviewed-by: default avatarJames Simmons <uja.ornl@gmail.com>
Reviewed-by: default avatarDoug Oucharek <doug.s.oucharek@intel.com>
Reviewed-by: default avatarIsaac Huang <he.huang@intel.com>
Reviewed-by: default avatarOleg Drokin <oleg.drokin@intel.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 9c26b89d
...@@ -769,7 +769,7 @@ lnet_parse_route(char *str, int *im_a_router) ...@@ -769,7 +769,7 @@ lnet_parse_route(char *str, int *im_a_router)
} }
rc = lnet_add_route(net, hops, nid, priority); rc = lnet_add_route(net, hops, nid, priority);
if (rc) { if (rc && rc != -EEXIST && rc != -EHOSTUNREACH) {
CERROR("Can't create route to %s via %s\n", CERROR("Can't create route to %s via %s\n",
libcfs_net2str(net), libcfs_net2str(net),
libcfs_nid2str(nid)); libcfs_nid2str(nid));
......
...@@ -317,7 +317,7 @@ lnet_add_route(__u32 net, unsigned int hops, lnet_nid_t gateway, ...@@ -317,7 +317,7 @@ lnet_add_route(__u32 net, unsigned int hops, lnet_nid_t gateway,
return -EINVAL; return -EINVAL;
if (lnet_islocalnet(net)) /* it's a local network */ if (lnet_islocalnet(net)) /* it's a local network */
return 0; /* ignore the route entry */ return -EEXIST;
/* Assume net, route, all new */ /* Assume net, route, all new */
LIBCFS_ALLOC(route, sizeof(*route)); LIBCFS_ALLOC(route, sizeof(*route));
...@@ -348,7 +348,7 @@ lnet_add_route(__u32 net, unsigned int hops, lnet_nid_t gateway, ...@@ -348,7 +348,7 @@ lnet_add_route(__u32 net, unsigned int hops, lnet_nid_t gateway,
LIBCFS_FREE(rnet, sizeof(*rnet)); LIBCFS_FREE(rnet, sizeof(*rnet));
if (rc == -EHOSTUNREACH) /* gateway is not on a local net */ if (rc == -EHOSTUNREACH) /* gateway is not on a local net */
return 0; /* ignore the route entry */ return rc; /* ignore the route entry */
CERROR("Error %d creating route %s %d %s\n", rc, CERROR("Error %d creating route %s %d %s\n", rc,
libcfs_net2str(net), hops, libcfs_net2str(net), hops,
libcfs_nid2str(gateway)); libcfs_nid2str(gateway));
...@@ -395,14 +395,17 @@ lnet_add_route(__u32 net, unsigned int hops, lnet_nid_t gateway, ...@@ -395,14 +395,17 @@ lnet_add_route(__u32 net, unsigned int hops, lnet_nid_t gateway,
/* -1 for notify or !add_route */ /* -1 for notify or !add_route */
lnet_peer_decref_locked(route->lr_gateway); lnet_peer_decref_locked(route->lr_gateway);
lnet_net_unlock(LNET_LOCK_EX); lnet_net_unlock(LNET_LOCK_EX);
rc = 0;
if (!add_route) if (!add_route) {
rc = -EEXIST;
LIBCFS_FREE(route, sizeof(*route)); LIBCFS_FREE(route, sizeof(*route));
}
if (rnet != rnet2) if (rnet != rnet2)
LIBCFS_FREE(rnet, sizeof(*rnet)); LIBCFS_FREE(rnet, sizeof(*rnet));
return 0; return rc;
} }
int int
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment