From: Artem Bityutskiy <dedekind@yandex.ru>
To: Al Viro <viro@ftp.linux.org.uk>
Cc: Linux Kernel Mailing List <linux-kernel@vger.kernel.org>
Subject: Re: is the inode an orphan?
Date: Fri, 19 Oct 2007 10:07:29 +0300 [thread overview]
Message-ID: <471857B1.8090709@yandex.ru> (raw)
In-Reply-To: <20071018180152.GO8181@ftp.linux.org.uk>
Al Viro wrote:
> Define orphan. It might very well be still opened after the only link
> to it had been removed and you still will get IO on it.
Well, in the mail I called files like open/unlink the last link/do some I/O
orphans. Let me shortly describe the problem I'm trying to solve.
In our FS when we're in ->unlink() and i_nlink becomes 0, we have to record
this inode in the table of orphans, and remove it from there in
->delete_inode(). This is needed to be able to dispose of orphans in case of an
unclean reboot on the next mount. AFAIK, ext3 has something similar. I just
figured that this could be optimized - in most cases ->delete_inode() is called
right after ->unlink(), and I wanted to avoid putting the inode to the orphan
table in those cases.
I.e., if one just does "unlink file", then it is not going to be an orphan. And
most cases are like this. It is rather rare to open a file, unlink it, and keep
utilizing it.
So my question was - while I'm in ->unlink(), how do I figure out that this is
not an orphan. So I was thinking about
if (atomic_read(&inode->i_count) == 2)
then this is not an orphan and ->delete_inode() will be called straight away
(i_nlink is assumed to be 0).
But I've now also figured that ->unlink() may race with write-back, and there
might be a write-back I/O between ->unlink() (and during it) and
->delete_inode(), even though the user-space does not have the file in question
opened.
So, at the moment, AFAIU
if (atomic_read(&inode->i_count) == 2 && !(inode->i_state & I_DIRTY))
then there won't be any I/O on the inode between ->unlink() and ->delete_inode
i_nlink is assumed to be 0). Is that right, safe and acceptable to use such
checks in ->unlink() for optimization?
P.S. the code and short description of the FS I refer is here:
http://www.linux-mtd.infradead.org/doc/ubifs.html
Thanks!
--
Best Regards,
Artem Bityutskiy (Артём Битюцкий)
next prev parent reply other threads:[~2007-10-19 7:08 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-10-18 17:49 is the inode an orphan? Artem Bityutskiy
2007-10-18 18:01 ` Al Viro
2007-10-19 7:07 ` Artem Bityutskiy [this message]
2007-10-30 14:10 ` Jan Kara
2007-11-19 15:02 ` Artem Bityutskiy
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=471857B1.8090709@yandex.ru \
--to=dedekind@yandex.ru \
--cc=linux-kernel@vger.kernel.org \
--cc=viro@ftp.linux.org.uk \
/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