These changes are a raw update to a vanilla kernel 4.1.10, with the
[kvmfornfv.git] / kernel / fs / nfs / pnfs_nfs.c
index f37e25b..1705c78 100644 (file)
@@ -359,26 +359,31 @@ same_sockaddr(struct sockaddr *addr1, struct sockaddr *addr2)
        return false;
 }
 
+/*
+ * Checks if 'dsaddrs1' contains a subset of 'dsaddrs2'. If it does,
+ * declare a match.
+ */
 static bool
 _same_data_server_addrs_locked(const struct list_head *dsaddrs1,
                               const struct list_head *dsaddrs2)
 {
        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;
 }
 
 /*