public inbox for linux-mtd@lists.infradead.org
 help / color / mirror / Atom feed
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 (Артём Битюцкий)

      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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox