nvme: don't blindly overwrite identifiers on disk revalidate
authorChristoph Hellwig <hch@lst.de>
Thu, 17 Aug 2017 12:10:00 +0000 (14:10 +0200)
committerChristoph Hellwig <hch@lst.de>
Tue, 29 Aug 2017 08:23:04 +0000 (10:23 +0200)
Instead validate that these identifiers do not change, as that is
prohibited by the specification.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Keith Busch <keith.busch@intel.com>
drivers/nvme/host/core.c

index b87cf3a6e9acdc3962c011490b509be50084f94e..b0dd58db110ed3c4ceabe4c4444c36641ccd6f4b 100644 (file)
@@ -1236,6 +1236,8 @@ static int nvme_revalidate_disk(struct gendisk *disk)
        struct nvme_ns *ns = disk->private_data;
        struct nvme_ctrl *ctrl = ns->ctrl;
        struct nvme_id_ns *id;
+       u8 eui64[8] = { 0 }, nguid[16] = { 0 };
+       uuid_t uuid = uuid_null;
        int ret = 0;
 
        if (test_bit(NVME_NS_DEAD, &ns->flags)) {
@@ -1252,7 +1254,15 @@ static int nvme_revalidate_disk(struct gendisk *disk)
                goto out;
        }
 
-       nvme_report_ns_ids(ctrl, ns->ns_id, id, ns->eui, ns->nguid, &ns->uuid);
+       nvme_report_ns_ids(ctrl, ns->ns_id, id, eui64, nguid, &uuid);
+       if (!uuid_equal(&ns->uuid, &uuid) ||
+           memcmp(&ns->nguid, &nguid, sizeof(ns->nguid)) ||
+           memcmp(&ns->eui, &eui64, sizeof(ns->eui))) {
+               dev_err(ctrl->device,
+                       "identifiers changed for nsid %d\n", ns->ns_id);
+               ret = -ENODEV;
+       }
+
 out:
        kfree(id);
        return ret;