x86/mce: Fix return value of mce_chrdev_read() when erst is disabled
authorNaoya Horiguchi <n-horiguchi@ah.jp.nec.com>
Mon, 23 Jan 2012 20:54:52 +0000 (15:54 -0500)
committerTony Luck <tony.luck@intel.com>
Wed, 22 Feb 2012 21:14:16 +0000 (13:14 -0800)
Current kernel MCE code reads ERST at the first reading of /dev/mcelog
(maybe in starting mcelogd,) even if the system does not support ERST,
which results in a fake "no such device" message (as described in [1].)
This problem is not critical, but can confuse system admins.
This patch fixes it by filtering the return value from lower (ACPI) layer.

 [1] http://thread.gmane.org/gmane.linux.kernel/1060250

Reported by: Jon Masters <jonathan@jonmasters.org>
Signed-off-by: Naoya Horiguchi <n-horiguchi@ah.jp.nec.com>
Cc: Andi Kleen <andi@firstfloor.org>
Cc: Huang Ying <ying.huang@intel.com>
Link: https://lkml.org/lkml/2012/1/23/299
Signed-off-by: Tony Luck <tony.luck@intel.com>

arch/x86/kernel/cpu/mcheck/mce.c

index 4979a5d..87c56ba 100644 (file)
@@ -1541,6 +1541,12 @@ static int __mce_read_apei(char __user **ubuf, size_t usize)
        /* Error or no more MCE record */
        if (rc <= 0) {
                mce_apei_read_done = 1;
+               /*
+                * When ERST is disabled, mce_chrdev_read() should return
+                * "no record" instead of "no device."
+                */
+               if (rc == -ENODEV)
+                       return 0;
                return rc;
        }
        rc = -EFAULT;