Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 155911
b: refs/heads/master
c: 4a8c9a6
h: refs/heads/master
i:
  155909: 6e28c2a
  155907: cc07e95
  155903: e1d4567
v: v3
  • Loading branch information
Yan Zheng authored and Chris Mason committed Jul 22, 2009
1 parent 7b85786 commit 9540b93
Show file tree
Hide file tree
Showing 3 changed files with 43 additions and 38 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 33c66f430bfa3a033e70470e4c93f967156b696d
refs/heads/master: 4a8c9a62d7f7f058eed4b8a6f2c890a887778093
70 changes: 41 additions & 29 deletions trunk/fs/btrfs/extent-tree.c
Original file line number Diff line number Diff line change
Expand Up @@ -2387,13 +2387,29 @@ static int write_one_cache_group(struct btrfs_trans_handle *trans,

}

static struct btrfs_block_group_cache *
next_block_group(struct btrfs_root *root,
struct btrfs_block_group_cache *cache)
{
struct rb_node *node;
spin_lock(&root->fs_info->block_group_cache_lock);
node = rb_next(&cache->cache_node);
btrfs_put_block_group(cache);
if (node) {
cache = rb_entry(node, struct btrfs_block_group_cache,
cache_node);
atomic_inc(&cache->count);
} else
cache = NULL;
spin_unlock(&root->fs_info->block_group_cache_lock);
return cache;
}

int btrfs_write_dirty_block_groups(struct btrfs_trans_handle *trans,
struct btrfs_root *root)
{
struct btrfs_block_group_cache *cache, *entry;
struct rb_node *n;
struct btrfs_block_group_cache *cache;
int err = 0;
int werr = 0;
struct btrfs_path *path;
u64 last = 0;

Expand All @@ -2402,39 +2418,35 @@ int btrfs_write_dirty_block_groups(struct btrfs_trans_handle *trans,
return -ENOMEM;

while (1) {
cache = NULL;
spin_lock(&root->fs_info->block_group_cache_lock);
for (n = rb_first(&root->fs_info->block_group_cache_tree);
n; n = rb_next(n)) {
entry = rb_entry(n, struct btrfs_block_group_cache,
cache_node);
if (entry->dirty) {
cache = entry;
break;
}
if (last == 0) {
err = btrfs_run_delayed_refs(trans, root,
(unsigned long)-1);
BUG_ON(err);
}
spin_unlock(&root->fs_info->block_group_cache_lock);

if (!cache)
break;
cache = btrfs_lookup_first_block_group(root->fs_info, last);
while (cache) {
if (cache->dirty)
break;
cache = next_block_group(root, cache);
}
if (!cache) {
if (last == 0)
break;
last = 0;
continue;
}

cache->dirty = 0;
last += cache->key.offset;
last = cache->key.objectid + cache->key.offset;

err = write_one_cache_group(trans, root,
path, cache);
/*
* if we fail to write the cache group, we want
* to keep it marked dirty in hopes that a later
* write will work
*/
if (err) {
werr = err;
continue;
}
err = write_one_cache_group(trans, root, path, cache);
BUG_ON(err);
btrfs_put_block_group(cache);
}

btrfs_free_path(path);
return werr;
return 0;
}

int btrfs_extent_readonly(struct btrfs_root *root, u64 bytenr)
Expand Down
9 changes: 1 addition & 8 deletions trunk/fs/btrfs/transaction.c
Original file line number Diff line number Diff line change
Expand Up @@ -444,9 +444,6 @@ static int update_cowonly_root(struct btrfs_trans_handle *trans,

btrfs_write_dirty_block_groups(trans, root);

ret = btrfs_run_delayed_refs(trans, root, (unsigned long)-1);
BUG_ON(ret);

while (1) {
old_root_bytenr = btrfs_root_bytenr(&root->root_item);
if (old_root_bytenr == root->node->start)
Expand All @@ -457,9 +454,8 @@ static int update_cowonly_root(struct btrfs_trans_handle *trans,
&root->root_key,
&root->root_item);
BUG_ON(ret);
btrfs_write_dirty_block_groups(trans, root);

ret = btrfs_run_delayed_refs(trans, root, (unsigned long)-1);
ret = btrfs_write_dirty_block_groups(trans, root);
BUG_ON(ret);
}
free_extent_buffer(root->commit_root);
Expand Down Expand Up @@ -495,9 +491,6 @@ static noinline int commit_cowonly_roots(struct btrfs_trans_handle *trans,
root = list_entry(next, struct btrfs_root, dirty_list);

update_cowonly_root(trans, root);

ret = btrfs_run_delayed_refs(trans, root, (unsigned long)-1);
BUG_ON(ret);
}
return 0;
}
Expand Down

0 comments on commit 9540b93

Please sign in to comment.