Commit 1ea62c59 authored by Toshi Kani's avatar Toshi Kani Committed by Borislav Petkov

EDAC: Fix sysfs dimm_label show operation

After

  7d375bff ("sb_edac: Fix support for systems with two home agents per socket")

sysfs "dimm_label" and "chX_dimm_label" show their label string without a
newline "\n" at the end.

  [root@orange ~]# cat /sys/bus/mc0/devices/dimm0/dimm_label
  CPU_SrcID#0_Ha#0_Chan#0_DIMM#0[root@orange ~]#

  [root@orange ~]# cat /sys/devices/system/edac/mc/mc0/csrow0/ch0_dimm_label
  CPU_SrcID#0_Ha#0_Chan#0_DIMM#0[root@orange ~]#

The label strings now have 31 characters, which are the same as
EDAC_MC_LABEL_LEN. Since the snprintf()s in channel_dimm_label_show()
and dimmdev_label_show() limit the whole length by EDAC_MC_LABEL_LEN,
the newline in the format "%s\n" is ignored.

  [root@orange ~]# od -bc /sys/bus/mc0/devices/dimm0/dimm_label
  0000000 103 120 125 137 123 162 143 111 104 043 060 137 110 141 043 060
            C   P   U   _   S   r   c   I   D   #   0   _   H   a   #   0
  0000020 137 103 150 141 156 043 060 137 104 111 115 115 043 060 000
            _   C   h   a   n   #   0   _   D   I   M   M   #   0  \0
  0000037

Fix it by using 'sizeof(dimm->label) + 1' as the whole length in the
snprintf()s in channel_dimm_label_show() and dimmdev_label_show().
Reported-by: default avatarRobert Elliott <elliott@hpe.com>
Signed-off-by: default avatarToshi Kani <toshi.kani@hpe.com>
Acked-by: default avatarTony Luck <tony.luck@intel.com>
Cc: linux-edac <linux-edac@vger.kernel.org>
Cc: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
Link: http://lkml.kernel.org/r/1442933883-21587-2-git-send-email-toshi.kani@hpe.comSigned-off-by: default avatarBorislav Petkov <bp@suse.de>
parent 043cba96
...@@ -229,7 +229,7 @@ static ssize_t channel_dimm_label_show(struct device *dev, ...@@ -229,7 +229,7 @@ static ssize_t channel_dimm_label_show(struct device *dev,
if (!rank->dimm->label[0]) if (!rank->dimm->label[0])
return 0; return 0;
return snprintf(data, EDAC_MC_LABEL_LEN, "%s\n", return snprintf(data, sizeof(rank->dimm->label) + 1, "%s\n",
rank->dimm->label); rank->dimm->label);
} }
...@@ -485,7 +485,7 @@ static ssize_t dimmdev_label_show(struct device *dev, ...@@ -485,7 +485,7 @@ static ssize_t dimmdev_label_show(struct device *dev,
if (!dimm->label[0]) if (!dimm->label[0])
return 0; return 0;
return snprintf(data, EDAC_MC_LABEL_LEN, "%s\n", dimm->label); return snprintf(data, sizeof(dimm->label) + 1, "%s\n", dimm->label);
} }
static ssize_t dimmdev_label_store(struct device *dev, static ssize_t dimmdev_label_store(struct device *dev,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment