From: Artem Bityutskiy <dedekind1@gmail.com>
To: Joakim Tjernlund <Joakim.Tjernlund@transmode.se>
Cc: linux-mtd@lists.infradead.org
Subject: Re: [PATCH] JFFS2: Erase max 3 EB's in jffs2_write_super()
Date: Tue, 09 Feb 2010 14:05:02 +0200 [thread overview]
Message-ID: <1265717102.2006.142.camel@localhost> (raw)
In-Reply-To: <1265103600-32522-1-git-send-email-Joakim.Tjernlund@transmode.se>
On Tue, 2010-02-02 at 10:40 +0100, Joakim Tjernlund wrote:
> Deleting big files in a JFFS2 root FS and the rebooting makes
> the system hang until all freed EB's has been erased which
> can take several minutes.
> Fix the hanging by making jffs2_write_super() erase max 3 EB's
> at a time. If there are more EB's to erase afterwards, reset the
> s_dirty flag.
>
> Signed-off-by: Joakim Tjernlund <Joakim.Tjernlund@transmode.se>
> ---
>
> I hope the list_empty calls doesn't need locking. If
> so, it can easily be added.
>
> fs/jffs2/super.c | 5 ++++-
> 1 files changed, 4 insertions(+), 1 deletions(-)
>
> diff --git a/fs/jffs2/super.c b/fs/jffs2/super.c
> index 9a80e8e..10393e0 100644
> --- a/fs/jffs2/super.c
> +++ b/fs/jffs2/super.c
> @@ -64,7 +64,10 @@ static void jffs2_write_super(struct super_block *sb)
> if (!(sb->s_flags & MS_RDONLY)) {
> D1(printk(KERN_DEBUG "jffs2_write_super()\n"));
> jffs2_garbage_collect_trigger(c);
> - jffs2_erase_pending_blocks(c, 0);
> + jffs2_erase_pending_blocks(c, 3);
> + if (!list_empty(&c->erase_complete_list) ||
> + !list_empty(&c->erase_pending_list))
> + sb->s_dirt = 1;
> jffs2_flush_wbuf_gc(c, 0);
> }
I think this is not very "friendly" WRT to VFS. From VFS's POW, JFFS2
has to have it's super-block clean upon return from '->write_super()'.
By leaving the super-block dirty, you violate VFS conventions, I thing.
What I suggest you to do instead is to delegate the erasing part to the
background thread. Roughly, something like:
1. wake the JFFS2 BGT from 'jffs2_write_super()' (you'll do this by
doing the next item).
2. Change 'jffs2_thread_should_wake()' so that it would return "true" if
there are pending EBs to erase.
3. Erase only a couple of EBs at one loop iteration, then try to do
other activities (GC ing)
This way you will (1) make '->write_super()' fast.
--
Best Regards,
Artem Bityutskiy (Артём Битюцкий)
prev parent reply other threads:[~2010-02-09 12:06 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-02-02 9:40 [PATCH] JFFS2: Erase max 3 EB's in jffs2_write_super() Joakim Tjernlund
2010-02-02 9:44 ` Joakim Tjernlund
2010-02-09 12:07 ` Artem Bityutskiy
2010-02-08 15:24 ` Joakim Tjernlund
2010-02-09 12:05 ` Artem Bityutskiy [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1265717102.2006.142.camel@localhost \
--to=dedekind1@gmail.com \
--cc=Joakim.Tjernlund@transmode.se \
--cc=linux-mtd@lists.infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.