diff options
author | Tao Liu <thomas.liu@ucloud.cn> | 2022-06-30 16:34:04 +0800 |
---|---|---|
committer | Ilya Maximets <i.maximets@ovn.org> | 2022-07-26 12:50:55 +0200 |
commit | e6dcd07bc28045e6e9fd127ed6a5497deadd6b53 (patch) | |
tree | d36882aef7500179e32cda3ac0662ad8e1cf84cf | |
parent | 1eedf45e8140c470909322e44542d86745f667c4 (diff) | |
download | openvswitch-e6dcd07bc28045e6e9fd127ed6a5497deadd6b53.tar.gz |
netdev: Clear auto_classified if netdev reopened with the type specified.
When netdev first opened by netdev_open(..., NULL, ...), netdev_class sets
to system by default, and auto_classified sets to true.
If netdev reopens by netdev_open(..., "system", ...), auto_classified
should be cleared. This will be used in next patch to fix lag issue.
Fixes: 8c2c225e481d ("netdev: Fix netdev_open() to track and recreate classless interfaces")
Signed-off-by: Tao Liu <thomas.liu@ucloud.cn>
Acked-by: Roi Dayan <roid@nvidia.com>
Signed-off-by: Ilya Maximets <i.maximets@ovn.org>
-rw-r--r-- | lib/netdev.c | 41 |
1 files changed, 23 insertions, 18 deletions
diff --git a/lib/netdev.c b/lib/netdev.c index 8305f6c42..ce0d4117a 100644 --- a/lib/netdev.c +++ b/lib/netdev.c @@ -387,25 +387,30 @@ netdev_open(const char *name, const char *type, struct netdev **netdevp) ovs_mutex_lock(&netdev_mutex); netdev = shash_find_data(&netdev_shash, name); - if (netdev && - type && type[0] && strcmp(type, netdev->netdev_class->type)) { - - if (netdev->auto_classified) { - /* If this device was first created without a classification type, - * for example due to routing or tunneling code, and they keep a - * reference, a "classified" call to open will fail. In this case - * we remove the classless device, and re-add it below. We remove - * the netdev from the shash, and change the sequence, so owners of - * the old classless device can release/cleanup. */ - if (netdev->node) { - shash_delete(&netdev_shash, netdev->node); - netdev->node = NULL; - netdev_change_seq_changed(netdev); - } + if (netdev && type && type[0]) { + if (strcmp(type, netdev->netdev_class->type)) { + + if (netdev->auto_classified) { + /* If this device was first created without a classification + * type, for example due to routing or tunneling code, and they + * keep a reference, a "classified" call to open will fail. + * In this case we remove the classless device, and re-add it + * below. We remove the netdev from the shash, and change the + * sequence, so owners of the old classless device can + * release/cleanup. */ + if (netdev->node) { + shash_delete(&netdev_shash, netdev->node); + netdev->node = NULL; + netdev_change_seq_changed(netdev); + } - netdev = NULL; - } else { - error = EEXIST; + netdev = NULL; + } else { + error = EEXIST; + } + } else if (netdev->auto_classified) { + /* If netdev reopened with type "system", clear auto_classified. */ + netdev->auto_classified = false; } } |