Re: [PATCH] fix: nvme_update_ns_info method should be called even if nvme_ms_ids_equal return false

金韬
2022-04-08T07:57:00Z

This is output from dmesg. Seems that "eui" has changed.

[ 2.086226] loop0: detected capacity change from 0 to 8
[ 26.577001] eui changed from 0100000000000000 to 0000000000000001
[ 26.577003] nvme nvme0: identifiers changed for nsid 1

在 2022/4/8 14:22, Christoph Hellwig 写道:
> On Fri, Apr 08, 2022 at 02:12:13PM +0800, me@kingtous.cn wrote:
>> Yes, I only have one controller with one namespace.
>> I've done `nvme id-ns /dev/nvme0n1` times before and after suspend. The only difference between the two output is nuse address. The nuse address's output is dynamic, the outputs are different each time I execute the nvme id-ns command.
>> When the laptop wakes up, tty will show "identifiers changed for nsid 1". I checked the "nvme_ns_ids_equal" function, it will check uuid, nguid, eui64 and csi. So maybe there is something changed in uuid or csi?
>
> Let's try this:
>
> diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c
> index efb85c6d8e2d5..0c38184a3ffa2 100644
> --- a/drivers/nvme/host/core.c
> +++ b/drivers/nvme/host/core.c
> @@ -1631,10 +1631,28 @@ static void nvme_config_discard(struct gendisk *disk, struct nvme_ns *ns)
>
> static bool nvme_ns_ids_equal(struct nvme_ns_ids *a, struct nvme_ns_ids *b)
> {
> - return uuid_equal(&a->uuid, &b->uuid) &&
> - memcmp(&a->nguid, &b->nguid, sizeof(a->nguid)) == 0 &&
> - memcmp(&a->eui64, &b->eui64, sizeof(a->eui64)) == 0 &&
> - a->csi == b->csi;
> + if (uuid_equal(&a->uuid, &b->uuid)) {
> + printk("uuid changed from %pU to %pU\n",
> + &a->uuid, &b->uuid);
> + return false;
> + }
> + if (memcmp(&a->nguid, &b->nguid, sizeof(a->nguid))) {
> + printk("nguid changed from %16phN to %16phN\n",
> + &a->nguid, &b->nguid);
> + return false;
> + }
> + if (memcmp(&a->eui64, &b->eui64, sizeof(a->eui64))) {
> + printk("eui changed from %8phN to %8phN\n",
> + &a->eui64, &b->eui64);
> + return false;
> + }
> + if (a->csi != b->csi) {
> + printk("csi changed from %u to %u\n",
> + a->csi, b->csi);
> + return false;
> + }
> +
> + return true;
> }
>
> static int nvme_init_ms(struct nvme_ns *ns, struct nvme_id_ns *id)
>