From: Leon Romanovsky <leonro@xxxxxxxxxxxx> Virtual devices like SIW or RXE don't set FW version because they don't have one, use that fact to rely on having empty fw_ver file to sense such virtual devices. Such change is needed to ensure that virtual devices which are attached to real hardware won't be renamed, because during device attachment, user already supplied desired name. Signed-off-by: Leon Romanovsky <leonro@xxxxxxxxxxxx> --- kernel-boot/rdma_rename.c | 39 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 37 insertions(+), 2 deletions(-) diff --git a/kernel-boot/rdma_rename.c b/kernel-boot/rdma_rename.c index 41649d7d0..1588a0f45 100644 --- a/kernel-boot/rdma_rename.c +++ b/kernel-boot/rdma_rename.c @@ -356,9 +356,12 @@ err_free: static int by_pci(struct data *d) { + bool is_virtual = false; struct pci_info p = {}; char *subsystem; char buf[256] = {}; + FILE *fw_ver_p; + char *fw_ver; char *subs; int ret; @@ -373,9 +376,41 @@ static int by_pci(struct data *d) goto out; } buf[ret] = 0; - subs = basename(buf); - if (strcmp(subs, "pci")) { + + ret = asprintf(&fw_ver, "/sys/class/infiniband/%s/fw_ver", d->curr); + if (ret < 0) { + ret = -ENOMEM; + goto out; + } + + ret = 0; + fw_ver_p = fopen(fw_ver, "r"); + if (fw_ver_p) { + char *s = fgets(buf, 3, fw_ver_p); + + fclose(fw_ver_p); + + if (!s) + /* Signal that we can't read fw_ver file */ + ret = -EINVAL; + /* + * Virtual devices like SIW and RXE + * don't set their FW version + */ + if (strlen(s) < 2) + is_virtual = true; + } else { + ret = -EINVAL; + } + + if (ret) { + /* Something very wrong, all IB devices have fw_ver file */ + pr_err("%s: Can't open/read fw_ver file\n", d->curr); + goto out; + } + + if (strcmp(subs, "pci") || is_virtual) { /* Ball out virtual devices */ pr_dbg("%s: Non-PCI device (%s) was detected\n", d->curr, subs); ret = -EINVAL; -- 2.20.1