From: Mingming Cao <cmm@us.ibm.com>
To: "Aneesh Kumar K.V" <aneesh.kumar@linux.vnet.ibm.com>
Cc: Theodore Tso <tytso@mit.edu>,
sandeen@redhat.com, linux-ext4@vger.kernel.org
Subject: Re: [PATCH -v2] ext4: Use inode preallocation with -o noextents
Date: Thu, 05 Jun 2008 07:55:41 -0700 [thread overview]
Message-ID: <1212677741.3645.44.camel@localhost.localdomain> (raw)
In-Reply-To: <20080605084329.GB8942@skywalker>
On Thu, 2008-06-05 at 14:13 +0530, Aneesh Kumar K.V wrote:
> On Wed, Jun 04, 2008 at 11:22:20PM -0400, Theodore Tso wrote:
> > when I moved this patch to the beginning of the unstable patch queue,
> > it didn't apply. When I tried to look at it, my head started
> > spinning. The patch applied to the wrong function, apparently,
> > because there is so much code duplication "patch" got confused. I
> > can't blame it, though, because *I* got confused.
> >
> > fs/ext4/balloc.c is a complete disaster right now. We have:
> >
> > ext4_new_blocks_old()
> > ext4_new_meta_block()
> > ext4_new_meta_blocks()
> > ext4_new_blocks()
> >
> > ... and without any comments, it is extremely impenetrable. Someone
> > needs to document what the heck all of the various functions have to
> > do with each other, when they get used (i.e., with which mount options).
> >
One more thing, I feel we should clean up inode.c, move the functions
related to non extent file allocation from inode.c into balloc.c, and
try to keep balloc.c the single file to handle allocation for non extent
files.
> > Why aren't we factoring out the last three into a single function?
>
> Something like below ? . I will send a final patch once I get the
> patchqueu updated. I am not able to reach repo.or.cz currently.
>
looks good, a few comment
> diff --git a/fs/ext4/balloc.c b/fs/ext4/balloc.c
> index bd18ceb..abbc500 100644
> --- a/fs/ext4/balloc.c
> +++ b/fs/ext4/balloc.c
> @@ -1656,7 +1656,7 @@ int ext4_should_retry_alloc(struct super_block *sb, int *retries)
> }
>
> /**
> - * ext4_new_blocks_old() -- core block(s) allocation function
> + * ext4_orlov_new_blocks() -- core block(s) allocation function
what is orlov means? this is core function for non extent based without
mballoc block allocation, right?
> * @handle: handle to this transaction
> * @inode: file inode
> * @goal: given target block(filesystem wide)
> @@ -1669,7 +1669,7 @@ int ext4_should_retry_alloc(struct super_block *sb, int *retries)
> * any specific goal block.
> *
> */
> -ext4_fsblk_t ext4_new_blocks_old(handle_t *handle, struct inode *inode,
> +ext4_fsblk_t ext4_orlov_new_blocks(handle_t *handle, struct inode *inode,
> ext4_fsblk_t goal, unsigned long *count, int *errp)
> {
> struct buffer_head *bitmap_bh = NULL;
> @@ -1942,88 +1942,68 @@ ext4_fsblk_t ext4_new_blocks_old(handle_t *handle, struct inode *inode,
> return 0;
> }
>
> -ext4_fsblk_t ext4_new_meta_block(handle_t *handle, struct inode *inode,
> - ext4_fsblk_t goal, int *errp)
> +static ext4_fsblk_t do_blk_alloc(handle_t *handle, struct inode *inode,
> + ext4_lblk_t iblock, ext4_fsblk_t goal,
> + unsigned long *count, int *errp, int meta)
> {
> struct ext4_allocation_request ar;
> ext4_fsblk_t ret;
>
> if (!test_opt(inode->i_sb, MBALLOC)) {
> - unsigned long count = 1;
> - ret = ext4_new_blocks_old(handle, inode, goal, &count, errp);
> + ret = ext4_orlov_new_blocks(handle, inode, goal, count, errp);
> return ret;
> }
>
> memset(&ar, 0, sizeof(ar));
> + /* Fill with neighbour allocated blocks */
> + ar.lleft = 0;
> + ar.pleft = 0;
> + ar.lright = 0;
> + ar.pright = 0;
> +
> ar.inode = inode;
> ar.goal = goal;
> - ar.len = 1;
> + ar.len = *count;
> + ar.logical = iblock;
> + if (S_ISREG(inode->i_mode) && !meta)
> + ar.flags = EXT4_MB_HINT_DATA;
> + else
> + /* disable in-core preallocation for non-regular files */
> + ar.flags = 0;
> ret = ext4_mb_new_blocks(handle, &ar, errp);
> + *count = ar.len;
> /*
> * Account for the allocated meta blocks
> */
> - if (!(*errp)) {
> + if (!(*errp) && meta) {
> spin_lock(&EXT4_I(inode)->i_block_reservation_lock);
> EXT4_I(inode)->i_allocated_meta_blocks += ar.len;
> spin_unlock(&EXT4_I(inode)->i_block_reservation_lock);
> }
> -
> return ret;
> }
> +
> +
> +ext4_fsblk_t ext4_new_meta_block(handle_t *handle, struct inode *inode,
> + ext4_fsblk_t goal, int *errp)
> +{
> + unsigned long count = 1;
> + return do_blk_alloc(handle, inode, 0, goal, &count, errp, 1);
> +}
> +
> ext4_fsblk_t ext4_new_meta_blocks(handle_t *handle, struct inode *inode,
> ext4_fsblk_t goal, unsigned long *count, int *errp)
> {
> - struct ext4_allocation_request ar;
> - ext4_fsblk_t ret;
> -
> - if (!test_opt(inode->i_sb, MBALLOC)) {
> - ret = ext4_new_blocks_old(handle, inode, goal, count, errp);
> - return ret;
> - }
> -
> - memset(&ar, 0, sizeof(ar));
> - ar.inode = inode;
> - ar.goal = goal;
> - ar.len = *count;
> - ret = ext4_mb_new_blocks(handle, &ar, errp);
> - *count = ar.len;
> - return ret;
> + return do_blk_alloc(handle, inode, 0, goal, count, errp, 1);
> }
>
> ext4_fsblk_t ext4_new_blocks(handle_t *handle, struct inode *inode,
> ext4_lblk_t iblock, ext4_fsblk_t goal,
> unsigned long *count, int *errp)
> {
> - struct ext4_allocation_request ar;
> - ext4_fsblk_t ret;
> -
> - if (!test_opt(inode->i_sb, MBALLOC)) {
> - ret = ext4_new_blocks_old(handle, inode, goal, count, errp);
> - return ret;
> - }
> -
> - memset(&ar, 0, sizeof(ar));
> - /* Fill with neighbour allocated blocks */
> - ar.lleft = 0;
> - ar.pleft = 0;
> - ar.lright = 0;
> - ar.pright = 0;
> -
> - ar.inode = inode;
> - ar.goal = goal;
> - ar.len = *count;
> - ar.logical = iblock;
> - if (S_ISREG(inode->i_mode))
> - ar.flags = EXT4_MB_HINT_DATA;
> - else
> - /* disable in-core preallocation for non-regular files */
> - ar.flags = 0;
> - ret = ext4_mb_new_blocks(handle, &ar, errp);
> - *count = ar.len;
> - return ret;
> + return do_blk_alloc(handle, inode, iblock, goal, count, errp, 0);
> }
>
> -
> /**
> * ext4_count_free_blocks() -- count filesystem free blocks
> * @sb: superblock
> diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h
> index 19d48dd..c401253 100644
> --- a/fs/ext4/ext4.h
> +++ b/fs/ext4/ext4.h
> @@ -1049,7 +1049,7 @@ extern ext4_fsblk_t ext4_new_meta_blocks(handle_t *handle, struct inode *inode,
> extern ext4_fsblk_t ext4_new_blocks(handle_t *handle, struct inode *inode,
> ext4_lblk_t iblock, ext4_fsblk_t goal,
> unsigned long *count, int *errp);
> -extern ext4_fsblk_t ext4_new_blocks_old(handle_t *handle, struct inode *inode,
> +extern ext4_fsblk_t ext4_orlov_new_blocks(handle_t *handle, struct inode *inode,
> ext4_fsblk_t goal, unsigned long *count, int *errp);
> extern ext4_fsblk_t ext4_has_free_blocks(struct ext4_sb_info *sbi,
> ext4_fsblk_t nblocks);
> diff --git a/fs/ext4/mballoc.c b/fs/ext4/mballoc.c
> index 09922ae..a810a21 100644
> --- a/fs/ext4/mballoc.c
> +++ b/fs/ext4/mballoc.c
> @@ -4048,7 +4048,7 @@ ext4_fsblk_t ext4_mb_new_blocks(handle_t *handle,
> sbi = EXT4_SB(sb);
>
> if (!test_opt(sb, MBALLOC)) {
> - block = ext4_new_blocks_old(handle, ar->inode, ar->goal,
> + block = ext4_orlov_new_blocks(handle, ar->inode, ar->goal,
> &(ar->len), errp);
> return block;
> }
when we get to ext4_mb_new_blocks, don't we already tested MBALLOC is
turned on?
next prev parent reply other threads:[~2008-06-05 14:55 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-05-19 20:34 [PATCH -v2] ext4: Use inode preallocation with -o noextents Aneesh Kumar K.V
2008-06-04 2:23 ` Theodore Tso
2008-06-04 4:01 ` Aneesh Kumar K.V
2008-06-05 3:22 ` Theodore Tso
2008-06-05 8:43 ` Aneesh Kumar K.V
2008-06-05 14:55 ` Mingming Cao [this message]
2008-06-05 18:24 ` Andreas Dilger
2008-06-05 18:46 ` Aneesh Kumar K.V
2008-06-06 21:33 ` Mingming Cao
2008-06-11 3:26 ` Shen Feng
2008-06-12 9:34 ` Andreas Dilger
2008-06-12 13:41 ` Eric Sandeen
2008-06-11 3:44 ` Shen Feng
2008-06-16 3:41 ` Shen Feng
2008-06-17 9:42 ` Shen Feng
2008-06-17 10:48 ` Aneesh Kumar K.V
2008-06-18 1:43 ` Shen Feng
2008-06-05 15:37 ` Theodore Tso
2008-06-05 18:28 ` Andreas Dilger
2008-06-05 19:12 ` Aneesh Kumar K.V
2008-06-05 20:58 ` Andreas Dilger
2008-06-06 16:26 ` Aneesh Kumar K.V
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=1212677741.3645.44.camel@localhost.localdomain \
--to=cmm@us.ibm.com \
--cc=aneesh.kumar@linux.vnet.ibm.com \
--cc=linux-ext4@vger.kernel.org \
--cc=sandeen@redhat.com \
--cc=tytso@mit.edu \
/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;
as well as URLs for NNTP newsgroup(s).