From patchwork Wed May 11 21:02:28 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Matthew L. Creech" X-Patchwork-Id: 95182 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.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 E8A72B6F65 for ; Thu, 12 May 2011 07:03:40 +1000 (EST) Received: from canuck.infradead.org ([134.117.69.58]) by bombadil.infradead.org with esmtps (Exim 4.72 #1 (Red Hat Linux)) id 1QKGYI-0007jZ-Hx; Wed, 11 May 2011 21:02:38 +0000 Received: from localhost ([127.0.0.1] helo=canuck.infradead.org) by canuck.infradead.org with esmtp (Exim 4.72 #1 (Red Hat Linux)) id 1QKGYH-0004UX-Ke; Wed, 11 May 2011 21:02:37 +0000 Received: from mail-yi0-f49.google.com ([209.85.218.49]) by canuck.infradead.org with esmtps (Exim 4.72 #1 (Red Hat Linux)) id 1QKGYF-0004UF-Bm for linux-mtd@lists.infradead.org; Wed, 11 May 2011 21:02:36 +0000 Received: by yic15 with SMTP id 15so373059yic.36 for ; Wed, 11 May 2011 14:02:33 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:from:to:subject:date:message-id:x-mailer :in-reply-to:references; bh=9NGPTQsVKSu9NLQ0jUo5fnWeIMOFz7mCUYVd5XMZZgk=; b=nAZEPEA+d9QQPtxiEnn3vjIAyLOCev5VHIHBkpRIPVTwkyNxXRUsqa+ih4BZ1Xp41l KlZw9+RphJ/TddaYc0C7+HDMbhv4KBTofOJ9CRv4y2pPQHszW25SpFNQDQVkeWgbG2pr RjmOa58jUZpn9jKZDqe4hV7htDTA90SN/RXMQ= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=from:to:subject:date:message-id:x-mailer:in-reply-to:references; b=iQOM1TtZeHnu2KDqIaQy7LQfLmZuSRJ3G/anCMUP9MjMjDjfAnMcfeCr6OqxQM3Xof L24lmSGg2k9DDKW424OLLXq8P9e3S0B1wR8+QVUR5zWHu79XKFbzr3t4FRkg+U7lslaD SWkp/vgcSzT1KpaGz7hHC0NxvDOCcAogr7/zU= Received: by 10.150.195.18 with SMTP id s18mr7992556ybf.207.1305147752987; Wed, 11 May 2011 14:02:32 -0700 (PDT) Received: from localhost.localdomain (mcreech.com [74.207.224.132]) by mx.google.com with ESMTPS id f8sm425821ybn.23.2011.05.11.14.02.31 (version=TLSv1/SSLv3 cipher=OTHER); Wed, 11 May 2011 14:02:32 -0700 (PDT) From: "Matthew L. Creech" To: linux-mtd@lists.infradead.org, bengardiner@nanometrics.ca Subject: [PATCH 1/1] mkfs.ubifs: add "-F" option for "free-space fixup" Date: Wed, 11 May 2011 17:02:28 -0400 Message-Id: <1305147748-13632-1-git-send-email-mlcreech@gmail.com> X-Mailer: git-send-email 1.6.3.3 In-Reply-To: References: X-CRM114-Version: 20090807-BlameThorstenAndJenny ( TRE 0.7.6 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20110511_170235_528592_A9EDAEA5 X-CRM114-Status: GOOD ( 16.92 ) X-Spam-Score: -0.8 (/) X-Spam-Report: SpamAssassin version 3.3.1 on canuck.infradead.org summary: Content analysis details: (-0.8 points) pts rule name description ---- ---------------------- -------------------------------------------------- 0.0 FREEMAIL_FROM Sender email is freemail (mlcreech[at]gmail.com) -0.7 RCVD_IN_DNSWL_LOW RBL: Sender listed at http://www.dnswl.org/, low trust [209.85.218.49 listed in list.dnswl.org] -0.1 DKIM_VALID_AU Message has a valid DKIM or DK signature from author's domain 0.1 DKIM_SIGNED Message has a DKIM or DK signature, not necessarily valid -0.1 DKIM_VALID Message has at least one valid DKIM or DK signature 0.0 RFC_ABUSE_POST Both abuse and postmaster missing on sender domain 0.0 T_TO_NO_BRKTS_FREEMAIL T_TO_NO_BRKTS_FREEMAIL X-BeenThere: linux-mtd@lists.infradead.org X-Mailman-Version: 2.1.12 Precedence: list List-Id: Linux MTD discussion mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: linux-mtd-bounces@lists.infradead.org Errors-To: linux-mtd-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org This adds a superblock flag indicating that "free-space fixup" is needed, and allows it to be set by the user via the "-F" command-line option. The first time the filesystem is mounted, this flag will trigger a one-time re-mapping of all LEBs containing free space. This fixes problems seen on some NAND flashes when a non-UBIFS-aware flash programmer is used. Signed-off-by: Matthew L. Creech --- mkfs.ubifs/mkfs.ubifs.c | 11 ++++++++++- mkfs.ubifs/ubifs-media.h | 2 ++ mkfs.ubifs/ubifs.h | 2 ++ 3 files changed, 14 insertions(+), 1 deletions(-) diff --git a/mkfs.ubifs/mkfs.ubifs.c b/mkfs.ubifs/mkfs.ubifs.c index a306dd6..96e17a3 100644 --- a/mkfs.ubifs/mkfs.ubifs.c +++ b/mkfs.ubifs/mkfs.ubifs.c @@ -132,7 +132,7 @@ static struct inum_mapping **hash_table; /* Inode creation sequence number */ static unsigned long long creat_sqnum; -static const char *optstring = "d:r:m:o:D:h?vVe:c:g:f:p:k:x:X:j:R:l:j:UQq"; +static const char *optstring = "d:r:m:o:D:h?vVe:c:g:f:Fp:k:x:X:j:R:l:j:UQq"; static const struct option longopts[] = { {"root", 1, NULL, 'r'}, @@ -150,6 +150,7 @@ static const struct option longopts[] = { {"compr", 1, NULL, 'x'}, {"favor-percent", 1, NULL, 'X'}, {"fanout", 1, NULL, 'f'}, + {"space-fixup", 0, NULL, 'F'}, {"keyhash", 1, NULL, 'k'}, {"log-lebs", 1, NULL, 'l'}, {"orph-lebs", 1, NULL, 'p'}, @@ -183,6 +184,7 @@ static const char *helptext = " how many percent better zlib should compress to make\n" " mkfs.ubifs use zlib instead of LZO (default 20%)\n" "-f, --fanout=NUM fanout NUM (default: 8)\n" +"-F, --space-fixup fixup free space on first mount (needed for some NANDs)\n" "-k, --keyhash=TYPE key hash type - \"r5\" or \"test\" (default: \"r5\")\n" "-p, --orph-lebs=COUNT count of erase blocks for orphans (default: 1)\n" "-D, --devtable=FILE use device table FILE\n" @@ -537,6 +539,7 @@ static int get_options(int argc, char**argv) c->max_leb_cnt = -1; c->max_bud_bytes = -1; c->log_lebs = -1; + c->space_fixup = 0; while (1) { opt = getopt_long(argc, argv, optstring, longopts, &i); @@ -610,6 +613,9 @@ static int get_options(int argc, char**argv) if (*endp != '\0' || endp == optarg || c->fanout <= 0) return err_msg("bad fanout %s", optarg); break; + case 'F': + c->space_fixup = 1; + break; case 'l': c->log_lebs = strtol(optarg, &endp, 0); if (*endp != '\0' || endp == optarg || c->log_lebs <= 0) @@ -758,6 +764,7 @@ static int get_options(int argc, char**argv) "r5" : "test"); printf("\tfanout: %d\n", c->fanout); printf("\torph_lebs: %d\n", c->orph_lebs); + printf("\tspace_fixup: %d\n", c->space_fixup); } if (validate_options()) @@ -1997,6 +2004,8 @@ static int write_super(void) } if (c->big_lpt) sup.flags |= cpu_to_le32(UBIFS_FLG_BIGLPT); + if (c->space_fixup) + sup.flags |= cpu_to_le32(UBIFS_FLG_SPACE_FIXUP); return write_node(&sup, UBIFS_SB_NODE_SZ, UBIFS_SB_LNUM, UBI_LONGTERM); } diff --git a/mkfs.ubifs/ubifs-media.h b/mkfs.ubifs/ubifs-media.h index a9ecbd9..fe62d0e 100644 --- a/mkfs.ubifs/ubifs-media.h +++ b/mkfs.ubifs/ubifs-media.h @@ -373,9 +373,11 @@ enum { * Superblock flags. * * UBIFS_FLG_BIGLPT: if "big" LPT model is used if set + * UBIFS_FLG_SPACE_FIXUP: first-mount "fixup" of free space within LEBs needed */ enum { UBIFS_FLG_BIGLPT = 0x02, + UBIFS_FLG_SPACE_FIXUP = 0x04, }; /** diff --git a/mkfs.ubifs/ubifs.h b/mkfs.ubifs/ubifs.h index 5c29046..f94a52c 100644 --- a/mkfs.ubifs/ubifs.h +++ b/mkfs.ubifs/ubifs.h @@ -317,6 +317,7 @@ struct ubifs_znode * @nhead_lnum: LEB number of LPT head * @nhead_offs: offset of LPT head * @big_lpt: flag that LPT is too big to write whole during commit + * @space_fixup: flag indicating that free space in LEBs needs to be cleaned up * @lpt_sz: LPT size * * @ltab_lnum: LEB number of LPT's own lprops table @@ -394,6 +395,7 @@ struct ubifs_info int nhead_lnum; int nhead_offs; int big_lpt; + int space_fixup; long long lpt_sz; int ltab_lnum;