From patchwork Tue Feb 10 10:33:54 2009 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sebastian Andrzej Siewior X-Patchwork-Id: 22873 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id 1BFF9DDDAC for ; Tue, 10 Feb 2009 23:58:51 +1100 (EST) Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.69 #1 (Red Hat Linux)) id 1LWsAK-00070T-2u; Tue, 10 Feb 2009 12:56:40 +0000 Received: from www.tglx.de ([62.245.132.106]) by bombadil.infradead.org with esmtps (Exim 4.69 #1 (Red Hat Linux)) id 1LWpwD-0004Ro-FM; Tue, 10 Feb 2009 10:34:12 +0000 Received: from www.tglx.de (www.tglx.de [127.0.0.1]) by www.tglx.de (8.13.8/8.13.8/TGLX-2007100201) with ESMTP id n1AAXs8W009410 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Tue, 10 Feb 2009 11:33:54 +0100 Received: (from bigeasy@localhost) by www.tglx.de (8.13.8/8.13.8/Submit) id n1AAXsIM009409; Tue, 10 Feb 2009 11:33:54 +0100 Date: Tue, 10 Feb 2009 11:33:54 +0100 From: Sebastian Andrzej Siewior To: Artem Bityutskiy Subject: [PATCH v2] ubiformat: make it work on mtd parts > 2GiB Message-ID: <20090210103354.GA8405@www.tglx.de> References: <20090210095614.GA1995@www.tglx.de> <1234260416.17790.109.camel@localhost.localdomain> Mime-Version: 1.0 Content-Disposition: inline In-Reply-To: <1234260416.17790.109.camel@localhost.localdomain> User-Agent: Mutt/1.4.2.2i X-Key-Id: 97C4700B X-Key-Fingerprint: 09E2 D1F3 9A3A FF13 C3D3 961C 0688 1C1E 97C4 700B X-Virus-Scanned: ClamAV 0.93.2/8970/Tue Feb 10 03:52:04 2009 on www.tglx.de X-Virus-Status: Clean X-Spam-Status: No, score=-1.4 required=5.0 tests=ALL_TRUSTED,AWL autolearn=failed version=3.2.4 X-Spam-Checker-Version: SpamAssassin 3.2.4 (2008-01-01) on www.tglx.de X-Bad-Reply: References and In-Reply-To but no 'Re:' in Subject. X-Spam-Score: 0.0 (/) X-Mailman-Approved-At: Tue, 10 Feb 2009 07:56:38 -0500 Cc: linux-mtd@lists.infradead.org X-BeenThere: linux-mtd@lists.infradead.org X-Mailman-Version: 2.1.9 Precedence: list List-Id: Linux MTD discussion mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: linux-mtd-bounces@lists.infradead.org Errors-To: linux-mtd-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org I have here a mtd part which is 3 GiB with a flash page size of 256KiB. The 2GiB limit is at erase block 8192. In mtd_is_bad() the computation for the MEMGETBADBLOCK ioctl() looks like the following: | seek = eb * mtd->eb_size; with both eb and mtd->eb_size being a signed int results in seek being a signed result. Therefore I cast them to int as Artem suggested. The _FILE_OFFSET_BITS=64 define is required to switch off_t from 32bit to 64bit an 32bit systems. This is required in order to keep using lseek() as lseek64 on 32bit system. Without this change lseek() in mtd_read() is called with a 32bit value with most significat bit set and the kernel performs a sign extension for the 64bit value which is used in the mtd layer. The last change also changes the size of the parameter which is passed to the MEMGETBADBLOCK ioctl() from 32 to 64bit. The counter part in kernel is also defined as loff_t which is of type __kernel_loff_t and this is "long long". So this must have been broken for a while unless I missed something. Signed-off-by: Sebastian Andrzej Siewior --- That's a tiny one. Just flashed and it works. Hope that is what you had in mind. common.mk | 2 +- ubi-utils/new-utils/src/libmtd.c | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/common.mk b/common.mk index 77d28bf..65fc1cc 100644 --- a/common.mk +++ b/common.mk @@ -2,7 +2,7 @@ CC := $(CROSS)gcc AR := $(CROSS)ar RANLIB := $(CROSS)ranlib CFLAGS ?= -O2 -g -CFLAGS += -Wall -Wwrite-strings -W +CFLAGS += -Wall -Wwrite-strings -W -D_FILE_OFFSET_BITS=64 DESTDIR ?= /usr/local PREFIX=/usr diff --git a/ubi-utils/new-utils/src/libmtd.c b/ubi-utils/new-utils/src/libmtd.c index aab4b0e..69705dd 100644 --- a/ubi-utils/new-utils/src/libmtd.c +++ b/ubi-utils/new-utils/src/libmtd.c @@ -189,7 +189,7 @@ int mtd_is_bad(const struct mtd_info *mtd, int eb) if (!mtd->allows_bb) return 0; - seek = eb * mtd->eb_size; + seek = (unsigned int)eb * mtd->eb_size; ret = ioctl(mtd->fd, MEMGETBADBLOCK, &seek); if (ret == -1) { sys_errmsg("MEMGETBADBLOCK ioctl failed for " @@ -231,7 +231,7 @@ int mtd_read(const struct mtd_info *mtd, int eb, int offs, void *buf, int len) } /* Seek to the beginning of the eraseblock */ - seek = eb * mtd->eb_size + offs; + seek = (unsigned int)eb * mtd->eb_size + offs; if (lseek(mtd->fd, seek, SEEK_SET) != seek) { sys_errmsg("cannot seek mtd%d to offset %llu", mtd->num, (unsigned long long)seek); @@ -296,7 +296,7 @@ int mtd_write(const struct mtd_info *mtd, int eb, int offs, void *buf, int len) #endif /* Seek to the beginning of the eraseblock */ - seek = eb * mtd->eb_size + offs; + seek = (unsigned int)eb * mtd->eb_size + offs; if (lseek(mtd->fd, seek, SEEK_SET) != seek) { sys_errmsg("cannot seek mtd%d to offset %llu", mtd->num, (unsigned long long)seek);