On Tue, Apr 12, 2011 at 09:33:03AM +0800, liubo wrote: > On 04/12/2011 08:30 AM, Josef Bacik wrote: > > Everytime we try to allocate disk space we try and see if we can > > pre-emptively > > allocate a chunk, but in the common case we don't allocate anything, so > > there is > > no sense in taking the chunk_mutex at all. So instead if we are allocating > > a > > chunk, mark it in the space_info so we don't get two people trying to > > allocate > > at the same time. Thanks, > > > > Signed-off-by: Josef Bacik <jo...@redhat.com> > > --- > > fs/btrfs/ctree.h | 5 +++-- > > fs/btrfs/extent-tree.c | 24 ++++++++++++++++++++++-- > > 2 files changed, 25 insertions(+), 4 deletions(-) > > > > diff --git a/fs/btrfs/ctree.h b/fs/btrfs/ctree.h > > index 0d00a07..a566780 100644 > > --- a/fs/btrfs/ctree.h > > +++ b/fs/btrfs/ctree.h > > @@ -740,10 +740,11 @@ struct btrfs_space_info { > > */ > > unsigned long reservation_progress; > > > > - int full; /* indicates that we cannot allocate any more > > + int full:1; /* indicates that we cannot allocate any more > > chunks for this space */ > > - int force_alloc; /* set if we need to force a chunk alloc for > > + int force_alloc:1; /* set if we need to force a chunk alloc for > > this space */ > > + int chunk_alloc:1; /* set if we are allocating a chunk */ > > > > struct list_head list; > > > > diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c > > index f619c3c..80c048f 100644 > > --- a/fs/btrfs/extent-tree.c > > +++ b/fs/btrfs/extent-tree.c > > @@ -3020,6 +3020,7 @@ static int update_space_info(struct btrfs_fs_info > > *info, u64 flags, > > found->bytes_may_use = 0; > > found->full = 0; > > found->force_alloc = 0; > > + found->chunk_alloc = 0; > > *space_info = found; > > list_add_rcu(&found->list, &info->space_info); > > atomic_set(&found->caching_threads, 0); > > @@ -3273,10 +3274,9 @@ static int do_chunk_alloc(struct btrfs_trans_handle > > *trans, > > { > > struct btrfs_space_info *space_info; > > struct btrfs_fs_info *fs_info = extent_root->fs_info; > > + int wait_for_alloc = 0; > > int ret = 0; > > > > - mutex_lock(&fs_info->chunk_mutex); > > - > > flags = btrfs_reduce_alloc_profile(extent_root, flags); > > > > space_info = __find_space_info(extent_root->fs_info, flags); > > @@ -3287,6 +3287,7 @@ static int do_chunk_alloc(struct btrfs_trans_handle > > *trans, > > } > > BUG_ON(!space_info); > > > > +again: > > spin_lock(&space_info->lock); > > if (space_info->force_alloc) > > force = 1; > > @@ -3299,9 +3300,27 @@ static int do_chunk_alloc(struct btrfs_trans_handle > > *trans, > > alloc_bytes)) { > > spin_unlock(&space_info->lock); > > goto out; > > hmm, the "goto" will lead to problems, cause in "out" clause there is a > mutex_unlock(), which > we do not have a mutex_lock yet. >
Hrm I wonder why xfstests didn't trip over that, thats what I get for patching while watching the kid. Thanks, Josef -- To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html