From patchwork Mon Sep 28 07:03:38 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Bean Huo X-Patchwork-Id: 523245 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from bombadil.infradead.org (bombadil.infradead.org [IPv6:2001:1868:205::9]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 675A1140157 for ; Mon, 28 Sep 2015 17:10:09 +1000 (AEST) Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.80.1 #2 (Red Hat Linux)) id 1ZgSYR-0002cL-Tf; Mon, 28 Sep 2015 07:08:55 +0000 Received: from mailout.micron.com ([137.201.242.129]) by bombadil.infradead.org with esmtps (Exim 4.80.1 #2 (Red Hat Linux)) id 1ZgSU8-0007h7-Ka; Mon, 28 Sep 2015 07:04:29 +0000 Received: from mail.micron.com (bowex17-b.micron.com [137.201.21.110]) by mailout.micron.com (8.14.4/8.14.6) with ESMTP id t8S73gHa020353 (version=TLSv1/SSLv3 cipher=AES256-SHA bits=256 verify=FAIL); Mon, 28 Sep 2015 01:03:42 -0600 Received: from BOWEX17-B.micron.com (137.201.21.110) by BOWEX17-B.micron.com (137.201.21.110) with Microsoft SMTP Server (TLS) id 15.0.1104.5; Mon, 28 Sep 2015 01:03:42 -0600 Received: from NTXXIACAS02.xacn.micron.com (10.167.69.56) by BOWEX17-B.micron.com (137.201.21.110) with Microsoft SMTP Server (TLS) id 15.0.1104.5 via Frontend Transport; Mon, 28 Sep 2015 01:03:41 -0600 Received: from NTXXIAMBX02.xacn.micron.com ([fe80::e19a:c3ed:119d:6971]) by NTXXIACAS02.xacn.micron.com ([::1]) with mapi id 14.03.0248.002; Mon, 28 Sep 2015 15:03:38 +0800 From: =?gb2312?B?QmVhbiBIdW8gu/Sx87HzIChiZWFuaHVvKQ==?= To: "dedekind1@gmail.com" , "adrian.hunter@intel.com" , "computersforpeace@gmail.com" , "baruch@tkos.co.il" , "asierra@xes-inc.com" , "guz.fnst@cn.fujitsu.com" , "gsi@denx.de" , "richard@nod.at" , Boris Brezillon Subject: [PATCH 6/9] drivers:mtd:ubi:add hook for UBI bakvol in ubi_io_write Thread-Topic: [PATCH 6/9] drivers:mtd:ubi:add hook for UBI bakvol in ubi_io_write Thread-Index: AdD5uIaPmYOmyqJxShy9KEX8NMLqEg== Date: Mon, 28 Sep 2015 07:03:38 +0000 Message-ID: Accept-Language: zh-CN, en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [10.167.84.5] x-tm-as-product-ver: SMEX-11.0.0.4179-7.500.1018-21632.003 x-tm-as-result: No--38.963900-0.000000-31 x-tm-as-user-approved-sender: Yes x-tm-as-user-blocked-sender: No x-mt-checkinternalsenderrule: True MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.73 on 137.201.82.105 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20150928_000428_823268_81A14375 X-CRM114-Status: GOOD ( 10.68 ) X-Spam-Score: -4.2 (----) X-Spam-Report: SpamAssassin version 3.4.0 on bombadil.infradead.org summary: Content analysis details: (-4.2 points) pts rule name description ---- ---------------------- -------------------------------------------------- -2.3 RCVD_IN_DNSWL_MED RBL: Sender listed at http://www.dnswl.org/, medium trust [137.201.242.129 listed in list.dnswl.org] -0.0 SPF_PASS SPF: sender matches SPF record -0.0 T_RP_MATCHES_RCVD Envelope sender domain matches handover relay domain -1.9 BAYES_00 BODY: Bayes spam probability is 0 to 1% [score: 0.0000] X-BeenThere: linux-mtd@lists.infradead.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: Linux MTD discussion mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Boris Brezillon , Iwo Mergler , "Jeff Lauruhn \(jlauruhn\)" , Artem Bityutskiy , Richard Weinberger , "linux-kernel@vger.kernel.org" , Andrea Scian , "linux-mtd@lists.infradead.org" , =?gb2312?B?RnJhbmsgTGl1IMH1yLogKGZyYW5rbGl1KQ==?= , Stefan Roese , =?gb2312?B?S2FybCBaaGFuZyDVxcurwuAgKGthcmx6aGFuZyk=?= , David Woodhouse , =?gb2312?B?UGV0ZXIgUGFuIMXLtrAgKHBldGVycGFuZG9uZyk=?= Sender: "linux-mtd" Errors-To: linux-mtd-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org Add hook for UBI bakvol in ubi_io_write. Modify ubi_io_write, if program lower page of MLC NAND, Duplicated it and backup one copy into internal log volume by Dual plane program method. Signed-off-by: Bean Huo --- drivers/mtd/ubi/io.c | 63 +++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 55 insertions(+), 8 deletions(-) diff --git a/drivers/mtd/ubi/io.c b/drivers/mtd/ubi/io.c index 5bbd1f0..912c458 100644 --- a/drivers/mtd/ubi/io.c +++ b/drivers/mtd/ubi/io.c @@ -236,8 +236,9 @@ int ubi_io_write(struct ubi_device *ubi, const void *buf, int pnum, int offset, int len) { int err; - size_t written; + size_t retlen; loff_t addr; + int skip = 0; dbg_io("write %d bytes to PEB %d:%d", len, pnum, offset); @@ -281,14 +282,60 @@ int ubi_io_write(struct ubi_device *ubi, const void *buf, int pnum, int offset, } addr = (loff_t)pnum * ubi->peb_size + offset; - err = mtd_write(ubi->mtd, addr, len, &written, buf); - if (err) { - ubi_err(ubi, "error %d while writing %d bytes to PEB %d:%d, written %zd bytes", - err, len, pnum, offset, written); - dump_stack(); - ubi_dump_flash(ubi, pnum, offset, len); + +#ifdef CONFIG_MTD_UBI_MLC_NAND_BAKVOL + if ((offset == 0) && (len == ubi->peb_size)) + skip = 1; + + if (ubi_check_backup_volume(ubi) && (!skip)) { + loff_t addr_temp; + unsigned char *buf_temp = (unsigned char *)buf; + int len_temp; + int writelen = 0; + + addr_temp = addr; + + for (len_temp = len; len_temp > 0; len_temp -= ubi->min_io_size, + addr_temp += ubi->min_io_size, + buf_temp += ubi->min_io_size) { + /* Split data according to min_io_size */ + + if (len_temp/ubi->min_io_size) + writelen = ubi->min_io_size; + else + writelen %= ubi->min_io_size; + + if (is_backup_need(ubi, addr_temp)) { + err = ubi_backup_data_to_backup_volume(ubi, + addr_temp, writelen, &retlen, buf_temp); + } else + err = mtd_write(ubi->mtd, addr_temp, writelen, + &retlen, buf_temp); + + if (err) { + ubi_err(ubi, "Writing %d byptes to PEB %d:%d", + writelen, pnum, offset); + ubi_err(ubi, "Error %d", err); + ubi_err(ubi, "Written %zd bytes", retlen); + dump_stack(); + ubi_dump_flash(ubi, pnum, offset, writelen); + } else + ubi_assert(retlen == writelen); + } } else - ubi_assert(written == len); +#endif + { + err = mtd_write(ubi->mtd, addr, len, &retlen, buf); + if (err) { + ubi_err(ubi, "Writing %d byptes to PEB %d:%d", + len, pnum, offset); + ubi_err(ubi, "Error %d", err); + ubi_err(ubi, "Written %zd bytes", retlen); + dump_stack(); + ubi_dump_flash(ubi, pnum, offset, len); + } else + ubi_assert(retlen == len); + } if (!err) { err = self_check_write(ubi, buf, pnum, offset, len);