Mingming Cao <[EMAIL PROTECTED]> wrote:
>
> Here is the updated patch from Badari for delayed allocation for ext3.
> Delayed allocation defers block allocation from prepare-write time to
> page writeout time. 

For data=writeback only, yes?

> ...
> --- linux-2.6.12/fs/ext3/inode.c~ext3-delalloc        2005-07-14 
> 23:15:34.866752480 -0700
> +++ linux-2.6.12-ming/fs/ext3/inode.c 2005-07-14 23:15:34.889748984 -0700
> @@ -1340,6 +1340,9 @@ static int ext3_prepare_write(struct fil
>       handle_t *handle;
>       int retries = 0;
>  
> +
> +     if (test_opt(inode->i_sb, DELAYED_ALLOC))
> +             return __nobh_prepare_write(page, from, to, ext3_get_block, 0);

Rather than performing this test on each ->prepare_write(), would it not be
better to set up a new set of address_space_operations for this mode?

__nobh_prepare_write() seems like a poor choice of name?

>  retry:
>       handle = ext3_journal_start(inode, needed_blocks);
>       if (IS_ERR(handle)) {
> @@ -1439,6 +1442,9 @@ static int ext3_writeback_commit_write(s
>       else
>               ret = generic_commit_write(file, page, from, to);
>  
> +     if (test_opt(inode->i_sb, DELAYED_ALLOC))
> +             return ret;
> +

Here too, perhaps.

> +             }
> +     }
>       /*
>        * The journal_load will have done any necessary log recovery,
>        * so we can safely mount the rest of the filesystem now.
> diff -puN fs/buffer.c~ext3-delalloc fs/buffer.c
> --- linux-2.6.12/fs/buffer.c~ext3-delalloc    2005-07-14 23:15:34.875751112 
> -0700
> +++ linux-2.6.12-ming/fs/buffer.c     2005-07-14 23:15:34.903746856 -0700
> @@ -2337,8 +2337,8 @@ static void end_buffer_read_nobh(struct 
>   * On entry, the page is fully not uptodate.
>   * On exit the page is fully uptodate in the areas outside (from,to)
>   */
> -int nobh_prepare_write(struct page *page, unsigned from, unsigned to,
> -                     get_block_t *get_block)
> +int __nobh_prepare_write(struct page *page, unsigned from, unsigned to,
> +                     get_block_t *get_block, int create)

Suggest you make this static and update the comment.

>  {
>       struct inode *inode = page->mapping->host;
>       const unsigned blkbits = inode->i_blkbits;
> @@ -2370,10 +2370,8 @@ int nobh_prepare_write(struct page *page
>                 block_start < PAGE_CACHE_SIZE;
>                 block_in_page++, block_start += blocksize) {
>               unsigned block_end = block_start + blocksize;
> -             int create;
>  
>               map_bh.b_state = 0;
> -             create = 1;
>               if (block_start >= to)
>                       create = 0;
>               ret = get_block(inode, block_in_file + block_in_page,

What's going on here?  Seems that we'll call get_block() with `create=0'. 
Is there any point in doing that?  For delayed allocation we shuld be able
to skip get_block() altogether here and, err, delay it.

> +int nobh_prepare_write(struct page *page, unsigned from, unsigned
> +                             get_block_t *get_block)
> +{
> +     return __nobh_prepare_write(page, from, to, get_block, 1);
> +}
> +
> EXPORT_SYMBOL(nobh_prepare_write);

Here you add nobh_dalloc_prepare_write() and remember to export it to
modules this time ;)
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to