diff options
author | David S. Miller <davem@davemloft.net> | 2011-06-21 01:29:08 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2011-06-21 01:29:08 -0400 |
commit | 9f6ec8d697c08963d83880ccd35c13c5ace716ea (patch) | |
tree | ad8d93cf6fcdd09b86ade09f5fcbbc66cdb1cca2 /fs/btrfs/disk-io.c | |
parent | 4aa3a715551c93eda32d79bd52042ce500bd5383 (diff) | |
parent | 56299378726d5f2ba8d3c8cbbd13cb280ba45e4f (diff) |
Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6
Conflicts:
drivers/net/wireless/iwlwifi/iwl-agn-rxon.c
drivers/net/wireless/rtlwifi/pci.c
net/netfilter/ipvs/ip_vs_core.c
Diffstat (limited to 'fs/btrfs/disk-io.c')
-rw-r--r-- | fs/btrfs/disk-io.c | 53 |
1 files changed, 26 insertions, 27 deletions
diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c index 98b6a71decba..1ac8db5dc0a3 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c | |||
@@ -1044,7 +1044,6 @@ static int __setup_root(u32 nodesize, u32 leafsize, u32 sectorsize, | |||
1044 | root->last_trans = 0; | 1044 | root->last_trans = 0; |
1045 | root->highest_objectid = 0; | 1045 | root->highest_objectid = 0; |
1046 | root->name = NULL; | 1046 | root->name = NULL; |
1047 | root->in_sysfs = 0; | ||
1048 | root->inode_tree = RB_ROOT; | 1047 | root->inode_tree = RB_ROOT; |
1049 | INIT_RADIX_TREE(&root->delayed_nodes_tree, GFP_ATOMIC); | 1048 | INIT_RADIX_TREE(&root->delayed_nodes_tree, GFP_ATOMIC); |
1050 | root->block_rsv = NULL; | 1049 | root->block_rsv = NULL; |
@@ -1300,19 +1299,21 @@ again: | |||
1300 | return root; | 1299 | return root; |
1301 | 1300 | ||
1302 | root->free_ino_ctl = kzalloc(sizeof(*root->free_ino_ctl), GFP_NOFS); | 1301 | root->free_ino_ctl = kzalloc(sizeof(*root->free_ino_ctl), GFP_NOFS); |
1303 | if (!root->free_ino_ctl) | ||
1304 | goto fail; | ||
1305 | root->free_ino_pinned = kzalloc(sizeof(*root->free_ino_pinned), | 1302 | root->free_ino_pinned = kzalloc(sizeof(*root->free_ino_pinned), |
1306 | GFP_NOFS); | 1303 | GFP_NOFS); |
1307 | if (!root->free_ino_pinned) | 1304 | if (!root->free_ino_pinned || !root->free_ino_ctl) { |
1305 | ret = -ENOMEM; | ||
1308 | goto fail; | 1306 | goto fail; |
1307 | } | ||
1309 | 1308 | ||
1310 | btrfs_init_free_ino_ctl(root); | 1309 | btrfs_init_free_ino_ctl(root); |
1311 | mutex_init(&root->fs_commit_mutex); | 1310 | mutex_init(&root->fs_commit_mutex); |
1312 | spin_lock_init(&root->cache_lock); | 1311 | spin_lock_init(&root->cache_lock); |
1313 | init_waitqueue_head(&root->cache_wait); | 1312 | init_waitqueue_head(&root->cache_wait); |
1314 | 1313 | ||
1315 | set_anon_super(&root->anon_super, NULL); | 1314 | ret = set_anon_super(&root->anon_super, NULL); |
1315 | if (ret) | ||
1316 | goto fail; | ||
1316 | 1317 | ||
1317 | if (btrfs_root_refs(&root->root_item) == 0) { | 1318 | if (btrfs_root_refs(&root->root_item) == 0) { |
1318 | ret = -ENOENT; | 1319 | ret = -ENOENT; |
@@ -1505,24 +1506,24 @@ static int transaction_kthread(void *arg) | |||
1505 | vfs_check_frozen(root->fs_info->sb, SB_FREEZE_WRITE); | 1506 | vfs_check_frozen(root->fs_info->sb, SB_FREEZE_WRITE); |
1506 | mutex_lock(&root->fs_info->transaction_kthread_mutex); | 1507 | mutex_lock(&root->fs_info->transaction_kthread_mutex); |
1507 | 1508 | ||
1508 | spin_lock(&root->fs_info->new_trans_lock); | 1509 | spin_lock(&root->fs_info->trans_lock); |
1509 | cur = root->fs_info->running_transaction; | 1510 | cur = root->fs_info->running_transaction; |
1510 | if (!cur) { | 1511 | if (!cur) { |
1511 | spin_unlock(&root->fs_info->new_trans_lock); | 1512 | spin_unlock(&root->fs_info->trans_lock); |
1512 | goto sleep; | 1513 | goto sleep; |
1513 | } | 1514 | } |
1514 | 1515 | ||
1515 | now = get_seconds(); | 1516 | now = get_seconds(); |
1516 | if (!cur->blocked && | 1517 | if (!cur->blocked && |
1517 | (now < cur->start_time || now - cur->start_time < 30)) { | 1518 | (now < cur->start_time || now - cur->start_time < 30)) { |
1518 | spin_unlock(&root->fs_info->new_trans_lock); | 1519 | spin_unlock(&root->fs_info->trans_lock); |
1519 | delay = HZ * 5; | 1520 | delay = HZ * 5; |
1520 | goto sleep; | 1521 | goto sleep; |
1521 | } | 1522 | } |
1522 | transid = cur->transid; | 1523 | transid = cur->transid; |
1523 | spin_unlock(&root->fs_info->new_trans_lock); | 1524 | spin_unlock(&root->fs_info->trans_lock); |
1524 | 1525 | ||
1525 | trans = btrfs_join_transaction(root, 1); | 1526 | trans = btrfs_join_transaction(root); |
1526 | BUG_ON(IS_ERR(trans)); | 1527 | BUG_ON(IS_ERR(trans)); |
1527 | if (transid == trans->transid) { | 1528 | if (transid == trans->transid) { |
1528 | ret = btrfs_commit_transaction(trans, root); | 1529 | ret = btrfs_commit_transaction(trans, root); |
@@ -1613,11 +1614,12 @@ struct btrfs_root *open_ctree(struct super_block *sb, | |||
1613 | INIT_LIST_HEAD(&fs_info->ordered_operations); | 1614 | INIT_LIST_HEAD(&fs_info->ordered_operations); |
1614 | INIT_LIST_HEAD(&fs_info->caching_block_groups); | 1615 | INIT_LIST_HEAD(&fs_info->caching_block_groups); |
1615 | spin_lock_init(&fs_info->delalloc_lock); | 1616 | spin_lock_init(&fs_info->delalloc_lock); |
1616 | spin_lock_init(&fs_info->new_trans_lock); | 1617 | spin_lock_init(&fs_info->trans_lock); |
1617 | spin_lock_init(&fs_info->ref_cache_lock); | 1618 | spin_lock_init(&fs_info->ref_cache_lock); |
1618 | spin_lock_init(&fs_info->fs_roots_radix_lock); | 1619 | spin_lock_init(&fs_info->fs_roots_radix_lock); |
1619 | spin_lock_init(&fs_info->delayed_iput_lock); | 1620 | spin_lock_init(&fs_info->delayed_iput_lock); |
1620 | spin_lock_init(&fs_info->defrag_inodes_lock); | 1621 | spin_lock_init(&fs_info->defrag_inodes_lock); |
1622 | mutex_init(&fs_info->reloc_mutex); | ||
1621 | 1623 | ||
1622 | init_completion(&fs_info->kobj_unregister); | 1624 | init_completion(&fs_info->kobj_unregister); |
1623 | fs_info->tree_root = tree_root; | 1625 | fs_info->tree_root = tree_root; |
@@ -1645,6 +1647,7 @@ struct btrfs_root *open_ctree(struct super_block *sb, | |||
1645 | fs_info->max_inline = 8192 * 1024; | 1647 | fs_info->max_inline = 8192 * 1024; |
1646 | fs_info->metadata_ratio = 0; | 1648 | fs_info->metadata_ratio = 0; |
1647 | fs_info->defrag_inodes = RB_ROOT; | 1649 | fs_info->defrag_inodes = RB_ROOT; |
1650 | fs_info->trans_no_join = 0; | ||
1648 | 1651 | ||
1649 | fs_info->thread_pool_size = min_t(unsigned long, | 1652 | fs_info->thread_pool_size = min_t(unsigned long, |
1650 | num_online_cpus() + 2, 8); | 1653 | num_online_cpus() + 2, 8); |
@@ -1667,8 +1670,6 @@ struct btrfs_root *open_ctree(struct super_block *sb, | |||
1667 | init_waitqueue_head(&fs_info->scrub_pause_wait); | 1670 | init_waitqueue_head(&fs_info->scrub_pause_wait); |
1668 | init_rwsem(&fs_info->scrub_super_lock); | 1671 | init_rwsem(&fs_info->scrub_super_lock); |
1669 | fs_info->scrub_workers_refcnt = 0; | 1672 | fs_info->scrub_workers_refcnt = 0; |
1670 | btrfs_init_workers(&fs_info->scrub_workers, "scrub", | ||
1671 | fs_info->thread_pool_size, &fs_info->generic_worker); | ||
1672 | 1673 | ||
1673 | sb->s_blocksize = 4096; | 1674 | sb->s_blocksize = 4096; |
1674 | sb->s_blocksize_bits = blksize_bits(4096); | 1675 | sb->s_blocksize_bits = blksize_bits(4096); |
@@ -1709,7 +1710,6 @@ struct btrfs_root *open_ctree(struct super_block *sb, | |||
1709 | fs_info->do_barriers = 1; | 1710 | fs_info->do_barriers = 1; |
1710 | 1711 | ||
1711 | 1712 | ||
1712 | mutex_init(&fs_info->trans_mutex); | ||
1713 | mutex_init(&fs_info->ordered_operations_mutex); | 1713 | mutex_init(&fs_info->ordered_operations_mutex); |
1714 | mutex_init(&fs_info->tree_log_mutex); | 1714 | mutex_init(&fs_info->tree_log_mutex); |
1715 | mutex_init(&fs_info->chunk_mutex); | 1715 | mutex_init(&fs_info->chunk_mutex); |
@@ -2479,13 +2479,13 @@ int btrfs_commit_super(struct btrfs_root *root) | |||
2479 | down_write(&root->fs_info->cleanup_work_sem); | 2479 | down_write(&root->fs_info->cleanup_work_sem); |
2480 | up_write(&root->fs_info->cleanup_work_sem); | 2480 | up_write(&root->fs_info->cleanup_work_sem); |
2481 | 2481 | ||
2482 | trans = btrfs_join_transaction(root, 1); | 2482 | trans = btrfs_join_transaction(root); |
2483 | if (IS_ERR(trans)) | 2483 | if (IS_ERR(trans)) |
2484 | return PTR_ERR(trans); | 2484 | return PTR_ERR(trans); |
2485 | ret = btrfs_commit_transaction(trans, root); | 2485 | ret = btrfs_commit_transaction(trans, root); |
2486 | BUG_ON(ret); | 2486 | BUG_ON(ret); |
2487 | /* run commit again to drop the original snapshot */ | 2487 | /* run commit again to drop the original snapshot */ |
2488 | trans = btrfs_join_transaction(root, 1); | 2488 | trans = btrfs_join_transaction(root); |
2489 | if (IS_ERR(trans)) | 2489 | if (IS_ERR(trans)) |
2490 | return PTR_ERR(trans); | 2490 | return PTR_ERR(trans); |
2491 | btrfs_commit_transaction(trans, root); | 2491 | btrfs_commit_transaction(trans, root); |
@@ -2911,9 +2911,8 @@ static int btrfs_destroy_delalloc_inodes(struct btrfs_root *root) | |||
2911 | 2911 | ||
2912 | INIT_LIST_HEAD(&splice); | 2912 | INIT_LIST_HEAD(&splice); |
2913 | 2913 | ||
2914 | list_splice_init(&root->fs_info->delalloc_inodes, &splice); | ||
2915 | |||
2916 | spin_lock(&root->fs_info->delalloc_lock); | 2914 | spin_lock(&root->fs_info->delalloc_lock); |
2915 | list_splice_init(&root->fs_info->delalloc_inodes, &splice); | ||
2917 | 2916 | ||
2918 | while (!list_empty(&splice)) { | 2917 | while (!list_empty(&splice)) { |
2919 | btrfs_inode = list_entry(splice.next, struct btrfs_inode, | 2918 | btrfs_inode = list_entry(splice.next, struct btrfs_inode, |
@@ -3024,10 +3023,13 @@ static int btrfs_cleanup_transaction(struct btrfs_root *root) | |||
3024 | 3023 | ||
3025 | WARN_ON(1); | 3024 | WARN_ON(1); |
3026 | 3025 | ||
3027 | mutex_lock(&root->fs_info->trans_mutex); | ||
3028 | mutex_lock(&root->fs_info->transaction_kthread_mutex); | 3026 | mutex_lock(&root->fs_info->transaction_kthread_mutex); |
3029 | 3027 | ||
3028 | spin_lock(&root->fs_info->trans_lock); | ||
3030 | list_splice_init(&root->fs_info->trans_list, &list); | 3029 | list_splice_init(&root->fs_info->trans_list, &list); |
3030 | root->fs_info->trans_no_join = 1; | ||
3031 | spin_unlock(&root->fs_info->trans_lock); | ||
3032 | |||
3031 | while (!list_empty(&list)) { | 3033 | while (!list_empty(&list)) { |
3032 | t = list_entry(list.next, struct btrfs_transaction, list); | 3034 | t = list_entry(list.next, struct btrfs_transaction, list); |
3033 | if (!t) | 3035 | if (!t) |
@@ -3052,23 +3054,18 @@ static int btrfs_cleanup_transaction(struct btrfs_root *root) | |||
3052 | t->blocked = 0; | 3054 | t->blocked = 0; |
3053 | if (waitqueue_active(&root->fs_info->transaction_wait)) | 3055 | if (waitqueue_active(&root->fs_info->transaction_wait)) |
3054 | wake_up(&root->fs_info->transaction_wait); | 3056 | wake_up(&root->fs_info->transaction_wait); |
3055 | mutex_unlock(&root->fs_info->trans_mutex); | ||
3056 | 3057 | ||
3057 | mutex_lock(&root->fs_info->trans_mutex); | ||
3058 | t->commit_done = 1; | 3058 | t->commit_done = 1; |
3059 | if (waitqueue_active(&t->commit_wait)) | 3059 | if (waitqueue_active(&t->commit_wait)) |
3060 | wake_up(&t->commit_wait); | 3060 | wake_up(&t->commit_wait); |
3061 | mutex_unlock(&root->fs_info->trans_mutex); | ||
3062 | |||
3063 | mutex_lock(&root->fs_info->trans_mutex); | ||
3064 | 3061 | ||
3065 | btrfs_destroy_pending_snapshots(t); | 3062 | btrfs_destroy_pending_snapshots(t); |
3066 | 3063 | ||
3067 | btrfs_destroy_delalloc_inodes(root); | 3064 | btrfs_destroy_delalloc_inodes(root); |
3068 | 3065 | ||
3069 | spin_lock(&root->fs_info->new_trans_lock); | 3066 | spin_lock(&root->fs_info->trans_lock); |
3070 | root->fs_info->running_transaction = NULL; | 3067 | root->fs_info->running_transaction = NULL; |
3071 | spin_unlock(&root->fs_info->new_trans_lock); | 3068 | spin_unlock(&root->fs_info->trans_lock); |
3072 | 3069 | ||
3073 | btrfs_destroy_marked_extents(root, &t->dirty_pages, | 3070 | btrfs_destroy_marked_extents(root, &t->dirty_pages, |
3074 | EXTENT_DIRTY); | 3071 | EXTENT_DIRTY); |
@@ -3082,8 +3079,10 @@ static int btrfs_cleanup_transaction(struct btrfs_root *root) | |||
3082 | kmem_cache_free(btrfs_transaction_cachep, t); | 3079 | kmem_cache_free(btrfs_transaction_cachep, t); |
3083 | } | 3080 | } |
3084 | 3081 | ||
3082 | spin_lock(&root->fs_info->trans_lock); | ||
3083 | root->fs_info->trans_no_join = 0; | ||
3084 | spin_unlock(&root->fs_info->trans_lock); | ||
3085 | mutex_unlock(&root->fs_info->transaction_kthread_mutex); | 3085 | mutex_unlock(&root->fs_info->transaction_kthread_mutex); |
3086 | mutex_unlock(&root->fs_info->trans_mutex); | ||
3087 | 3086 | ||
3088 | return 0; | 3087 | return 0; |
3089 | } | 3088 | } |