link: Fix rtnl_link_af_data_compare return value

This patch fixes a bug where because of the af_ops check
being first in the function, we were returning ~0 if af_ops
was null even if both objects really did not have af_data
and we should be returning 0.

Its better to have the af_data present check before anything else.

So, Rearranged some of the code in rtnl_link_af_data_compare.
Changes include:
	- Do the attribute present check before anything else
	- If ao_compare op not present, return ~0

Signed-off-by: Roopa Prabhu <roopa@cumulusnetworks.com>
Reviewed-by: Nolan Leake <nolan@cumulusnetworks.com>
Reviewed-by: Shrijeet Mukherjee <shm@cumulusnetworks.com>
Reviewed-by: Wilson Kok <wkok@cumulusnetworks.com>
Signed-off-by: Thomas Graf <tgraf@suug.ch>
This commit is contained in:
roopa 2013-02-15 10:26:30 -08:00 committed by Thomas Graf
parent 8f151fadda
commit ded20487fd

View file

@ -365,22 +365,26 @@ errout:
int rtnl_link_af_data_compare(struct rtnl_link *a, struct rtnl_link *b,
int family)
{
struct rtnl_link_af_ops *af_ops = rtnl_link_af_ops_lookup(family);
struct rtnl_link_af_ops *af_ops;
int ret = 0;
if (!a->l_af_data[family] && !b->l_af_data[family])
return 0;
if (!a->l_af_data[family] || !b->l_af_data[family])
return ~0;
af_ops = rtnl_link_af_ops_lookup(family);
if (!af_ops)
return ~0;
if (!a->l_af_data[family] && !b->l_af_data[family])
goto out;
if (!a->l_af_data[family] || !b->l_af_data[family]) {
if (af_ops->ao_compare == NULL) {
ret = ~0;
goto out;
}
if (af_ops->ao_compare)
ret = af_ops->ao_compare(a, b, family, ~0, 0);
ret = af_ops->ao_compare(a, b, family, ~0, 0);
out:
rtnl_link_af_ops_put(af_ops);