From patchwork Fri May 29 10:00:49 2009 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Artem Bityutskiy X-Patchwork-Id: 27839 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 bilbo.ozlabs.org (Postfix) with ESMTPS id 625AAB7069 for ; Fri, 29 May 2009 20:04:15 +1000 (EST) Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.69 #1 (Red Hat Linux)) id 1M9yty-0003ZU-MH; Fri, 29 May 2009 10:01:26 +0000 Received: from smtp.nokia.com ([192.100.122.230] helo=mgw-mx03.nokia.com) by bombadil.infradead.org with esmtps (Exim 4.69 #1 (Red Hat Linux)) id 1M9ytd-0003Xp-3d for linux-mtd@lists.infradead.org; Fri, 29 May 2009 10:01:12 +0000 Received: from esebh106.NOE.Nokia.com (esebh106.ntc.nokia.com [172.21.138.213]) by mgw-mx03.nokia.com (Switch-3.2.6/Switch-3.2.6) with ESMTP id n4TA0fsl014388; Fri, 29 May 2009 13:00:48 +0300 Received: from vaebh104.NOE.Nokia.com ([10.160.244.30]) by esebh106.NOE.Nokia.com with Microsoft SMTPSVC(6.0.3790.3959); Fri, 29 May 2009 13:00:50 +0300 Received: from mgw-sa01.ext.nokia.com ([147.243.1.47]) by vaebh104.NOE.Nokia.com over TLS secured channel with Microsoft SMTPSVC(6.0.3790.3959); Fri, 29 May 2009 13:00:50 +0300 Received: from [172.21.42.232] (esdhcp042232.research.nokia.com [172.21.42.232]) by mgw-sa01.ext.nokia.com (Switch-3.2.6/Switch-3.2.6) with ESMTP id n4TA0nru032765; Fri, 29 May 2009 13:00:49 +0300 Subject: Re: UBIFS: "sync" mount option does not work From: Artem Bityutskiy To: =?ISO-8859-1?Q?Aur=E9lien_G=C9R=D4ME?= In-Reply-To: <20090528170621.GJ18372@roxor.cx> References: <20090528170621.GJ18372@roxor.cx> Date: Fri, 29 May 2009 13:00:49 +0300 Message-Id: <1243591249.11172.106.camel@localhost.localdomain> Mime-Version: 1.0 X-Mailer: Evolution 2.24.5 (2.24.5-1.fc10) X-OriginalArrivalTime: 29 May 2009 10:00:50.0423 (UTC) FILETIME=[58844070:01C9E044] X-Nokia-AV: Clean X-Spam-Score: -4.0 (----) X-Spam-Report: SpamAssassin version 3.2.5 on bombadil.infradead.org summary: Content analysis details: (-4.0 points) pts rule name description ---- ---------------------- -------------------------------------------------- -4.0 RCVD_IN_DNSWL_MED RBL: Sender listed at http://www.dnswl.org/, medium trust [192.100.122.230 listed in list.dnswl.org] Cc: linux-fsdevel , linux-mtd@lists.infradead.org, Adrian.Hunter@nokia.com X-BeenThere: linux-mtd@lists.infradead.org X-Mailman-Version: 2.1.11 Precedence: list Reply-To: dedekind@infradead.org 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 On Thu, 2009-05-28 at 19:06 +0200, Aurélien GÉRÔME wrote: > Hi, > > Mounting a ubifs RedBoot partition located on a NOR flash as root > filesystem fails. > > The kernel is an up-to-date 2.6.24 ubifs git backport. > > It always works fine without the "sync" mount option, but I *really* > need to disable writeback. > > Here is the full boot log. > > RedBoot> exec -b 0x18000 -l 0x500000 -c "noinitrd console=mxcuart,0x5000C000,115200n8 rootfstype=ubifs ubi.mtd=rootfs0 root=ubi0:rootfs rootflags=sync ignore_loglevel" > Warning: invalid entry address but still continue ... > entry=0x80018000, target=0x80018000 > [ 0.000000] Linux version 2.6.24.6 (ag@debian.org) (gcc version 4.2.4 (Debian 4.2.4-6)) #1 PREEMPT Thu May 28 18:22:53 CEST 2009 > [ 0.000000] CPU: ARMv6-compatible processor [4107b364] revision 4 (ARMv6TEJ), cr=00e5387f > [ 0.000000] Machine: Freescale MX31/MX32 ADS ... > [ 6.800000] UBIFS error (pid 1): ubifs_parse_options: unrecognized mount option "sync" or missing value > [ 6.820000] List of all partitions: > [ 6.820000] 0800 1023120 sda driver: sd > [ 6.830000] 0801 1020096 sda1 > [ 6.830000] No filesystem could mount root, tried: ubifs > [ 6.830000] Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0) This seems to be a general problem. I believe if you try to do the same with ext2, it'll refuse your sync flag as well. The problem is that UBIFS, as well as ext2, expects the "sync" option to be passed as MS_SYNCHRONOUS flag, not as a string. Take a look at "man 2 mount", for example. But when you pass the "sync" option with 'rootflags' kernel option, it is passed to UBIFS as a string, and UBIFS is not ready to accept it. Below is the patch which fixes the issue for UBIFS. We could invent a VFS fix for this as well, because this should not be UBIFS-specific. --- From: Artem Bityutskiy Subject: [PATCH] UBIFS: allow sync option in rootflags MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit When passing UBIFS parameters via kernel command line, the sync option will be passed to UBIFS as a string, not as an MS_SYNCHRONOUS flag. Teach UBIFS interpreting this flag. Reported-by: Aurélien GÉRÔME Signed-off-by: Artem Bityutskiy --- fs/ubifs/super.c | 40 +++++++++++++++++++++++++++++++++++----- 1 files changed, 35 insertions(+), 5 deletions(-) diff --git a/fs/ubifs/super.c b/fs/ubifs/super.c index d4ab0fc..3513cad 100644 --- a/fs/ubifs/super.c +++ b/fs/ubifs/super.c @@ -940,6 +940,27 @@ static const match_table_t tokens = { }; /** + * parse_standard_option - parse a standard mount option. + * @option: the option to parse + * + * Normally, standard mount options like "sync" are passed to file-systems as + * flags. However, when a "rootflags=" kernel boot parameter is used, they may + * be present in the options string. This function tries to deal with this + * situation and parse standard options. Returns 0 if the option was not + * recognized, and the corresponding integer flag if it was. + * + * UBIFS is only interested in the "sync" option, so do not check for anything + * else. + */ +static int parse_standard_option(const char *option) +{ + ubifs_msg("parse %s", option); + if (!strcmp(option, "sync")) + return MS_SYNCHRONOUS; + return 0; +} + +/** * ubifs_parse_options - parse mount parameters. * @c: UBIFS file-system description object * @options: parameters to parse @@ -1015,9 +1036,19 @@ static int ubifs_parse_options(struct ubifs_info *c, char *options, break; } default: - ubifs_err("unrecognized mount option \"%s\" " - "or missing value", p); - return -EINVAL; + { + unsigned long flag; + struct super_block *sb = c->vfs_sb; + + flag = parse_standard_option(p); + if (!flag) { + ubifs_err("unrecognized mount option \"%s\" " + "or missing value", p); + return -EINVAL; + } + sb->s_flags |= flag; + break; + } } } @@ -1908,6 +1939,7 @@ static int ubifs_fill_super(struct super_block *sb, void *data, int silent) INIT_LIST_HEAD(&c->orph_list); INIT_LIST_HEAD(&c->orph_new); + c->vfs_sb = sb; c->highest_inum = UBIFS_FIRST_INO; c->lhead_lnum = c->ltail_lnum = UBIFS_LOG_LNUM; @@ -1939,8 +1971,6 @@ static int ubifs_fill_super(struct super_block *sb, void *data, int silent) if (err) goto out_bdi; - c->vfs_sb = sb; - sb->s_fs_info = c; sb->s_magic = UBIFS_SUPER_MAGIC; sb->s_blocksize = UBIFS_BLOCK_SIZE;