Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1537381 > unrolled thread

[PATCH 4/5] acpi, nfit: fix bus vs dimm confusion in xlat_status

Started byDan Williams <dan.j.williams@intel.com>
First post2016-12-07 01:50 +0100
Last post2016-12-07 02:50 +0100
Articles 2 — 1 participant

Back to article view | Back to linux.kernel

This discussion starts older than the indexed window; earlier articles aren't shown. The article labeled Started by below is the oldest one visible, not the original post.


Contents

  [PATCH 4/5] acpi, nfit: fix bus vs dimm confusion in xlat_status Dan Williams <dan.j.williams@intel.com> - 2016-12-07 01:50 +0100
    Re: [PATCH 4/5] acpi, nfit: fix bus vs dimm confusion in xlat_status Dan Williams <dan.j.williams@intel.com> - 2016-12-07 02:50 +0100

#1537381 — [PATCH 4/5] acpi, nfit: fix bus vs dimm confusion in xlat_status

FromDan Williams <dan.j.williams@intel.com>
Date2016-12-07 01:50 +0100
Subject[PATCH 4/5] acpi, nfit: fix bus vs dimm confusion in xlat_status
Message-ID<sLyAO-Qu-7@gated-at.bofh.it>
Given dimms and bus commands share the same command number space we need
to be careful that we are translating status in the correct context.
Otherwise we can, for example, fail an ND_CMD_GET_CONFIG_SIZE command
because max_xfer is zero. It fails because that condition erroneously
correlates with the 'cleared == 0' failure of ND_CMD_CLEAR_ERROR.

Cc: <stable@vger.kernel.org>
Fixes: aef253382266 ("libnvdimm, nfit: centralize command status translation")
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
---
 drivers/acpi/nfit/core.c |   16 +++++++++++++---
 1 file changed, 13 insertions(+), 3 deletions(-)

diff --git a/drivers/acpi/nfit/core.c b/drivers/acpi/nfit/core.c
index 4b8b4f520d76..9690b28f0da7 100644
--- a/drivers/acpi/nfit/core.c
+++ b/drivers/acpi/nfit/core.c
@@ -94,7 +94,7 @@ static struct acpi_device *to_acpi_dev(struct acpi_nfit_desc *acpi_desc)
 	return to_acpi_device(acpi_desc->dev);
 }
 
-static int xlat_status(void *buf, unsigned int cmd, u32 status)
+static int xlat_bus_status(void *buf, unsigned int cmd, u32 status)
 {
 	struct nd_cmd_clear_error *clear_err;
 	struct nd_cmd_ars_status *ars_status;
@@ -175,6 +175,15 @@ static int xlat_status(void *buf, unsigned int cmd, u32 status)
 	return 0;
 }
 
+static int xlat_status(struct nvdimm *nvdimm, void *buf, unsigned int cmd,
+		u32 status)
+{
+	if (!nvdimm)
+		return xlat_bus_status(buf, cmd, status);
+	if (status)
+		return -EIO;
+}
+
 static int acpi_nfit_ctl(struct nvdimm_bus_descriptor *nd_desc,
 		struct nvdimm *nvdimm, unsigned int cmd, void *buf,
 		unsigned int buf_len, int *cmd_rc)
@@ -335,7 +344,8 @@ static int acpi_nfit_ctl(struct nvdimm_bus_descriptor *nd_desc,
 			 */
 			rc = buf_len - offset - in_buf.buffer.length;
 			if (cmd_rc)
-				*cmd_rc = xlat_status(buf, cmd, fw_status);
+				*cmd_rc = xlat_status(nvdimm, buf, cmd,
+						fw_status);
 		} else {
 			dev_err(dev, "%s:%s underrun cmd: %s buf_len: %d out_len: %d\n",
 					__func__, dimm_name, cmd_name, buf_len,
@@ -345,7 +355,7 @@ static int acpi_nfit_ctl(struct nvdimm_bus_descriptor *nd_desc,
 	} else {
 		rc = 0;
 		if (cmd_rc)
-			*cmd_rc = xlat_status(buf, cmd, fw_status);
+			*cmd_rc = xlat_status(nvdimm, buf, cmd, fw_status);
 	}
 
  out:

[toc] | [next] | [standalone]


#1537409

FromDan Williams <dan.j.williams@intel.com>
Date2016-12-07 02:50 +0100
Message-ID<sLzwS-1oj-5@gated-at.bofh.it>
In reply to#1537381
On Tue, Dec 6, 2016 at 4:39 PM, Dan Williams <dan.j.williams@intel.com> wrote:
> Given dimms and bus commands share the same command number space we need
> to be careful that we are translating status in the correct context.
> Otherwise we can, for example, fail an ND_CMD_GET_CONFIG_SIZE command
> because max_xfer is zero. It fails because that condition erroneously
> correlates with the 'cleared == 0' failure of ND_CMD_CLEAR_ERROR.
>
> Cc: <stable@vger.kernel.org>
> Fixes: aef253382266 ("libnvdimm, nfit: centralize command status translation")
> Signed-off-by: Dan Williams <dan.j.williams@intel.com>
> ---
>  drivers/acpi/nfit/core.c |   16 +++++++++++++---
>  1 file changed, 13 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/acpi/nfit/core.c b/drivers/acpi/nfit/core.c
> index 4b8b4f520d76..9690b28f0da7 100644
> --- a/drivers/acpi/nfit/core.c
> +++ b/drivers/acpi/nfit/core.c
> @@ -94,7 +94,7 @@ static struct acpi_device *to_acpi_dev(struct acpi_nfit_desc *acpi_desc)
>         return to_acpi_device(acpi_desc->dev);
>  }
>
> -static int xlat_status(void *buf, unsigned int cmd, u32 status)
> +static int xlat_bus_status(void *buf, unsigned int cmd, u32 status)
>  {
>         struct nd_cmd_clear_error *clear_err;
>         struct nd_cmd_ars_status *ars_status;
> @@ -175,6 +175,15 @@ static int xlat_status(void *buf, unsigned int cmd, u32 status)
>         return 0;
>  }
>
> +static int xlat_status(struct nvdimm *nvdimm, void *buf, unsigned int cmd,
> +               u32 status)
> +{
> +       if (!nvdimm)
> +               return xlat_bus_status(buf, cmd, status);
> +       if (status)
> +               return -EIO;

Here comes a 0day report:

drivers/acpi/nfit/core.c:185:1: warning: control reaches end of
non-void function [-Wreturn-type]

...fixed up the patch to add a return 0;

[toc] | [prev] | [standalone]


Back to top | Article view | linux.kernel


csiph-web