|
@@ -359,26 +359,31 @@ same_sockaddr(struct sockaddr *addr1, struct sockaddr *addr2)
|
|
return false;
|
|
return false;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+/*
|
|
|
|
+ * Checks if 'dsaddrs1' contains a subset of 'dsaddrs2'. If it does,
|
|
|
|
+ * declare a match.
|
|
|
|
+ */
|
|
static bool
|
|
static bool
|
|
_same_data_server_addrs_locked(const struct list_head *dsaddrs1,
|
|
_same_data_server_addrs_locked(const struct list_head *dsaddrs1,
|
|
const struct list_head *dsaddrs2)
|
|
const struct list_head *dsaddrs2)
|
|
{
|
|
{
|
|
struct nfs4_pnfs_ds_addr *da1, *da2;
|
|
struct nfs4_pnfs_ds_addr *da1, *da2;
|
|
-
|
|
|
|
- /* step through both lists, comparing as we go */
|
|
|
|
- for (da1 = list_first_entry(dsaddrs1, typeof(*da1), da_node),
|
|
|
|
- da2 = list_first_entry(dsaddrs2, typeof(*da2), da_node);
|
|
|
|
- da1 != NULL && da2 != NULL;
|
|
|
|
- da1 = list_entry(da1->da_node.next, typeof(*da1), da_node),
|
|
|
|
- da2 = list_entry(da2->da_node.next, typeof(*da2), da_node)) {
|
|
|
|
- if (!same_sockaddr((struct sockaddr *)&da1->da_addr,
|
|
|
|
- (struct sockaddr *)&da2->da_addr))
|
|
|
|
- return false;
|
|
|
|
|
|
+ struct sockaddr *sa1, *sa2;
|
|
|
|
+ bool match = false;
|
|
|
|
+
|
|
|
|
+ list_for_each_entry(da1, dsaddrs1, da_node) {
|
|
|
|
+ sa1 = (struct sockaddr *)&da1->da_addr;
|
|
|
|
+ match = false;
|
|
|
|
+ list_for_each_entry(da2, dsaddrs2, da_node) {
|
|
|
|
+ sa2 = (struct sockaddr *)&da2->da_addr;
|
|
|
|
+ match = same_sockaddr(sa1, sa2);
|
|
|
|
+ if (match)
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ if (!match)
|
|
|
|
+ break;
|
|
}
|
|
}
|
|
- if (da1 == NULL && da2 == NULL)
|
|
|
|
- return true;
|
|
|
|
-
|
|
|
|
- return false;
|
|
|
|
|
|
+ return match;
|
|
}
|
|
}
|
|
|
|
|
|
/*
|
|
/*
|