blk_queue_max_write_zeroes_sectors(queue, UINT_MAX);
 }
 
-static bool nvme_ns_ids_valid(struct nvme_ns_ids *ids)
-{
-       return !uuid_is_null(&ids->uuid) ||
-               memchr_inv(ids->nguid, 0, sizeof(ids->nguid)) ||
-               memchr_inv(ids->eui64, 0, sizeof(ids->eui64));
-}
-
 static bool nvme_ns_ids_equal(struct nvme_ns_ids *a, struct nvme_ns_ids *b)
 {
        return uuid_equal(&a->uuid, &b->uuid) &&
 static int nvme_subsys_check_duplicate_ids(struct nvme_subsystem *subsys,
                struct nvme_ns_ids *ids)
 {
+       bool has_uuid = !uuid_is_null(&ids->uuid);
+       bool has_nguid = memchr_inv(ids->nguid, 0, sizeof(ids->nguid));
+       bool has_eui64 = memchr_inv(ids->eui64, 0, sizeof(ids->eui64));
        struct nvme_ns_head *h;
 
        lockdep_assert_held(&subsys->lock);
 
        list_for_each_entry(h, &subsys->nsheads, entry) {
-               if (nvme_ns_ids_valid(ids) && nvme_ns_ids_equal(ids, &h->ids))
+               if (has_uuid && uuid_equal(&ids->uuid, &h->ids.uuid))
+                       return -EINVAL;
+               if (has_nguid &&
+                   memcmp(&ids->nguid, &h->ids.nguid, sizeof(ids->nguid)) == 0)
+                       return -EINVAL;
+               if (has_eui64 &&
+                   memcmp(&ids->eui64, &h->ids.eui64, sizeof(ids->eui64)) == 0)
                        return -EINVAL;
        }