From: David Woodhouse <dwmw2@infradead.org>
To: "Artem B. Bityuckiy" <dedekind@yandex.ru>
Cc: linux-mtd@lists.infradead.org
Subject: Re: [PATCH] JFFS[23] slab corruption
Date: Sun, 27 Feb 2005 10:30:33 +0000 [thread overview]
Message-ID: <1109500233.27107.20.camel@localhost.localdomain> (raw)
In-Reply-To: <41DBF5F2.5040208@yandex.ru>
On Wed, 2005-01-05 at 17:13 +0300, Artem B. Bityuckiy wrote:
>I'd like to do some analysis. David, could you please comment my notes:
>
>1. Consider removing ic from mark_node_obsolete (NOR only).
>When ic may have no nodes?
ic will have no nodes when they've all been actually removed or marked
obsolete -- that's either in mark_node_obsolete() in the case of NOR
flash, or somewhere in erase.c in the case of NAND.
Until all the nodes are actually gone, we mustn't re-use the old inode
number for new inodes, so the ic has to stay in the list.
>a). When the inode is deleted. In this case all it's nodes are marked
>obsolete (thankfully we may mark them obsolete physically). This happens
>when ic->nlink == 0 and last iput() is called.
On NOR, yes. If !jffs2_can_mark_obsolete() it happens only later.
>b). I'm not sure, may be temporary it may have no valid nodes. I mean
>some transient state when, for example, there is one node A, and another
>node B is added, and B obsoletes A. Then possibly A will be first marked
>obsolete, then B will be added. Between these two operations, ic may
>have no nodes. I'm not sure, but it seems in the current implementation
>in such situations A will be always added first. So, mark_node_obsolete
>should not delete the ic in such temporary states.
No, that'll never happen because it wouldn't be powerfail-safe. We can't
ever obsolete an old node before writing the new one.
>But why do mark_node_obsolete code delete the correspondent ic if there
>is no nodes left? It should not delete ic because of b) . Moreover,
>conceptually it is not its work - the last iput handler should do that
>(do_clean_inode() may be).
>Conclusions: a) remove that peace of code from the mark_node_obsolete.
>b) be sure ic will be deleted by somebody else.
Perhaps. But I think we have to check for INO_STATE_READING and
INO_STATE_CLEARING even when we're removing the ic from erase.c, to
prevent a similar failure. And so I think that we have to do the check
when we leave read_inode() or clear_inode() (or have some other way of
postponing it). So since we need all this to handle the erase case, we
might as well just do the same in mark_node_obsolete() too.
>2. Conceder jffs2_remove_node_refs_from_ino_list() function. It deletes
>ic if there are no nodes...
>
>At first this is only valid for NAND. In case of NOR obsolete nodes are
>removed from the per-inode list as soon as they marked obsolete.
>
>In case of nand our live is complicated because we can not mark nodes
>obsolete physically. And deletion/deleted direntries bring us
>misfortune. We must keep track of them in the per-inode list and only
>remove them when the last instance of the deleted direntry has been
>erased...
>
>But before the erase code deletes ic, it should be sure there are no
>open files (iget count = 0) and ic->nlink = 0. But it seems it does not
>do so. ... May continue reasoning, but want to be sure I understand
>thing correctly. So, will wait for comments.
You'll never delete ic for a file which is open because it can't be
actually deleted when it's open, and until it's actually deleted it'll
always have at least one node.
--
dwmw2
next prev parent reply other threads:[~2005-02-27 10:30 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2005-01-03 19:26 [PATCH] JFFS[23] slab corruption Artem B. Bityuckiy
2005-01-05 10:42 ` Artem B. Bityuckiy
2005-01-05 11:33 ` David Woodhouse
2005-01-05 14:13 ` Artem B. Bityuckiy
2005-02-27 10:30 ` David Woodhouse [this message]
2005-02-27 14:02 ` Artem B. Bityuckiy
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=1109500233.27107.20.camel@localhost.localdomain \
--to=dwmw2@infradead.org \
--cc=dedekind@yandex.ru \
--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.