Re: 2.4.15-pre9 breakage (inode.c)

Andrea Arcangeli
2001-11-24T06:26:39Z

On Sat, Nov 24, 2001 at 01:08:49AM -0500, Alexander Viro wrote:
>
>
> On Fri, 23 Nov 2001, Linus Torvalds wrote:
>
> > > - if (!list_empty(&inode->i_hash) && sb && sb->s_root) {
> > > + if (!list_empty(&inode->i_hash)) {
> > > if (!(inode->i_state & (I_DIRTY|I_LOCK))) {
> > > list_del(&inode->i_list);
> > > list_add(&inode->i_list, &inode_unused);
> >
> > I have to say that I like this patch better myself - the added tests are
> > not sensible, and just removing them seems to be the right thing.
>
> Test for ->s_root is bogus and had been removed - check the patch I've sent.
>
> However, that variant suffers from the following problem: if ->read_super()
> fails after it had done _any_ iget() (root inode, journal, whatever) -
> we are screwed. Sure, we do iput(). And then we have inode stuck in icache,

you are screwed because you were running a broken filesystem: it is its
own business to drop the inodes if it fails, all it needs to do is to
call invalidate_inodes(s) internally before returning from the read_super
in the failure case.

> with ->i_sb pointing nowhere. When it finally gets evicted we call
> inode->i_sb->s_op->clear_inode(). Oops...

Andrea