On Wed, 2005-02-16 at 03:41, Nikita Danilov wrote:
> Badari Pulavarty writes:
>  > On Tue, 2005-02-15 at 09:54, Andrew Morton wrote:
>  > > Badari Pulavarty <[EMAIL PROTECTED]> wrote:
>  > > >
>  > > > Yep. nobh_prepare_write() doesn't add any bufferheads. But
>  > > >  we call block_write_full_page() even for "nobh" case, which 
>  > > >  does create bufferheads, attaches to the page and operates
>  > > >  on them..
>  > > 
>  > > hmm, yeah, OK, we'll attach bh's in that case.  It's a rare case though -
>  > > when a dirty page falls off the end of the LRU.  There's no particular
>  > > reason why we cannot have a real mpage_writepage() which doesn't use bh's
>  > > and employ that.
>  > > 
>  > > I coulda sworn we used to have one.
>  > 
>  > Hi Andrew,
>  > 
>  > Here is my first version of mpage_writepage() patch.
>  > I haven't handle the "confused" case yet - I need to
>  > pass a function pointer to handle it. Just for
>  > initial code review. I am still testing it.
>  > 
>  > Thanks,
>  > Badari
>  > 
>  > 
>  > diff -Narup -X dontdiff linux-2.6.10/fs/ext2/inode.c 
> linux-2.6.10.nobh/fs/ext2/inode.c
>  > --- linux-2.6.10/fs/ext2/inode.c   2004-12-24 13:33:51.000000000 -0800
> 
> [...]
> 
>  >    return ret;
>  >  }
>  > +
>  > +/*
>  > + * The generic ->writepage function for address_spaces
>  > + */
> 
> This function doesn't look generic. It only works correctly with file
> systems that store pointer to buffer head ring in page->private (at
> least temporarily), otherwise code after page_has_buffers(page) check in
> __mpage_writepage() will corrupt page->private.
> 
> Actually, this looks confusing. I thought that main idea of mpage.c is
> to get rid of buffer heads, and switch everything to bios. But looking
> at the current code it seems that buffer heads are striking back: code
> simply assumes that PG_private means "buffers in page->private", making
> mpage.c effectively useless for file systems using page->private for
> something else.

Let me put it this way, mpage.c doesn't create any new buffer heads,
but if there are already attached to a page, it can deal with them.

Yes. page->private is assumed for the bufferhead usage. Do you really
need for handling page->private for non-bufferhead usage ?

> 
> There is another reason why mpage_writepage() is a problematic choice
> for ->writepage: __mpage_writepage() calls
> page->mapping->a_ops->writepage() in "confused" case, which sounds like
> infinite recursion.

Yep. I need to fix (as mentioned earlier).

> 
> [...]
> 
>  > +  if (page->index >= end_index+1 || !offset) {
>  > +          /*
>  > +           * The page may have dirty, unmapped buffers.  For example,
>  > +           * they may have been added in ext3_writepage().  Make them
>  > +           * freeable here, so the page does not leak.
>  > +           */
>  > +          block_invalidatepage(page, 0);
> 
> Shouldn't this be
> 
>             page->mapping->a_ops->invalidatepage(page, 0)
> 
> ? To preserve external appearance of "genericity", that is. :)

I think so.

Thanks,
Badari

-
To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to