Received: by 2002:ac0:bc90:0:0:0:0:0 with SMTP id a16csp618807img; Fri, 22 Mar 2019 05:16:31 -0700 (PDT) X-Google-Smtp-Source: APXvYqzNo+Qigw4rPKjYzMzCx69eEucGyAAGjRdPcIuYJzQvkd+NpfSOpqRJjmogwB9ZwwBO0Clh X-Received: by 2002:a17:902:aa92:: with SMTP id d18mr8863080plr.278.1553256990970; Fri, 22 Mar 2019 05:16:30 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1553256990; cv=none; d=google.com; s=arc-20160816; b=N1Bjsl1zy7FcX46iY1ywySFxYOhEdoegyQSJtvly9MFXl9WlkyobAZXSo2ARtxrM6S 9F/g4aQvWpxZdptr2OM7HNw8KGJhkxqjUFK9WnrDONzGS4kXh76BnVZDvle7NmyEy3iL LLVcZ6brCZdtKrCRGpUeJs62PUWOsC2f+z8crp/5dkErnBzed93xbT7DoMhTuzvp/X6Z afD/n7PxLwWyUX/HeINDleOkO5y2sJE/ALypfcRaen2NIrW+11AnAXdtLN+AZBMHM6W5 dwoNNhoRYZ98eQLXVbexb3dHALXswuyNyJb9TKqaIBu/DW5+7eskr62YQUOygaEsHU2t XeYw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=stec70Cu5ruYf+cGASq9sMtiJUzrTRgL/P69FhOUzpc=; b=gQbm+WeEaT9s9w8gJ+uJ3VSey4SK3b3lvLTvniorp23mmc76cS7erZfy/lLvG1mZ5r xBxanJrlKSY6TQDd3Y2bF9MB7WbgkPflFQgoOrmDeWgW/LhaWokpAZ8rdTDuIpcoXtw6 AGVCzAf3SCCnDLCb9nm8d5K0ykcHQ1MHOc7VkAMlt2+tvJZxSroSyvB2xCXV7BS9Do9j Dov9UGbVF68dNA30+ChZLgmJkkv4R1OdjRs7uFq0aw80LWTIoaFRUf8Vlfb/iBi9E3WB gGPvTvo1NAhEnw/S34wxHSG0V+YYeIH7Bk3UHpbDJyGIoY1yWu/sGaDo+FEKmjbWEYog 5nRA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=zj7YxAkP; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id c4si6597054pgk.353.2019.03.22.05.16.16; Fri, 22 Mar 2019 05:16:30 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=zj7YxAkP; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2389375AbfCVMOY (ORCPT + 99 others); Fri, 22 Mar 2019 08:14:24 -0400 Received: from mail.kernel.org ([198.145.29.99]:52552 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2389869AbfCVMOU (ORCPT ); Fri, 22 Mar 2019 08:14:20 -0400 Received: from localhost (83-86-89-107.cable.dynamic.v4.ziggo.nl [83.86.89.107]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 44937218A5; Fri, 22 Mar 2019 12:14:18 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1553256858; bh=bfuWdqeEb8aFJwwNtm6ZM9g06aLfUDMNwN9XoNxUYQM=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=zj7YxAkPR8qBiu1Wx6dGaQhcNbGV32E6tnsfFChqnOqGrqPY1BR29NOIuGoLjLaM5 0SI03iqIvK8kAEMtkNAkQiSYPO3yUkK/ZhnEGaN8P3hM/MDw5aFlouOQty0ZR+ZLOU H8qnXbaw9Ipq1XiwV87AduCjzChApcv8ZtBCS2+w= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Dexuan Cui , Dan Williams Subject: [PATCH 5.0 026/238] nfit: Fix nfit_intel_shutdown_status() command submission Date: Fri, 22 Mar 2019 12:14:05 +0100 Message-Id: <20190322111259.740446487@linuxfoundation.org> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190322111258.383569278@linuxfoundation.org> References: <20190322111258.383569278@linuxfoundation.org> User-Agent: quilt/0.65 X-stable: review X-Patchwork-Hint: ignore MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 5.0-stable review patch. If anyone has any objections, please let me know. ------------------ From: Dan Williams commit f596c8844fe1d0022007ae6c7a377361fb653eff upstream. The implementation is broken in all the ways the unit test did not touch: 1/ The local definition of in_buf and in_obj violated C99 initializer expectations for zeroing. By only initializing 2 out of the three struct members the compiler was free to zero-initialize the remaining entry even though the aliased location in the union was initialized. 2/ The implementation made assumptions about the state of the 'smart' payload after command execution that are satisfied by acpi_nfit_ctl(), but not acpi_evaluate_dsm(). 3/ populate_shutdown_status() is skipped on Intel NVDIMMs due to the early return for skipping the common _LS{I,R,W} enabling. 4/ The input length should be zero. This breakage was missed due to the unit test implementation only testing the case where nfit_intel_shutdown_status() returns a valid payload. Much of this complexity would be saved if acpi_nfit_ctl() could be used, but that currently requires a 'struct nvdimm *' argument and one is not created until later in the init process. The health result is needed before the device is created because the payload gates whether the nmemX/nfit/dirty_shutdown property is visible in sysfs. Cc: Fixes: 0ead11181fe0 ("acpi, nfit: Collect shutdown status") Reported-by: Dexuan Cui Reviewed-by: Dexuan Cui Signed-off-by: Dan Williams Signed-off-by: Greg Kroah-Hartman --- drivers/acpi/nfit/core.c | 43 +++++++++++++++++++++++++------------------ 1 file changed, 25 insertions(+), 18 deletions(-) --- a/drivers/acpi/nfit/core.c +++ b/drivers/acpi/nfit/core.c @@ -1759,14 +1759,14 @@ static bool acpi_nvdimm_has_method(struc __weak void nfit_intel_shutdown_status(struct nfit_mem *nfit_mem) { + struct device *dev = &nfit_mem->adev->dev; struct nd_intel_smart smart = { 0 }; union acpi_object in_buf = { - .type = ACPI_TYPE_BUFFER, - .buffer.pointer = (char *) &smart, - .buffer.length = sizeof(smart), + .buffer.type = ACPI_TYPE_BUFFER, + .buffer.length = 0, }; union acpi_object in_obj = { - .type = ACPI_TYPE_PACKAGE, + .package.type = ACPI_TYPE_PACKAGE, .package.count = 1, .package.elements = &in_buf, }; @@ -1781,8 +1781,15 @@ __weak void nfit_intel_shutdown_status(s return; out_obj = acpi_evaluate_dsm(handle, guid, revid, func, &in_obj); - if (!out_obj) + if (!out_obj || out_obj->type != ACPI_TYPE_BUFFER + || out_obj->buffer.length < sizeof(smart)) { + dev_dbg(dev->parent, "%s: failed to retrieve initial health\n", + dev_name(dev)); + ACPI_FREE(out_obj); return; + } + memcpy(&smart, out_obj->buffer.pointer, sizeof(smart)); + ACPI_FREE(out_obj); if (smart.flags & ND_INTEL_SMART_SHUTDOWN_VALID) { if (smart.shutdown_state) @@ -1793,7 +1800,6 @@ __weak void nfit_intel_shutdown_status(s set_bit(NFIT_MEM_DIRTY_COUNT, &nfit_mem->flags); nfit_mem->dirty_shutdown = smart.shutdown_count; } - ACPI_FREE(out_obj); } static void populate_shutdown_status(struct nfit_mem *nfit_mem) @@ -1915,18 +1921,19 @@ static int acpi_nfit_add_dimm(struct acp | 1 << ND_CMD_SET_CONFIG_DATA; if (family == NVDIMM_FAMILY_INTEL && (dsm_mask & label_mask) == label_mask) - return 0; - - if (acpi_nvdimm_has_method(adev_dimm, "_LSI") - && acpi_nvdimm_has_method(adev_dimm, "_LSR")) { - dev_dbg(dev, "%s: has _LSR\n", dev_name(&adev_dimm->dev)); - set_bit(NFIT_MEM_LSR, &nfit_mem->flags); - } - - if (test_bit(NFIT_MEM_LSR, &nfit_mem->flags) - && acpi_nvdimm_has_method(adev_dimm, "_LSW")) { - dev_dbg(dev, "%s: has _LSW\n", dev_name(&adev_dimm->dev)); - set_bit(NFIT_MEM_LSW, &nfit_mem->flags); + /* skip _LS{I,R,W} enabling */; + else { + if (acpi_nvdimm_has_method(adev_dimm, "_LSI") + && acpi_nvdimm_has_method(adev_dimm, "_LSR")) { + dev_dbg(dev, "%s: has _LSR\n", dev_name(&adev_dimm->dev)); + set_bit(NFIT_MEM_LSR, &nfit_mem->flags); + } + + if (test_bit(NFIT_MEM_LSR, &nfit_mem->flags) + && acpi_nvdimm_has_method(adev_dimm, "_LSW")) { + dev_dbg(dev, "%s: has _LSW\n", dev_name(&adev_dimm->dev)); + set_bit(NFIT_MEM_LSW, &nfit_mem->flags); + } } populate_shutdown_status(nfit_mem);