From: Jiri Pirko Date: Wed, 9 Nov 2022 12:48:51 +0000 (+0100) Subject: devlink: load ifname map on demand from ifname_map_rev_lookup() as well X-Git-Tag: v6.1.0~13 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=63d84b1fc98d5d161500d0792799cbc6f3ac789c;p=thirdparty%2Fiproute2.git devlink: load ifname map on demand from ifname_map_rev_lookup() as well Commit 5cddbb274eab ("devlink: load port-ifname map on demand") changed the ifname map to be loaded on demand from ifname_map_lookup(). However, it didn't put this on-demand loading into ifname_map_rev_lookup() which causes ifname_map_rev_lookup() to return -ENOENT all the time. Fix this by triggering on-demand ifname map load from ifname_map_rev_lookup() as well. Fixes: 5cddbb274eab ("devlink: load port-ifname map on demand") Signed-off-by: Jiri Pirko Signed-off-by: Stephen Hemminger --- diff --git a/devlink/devlink.c b/devlink/devlink.c index 8aefa101b..150b4e63e 100644 --- a/devlink/devlink.c +++ b/devlink/devlink.c @@ -838,6 +838,23 @@ static int ifname_map_load(struct dl *dl) return 0; } +static int ifname_map_check_load(struct dl *dl) +{ + int err; + + if (dl->map_loaded) + return 0; + + err = ifname_map_load(dl); + if (err) { + pr_err("Failed to create index map\n"); + return err; + } + dl->map_loaded = true; + return 0; +} + + static int ifname_map_lookup(struct dl *dl, const char *ifname, char **p_bus_name, char **p_dev_name, uint32_t *p_port_index) @@ -845,14 +862,10 @@ static int ifname_map_lookup(struct dl *dl, const char *ifname, struct ifname_map *ifname_map; int err; - if (!dl->map_loaded) { - err = ifname_map_load(dl); - if (err) { - pr_err("Failed to create index map\n"); - return err; - } - dl->map_loaded = true; - } + err = ifname_map_check_load(dl); + if (err) + return err; + list_for_each_entry(ifname_map, &dl->ifname_map_list, list) { if (strcmp(ifname, ifname_map->ifname) == 0) { *p_bus_name = ifname_map->bus_name; @@ -870,6 +883,12 @@ static int ifname_map_rev_lookup(struct dl *dl, const char *bus_name, { struct ifname_map *ifname_map; + int err; + + err = ifname_map_check_load(dl); + if (err) + return err; + list_for_each_entry(ifname_map, &dl->ifname_map_list, list) { if (strcmp(bus_name, ifname_map->bus_name) == 0 && strcmp(dev_name, ifname_map->dev_name) == 0 &&