From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753906Ab0BDDKP (ORCPT ); Wed, 3 Feb 2010 22:10:15 -0500 Received: from mga01.intel.com ([192.55.52.88]:57469 "EHLO mga01.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751087Ab0BDDKN (ORCPT ); Wed, 3 Feb 2010 22:10:13 -0500 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="4.49,402,1262592000"; d="scan'208";a="537573619" Date: Thu, 4 Feb 2010 10:43:54 +0800 From: Wu Fengguang To: Greg KH Cc: Andrew Morton , Greg Kroah-Hartman , LKML , Linux Memory Management List , Andi Kleen , "linux-fsdevel@vger.kernel.org" , "stable@kernel.org" , KAMEZAWA Hiroyuki Subject: [stable] [PATCH] devmem: fix kmem write bug on memory holes Message-ID: <20100204024353.GA13576@localhost> References: <20100122045914.993668874@intel.com> <20100203234724.GA23902@kroah.com> <20100204024202.GD6343@localhost> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100204024202.GD6343@localhost> User-Agent: Mutt/1.5.18 (2008-05-17) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Wu Fengguang commit c85e9a97c4102ce2e83112da850d838cfab5ab13 upstream. write_kmem() used to assume vwrite() always return the full buffer length. However now vwrite() could return 0 to indicate memory hole. This creates a bug that "buf" is not advanced accordingly. Fix it to simply ignore the return value, hence the memory hole. CC: Andi Kleen CC: Benjamin Herrenschmidt CC: Christoph Lameter CC: Ingo Molnar CC: Tejun Heo CC: Nick Piggin CC: KAMEZAWA Hiroyuki CC: Signed-off-by: Wu Fengguang --- drivers/char/mem.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) --- linux-2.6.32.orig/drivers/char/mem.c 2010-02-04 10:37:55.000000000 +0800 +++ linux-2.6.32/drivers/char/mem.c 2010-02-04 10:37:59.000000000 +0800 @@ -599,7 +599,7 @@ static ssize_t write_kmem(struct file * break; } } - len = vwrite(kbuf, (char *)p, len); + vwrite(kbuf, (char *)p, len); count -= len; buf += len; virtr += len;