diff options
-rw-r--r-- | fs/btrfs/btrfs_inode.h | 3 | ||||
-rw-r--r-- | fs/btrfs/ctree.c | 28 | ||||
-rw-r--r-- | fs/btrfs/ctree.h | 12 | ||||
-rw-r--r-- | fs/btrfs/delayed-inode.c | 5 | ||||
-rw-r--r-- | fs/btrfs/disk-io.c | 36 | ||||
-rw-r--r-- | fs/btrfs/extent-tree.c | 100 | ||||
-rw-r--r-- | fs/btrfs/extent_io.c | 2 | ||||
-rw-r--r-- | fs/btrfs/file.c | 4 | ||||
-rw-r--r-- | fs/btrfs/free-space-cache.c | 27 | ||||
-rw-r--r-- | fs/btrfs/inode.c | 258 | ||||
-rw-r--r-- | fs/btrfs/ioctl.c | 19 | ||||
-rw-r--r-- | fs/btrfs/relocation.c | 34 | ||||
-rw-r--r-- | fs/btrfs/transaction.c | 300 | ||||
-rw-r--r-- | fs/btrfs/transaction.h | 29 | ||||
-rw-r--r-- | fs/btrfs/xattr.c | 2 |
15 files changed, 474 insertions, 385 deletions
diff --git a/fs/btrfs/btrfs_inode.h b/fs/btrfs/btrfs_inode.h index 93b1aa932014..52d7eca8c7bf 100644 --- a/fs/btrfs/btrfs_inode.h +++ b/fs/btrfs/btrfs_inode.h | |||
@@ -121,9 +121,6 @@ struct btrfs_inode { | |||
121 | */ | 121 | */ |
122 | u64 index_cnt; | 122 | u64 index_cnt; |
123 | 123 | ||
124 | /* the start of block group preferred for allocations. */ | ||
125 | u64 block_group; | ||
126 | |||
127 | /* the fsync log has some corner cases that mean we have to check | 124 | /* the fsync log has some corner cases that mean we have to check |
128 | * directories to see if any unlinks have been done before | 125 | * directories to see if any unlinks have been done before |
129 | * the directory was logged. See tree-log.c for all the | 126 | * the directory was logged. See tree-log.c for all the |
diff --git a/fs/btrfs/ctree.c b/fs/btrfs/ctree.c index b0e18d986e0a..d84089349c82 100644 --- a/fs/btrfs/ctree.c +++ b/fs/btrfs/ctree.c | |||
@@ -43,8 +43,6 @@ struct btrfs_path *btrfs_alloc_path(void) | |||
43 | { | 43 | { |
44 | struct btrfs_path *path; | 44 | struct btrfs_path *path; |
45 | path = kmem_cache_zalloc(btrfs_path_cachep, GFP_NOFS); | 45 | path = kmem_cache_zalloc(btrfs_path_cachep, GFP_NOFS); |
46 | if (path) | ||
47 | path->reada = 1; | ||
48 | return path; | 46 | return path; |
49 | } | 47 | } |
50 | 48 | ||
@@ -1224,6 +1222,7 @@ static void reada_for_search(struct btrfs_root *root, | |||
1224 | u64 search; | 1222 | u64 search; |
1225 | u64 target; | 1223 | u64 target; |
1226 | u64 nread = 0; | 1224 | u64 nread = 0; |
1225 | u64 gen; | ||
1227 | int direction = path->reada; | 1226 | int direction = path->reada; |
1228 | struct extent_buffer *eb; | 1227 | struct extent_buffer *eb; |
1229 | u32 nr; | 1228 | u32 nr; |
@@ -1251,6 +1250,15 @@ static void reada_for_search(struct btrfs_root *root, | |||
1251 | nritems = btrfs_header_nritems(node); | 1250 | nritems = btrfs_header_nritems(node); |
1252 | nr = slot; | 1251 | nr = slot; |
1253 | while (1) { | 1252 | while (1) { |
1253 | if (!node->map_token) { | ||
1254 | unsigned long offset = btrfs_node_key_ptr_offset(nr); | ||
1255 | map_private_extent_buffer(node, offset, | ||
1256 | sizeof(struct btrfs_key_ptr), | ||
1257 | &node->map_token, | ||
1258 | &node->kaddr, | ||
1259 | &node->map_start, | ||
1260 | &node->map_len, KM_USER1); | ||
1261 | } | ||
1254 | if (direction < 0) { | 1262 | if (direction < 0) { |
1255 | if (nr == 0) | 1263 | if (nr == 0) |
1256 | break; | 1264 | break; |
@@ -1268,14 +1276,23 @@ static void reada_for_search(struct btrfs_root *root, | |||
1268 | search = btrfs_node_blockptr(node, nr); | 1276 | search = btrfs_node_blockptr(node, nr); |
1269 | if ((search <= target && target - search <= 65536) || | 1277 | if ((search <= target && target - search <= 65536) || |
1270 | (search > target && search - target <= 65536)) { | 1278 | (search > target && search - target <= 65536)) { |
1271 | readahead_tree_block(root, search, blocksize, | 1279 | gen = btrfs_node_ptr_generation(node, nr); |
1272 | btrfs_node_ptr_generation(node, nr)); | 1280 | if (node->map_token) { |
1281 | unmap_extent_buffer(node, node->map_token, | ||
1282 | KM_USER1); | ||
1283 | node->map_token = NULL; | ||
1284 | } | ||
1285 | readahead_tree_block(root, search, blocksize, gen); | ||
1273 | nread += blocksize; | 1286 | nread += blocksize; |
1274 | } | 1287 | } |
1275 | nscan++; | 1288 | nscan++; |
1276 | if ((nread > 65536 || nscan > 32)) | 1289 | if ((nread > 65536 || nscan > 32)) |
1277 | break; | 1290 | break; |
1278 | } | 1291 | } |
1292 | if (node->map_token) { | ||
1293 | unmap_extent_buffer(node, node->map_token, KM_USER1); | ||
1294 | node->map_token = NULL; | ||
1295 | } | ||
1279 | } | 1296 | } |
1280 | 1297 | ||
1281 | /* | 1298 | /* |
@@ -1648,9 +1665,6 @@ again: | |||
1648 | } | 1665 | } |
1649 | cow_done: | 1666 | cow_done: |
1650 | BUG_ON(!cow && ins_len); | 1667 | BUG_ON(!cow && ins_len); |
1651 | if (level != btrfs_header_level(b)) | ||
1652 | WARN_ON(1); | ||
1653 | level = btrfs_header_level(b); | ||
1654 | 1668 | ||
1655 | p->nodes[level] = b; | 1669 | p->nodes[level] = b; |
1656 | if (!p->skip_locking) | 1670 | if (!p->skip_locking) |
diff --git a/fs/btrfs/ctree.h b/fs/btrfs/ctree.h index 332323e19dd1..8f98c2005715 100644 --- a/fs/btrfs/ctree.h +++ b/fs/btrfs/ctree.h | |||
@@ -930,7 +930,6 @@ struct btrfs_fs_info { | |||
930 | * is required instead of the faster short fsync log commits | 930 | * is required instead of the faster short fsync log commits |
931 | */ | 931 | */ |
932 | u64 last_trans_log_full_commit; | 932 | u64 last_trans_log_full_commit; |
933 | u64 open_ioctl_trans; | ||
934 | unsigned long mount_opt:20; | 933 | unsigned long mount_opt:20; |
935 | unsigned long compress_type:4; | 934 | unsigned long compress_type:4; |
936 | u64 max_inline; | 935 | u64 max_inline; |
@@ -947,7 +946,6 @@ struct btrfs_fs_info { | |||
947 | struct super_block *sb; | 946 | struct super_block *sb; |
948 | struct inode *btree_inode; | 947 | struct inode *btree_inode; |
949 | struct backing_dev_info bdi; | 948 | struct backing_dev_info bdi; |
950 | struct mutex trans_mutex; | ||
951 | struct mutex tree_log_mutex; | 949 | struct mutex tree_log_mutex; |
952 | struct mutex transaction_kthread_mutex; | 950 | struct mutex transaction_kthread_mutex; |
953 | struct mutex cleaner_mutex; | 951 | struct mutex cleaner_mutex; |
@@ -968,6 +966,7 @@ struct btrfs_fs_info { | |||
968 | struct rw_semaphore subvol_sem; | 966 | struct rw_semaphore subvol_sem; |
969 | struct srcu_struct subvol_srcu; | 967 | struct srcu_struct subvol_srcu; |
970 | 968 | ||
969 | spinlock_t trans_lock; | ||
971 | struct list_head trans_list; | 970 | struct list_head trans_list; |
972 | struct list_head hashers; | 971 | struct list_head hashers; |
973 | struct list_head dead_roots; | 972 | struct list_head dead_roots; |
@@ -980,6 +979,7 @@ struct btrfs_fs_info { | |||
980 | atomic_t async_submit_draining; | 979 | atomic_t async_submit_draining; |
981 | atomic_t nr_async_bios; | 980 | atomic_t nr_async_bios; |
982 | atomic_t async_delalloc_pages; | 981 | atomic_t async_delalloc_pages; |
982 | atomic_t open_ioctl_trans; | ||
983 | 983 | ||
984 | /* | 984 | /* |
985 | * this is used by the balancing code to wait for all the pending | 985 | * this is used by the balancing code to wait for all the pending |
@@ -1044,6 +1044,7 @@ struct btrfs_fs_info { | |||
1044 | int closing; | 1044 | int closing; |
1045 | int log_root_recovering; | 1045 | int log_root_recovering; |
1046 | int enospc_unlink; | 1046 | int enospc_unlink; |
1047 | int trans_no_join; | ||
1047 | 1048 | ||
1048 | u64 total_pinned; | 1049 | u64 total_pinned; |
1049 | 1050 | ||
@@ -1065,7 +1066,6 @@ struct btrfs_fs_info { | |||
1065 | struct reloc_control *reloc_ctl; | 1066 | struct reloc_control *reloc_ctl; |
1066 | 1067 | ||
1067 | spinlock_t delalloc_lock; | 1068 | spinlock_t delalloc_lock; |
1068 | spinlock_t new_trans_lock; | ||
1069 | u64 delalloc_bytes; | 1069 | u64 delalloc_bytes; |
1070 | 1070 | ||
1071 | /* data_alloc_cluster is only used in ssd mode */ | 1071 | /* data_alloc_cluster is only used in ssd mode */ |
@@ -2238,6 +2238,9 @@ int btrfs_block_rsv_migrate(struct btrfs_block_rsv *src_rsv, | |||
2238 | void btrfs_block_rsv_release(struct btrfs_root *root, | 2238 | void btrfs_block_rsv_release(struct btrfs_root *root, |
2239 | struct btrfs_block_rsv *block_rsv, | 2239 | struct btrfs_block_rsv *block_rsv, |
2240 | u64 num_bytes); | 2240 | u64 num_bytes); |
2241 | int btrfs_truncate_reserve_metadata(struct btrfs_trans_handle *trans, | ||
2242 | struct btrfs_root *root, | ||
2243 | struct btrfs_block_rsv *rsv); | ||
2241 | int btrfs_set_block_group_ro(struct btrfs_root *root, | 2244 | int btrfs_set_block_group_ro(struct btrfs_root *root, |
2242 | struct btrfs_block_group_cache *cache); | 2245 | struct btrfs_block_group_cache *cache); |
2243 | int btrfs_set_block_group_rw(struct btrfs_root *root, | 2246 | int btrfs_set_block_group_rw(struct btrfs_root *root, |
@@ -2512,8 +2515,7 @@ int btrfs_set_extent_delalloc(struct inode *inode, u64 start, u64 end, | |||
2512 | int btrfs_writepages(struct address_space *mapping, | 2515 | int btrfs_writepages(struct address_space *mapping, |
2513 | struct writeback_control *wbc); | 2516 | struct writeback_control *wbc); |
2514 | int btrfs_create_subvol_root(struct btrfs_trans_handle *trans, | 2517 | int btrfs_create_subvol_root(struct btrfs_trans_handle *trans, |
2515 | struct btrfs_root *new_root, | 2518 | struct btrfs_root *new_root, u64 new_dirid); |
2516 | u64 new_dirid, u64 alloc_hint); | ||
2517 | int btrfs_merge_bio_hook(struct page *page, unsigned long offset, | 2519 | int btrfs_merge_bio_hook(struct page *page, unsigned long offset, |
2518 | size_t size, struct bio *bio, unsigned long bio_flags); | 2520 | size_t size, struct bio *bio, unsigned long bio_flags); |
2519 | 2521 | ||
diff --git a/fs/btrfs/delayed-inode.c b/fs/btrfs/delayed-inode.c index 01e29503a54b..b46d94d1dea8 100644 --- a/fs/btrfs/delayed-inode.c +++ b/fs/btrfs/delayed-inode.c | |||
@@ -1129,7 +1129,7 @@ static void btrfs_async_run_delayed_node_done(struct btrfs_work *work) | |||
1129 | delayed_node = async_node->delayed_node; | 1129 | delayed_node = async_node->delayed_node; |
1130 | root = delayed_node->root; | 1130 | root = delayed_node->root; |
1131 | 1131 | ||
1132 | trans = btrfs_join_transaction(root, 0); | 1132 | trans = btrfs_join_transaction(root); |
1133 | if (IS_ERR(trans)) | 1133 | if (IS_ERR(trans)) |
1134 | goto free_path; | 1134 | goto free_path; |
1135 | 1135 | ||
@@ -1572,8 +1572,7 @@ static void fill_stack_inode_item(struct btrfs_trans_handle *trans, | |||
1572 | btrfs_set_stack_inode_transid(inode_item, trans->transid); | 1572 | btrfs_set_stack_inode_transid(inode_item, trans->transid); |
1573 | btrfs_set_stack_inode_rdev(inode_item, inode->i_rdev); | 1573 | btrfs_set_stack_inode_rdev(inode_item, inode->i_rdev); |
1574 | btrfs_set_stack_inode_flags(inode_item, BTRFS_I(inode)->flags); | 1574 | btrfs_set_stack_inode_flags(inode_item, BTRFS_I(inode)->flags); |
1575 | btrfs_set_stack_inode_block_group(inode_item, | 1575 | btrfs_set_stack_inode_block_group(inode_item, 0); |
1576 | BTRFS_I(inode)->block_group); | ||
1577 | 1576 | ||
1578 | btrfs_set_stack_timespec_sec(btrfs_inode_atime(inode_item), | 1577 | btrfs_set_stack_timespec_sec(btrfs_inode_atime(inode_item), |
1579 | inode->i_atime.tv_sec); | 1578 | inode->i_atime.tv_sec); |
diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c index 98b6a71decba..a203d363184d 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c | |||
@@ -1505,24 +1505,24 @@ static int transaction_kthread(void *arg) | |||
1505 | vfs_check_frozen(root->fs_info->sb, SB_FREEZE_WRITE); | 1505 | vfs_check_frozen(root->fs_info->sb, SB_FREEZE_WRITE); |
1506 | mutex_lock(&root->fs_info->transaction_kthread_mutex); | 1506 | mutex_lock(&root->fs_info->transaction_kthread_mutex); |
1507 | 1507 | ||
1508 | spin_lock(&root->fs_info->new_trans_lock); | 1508 | spin_lock(&root->fs_info->trans_lock); |
1509 | cur = root->fs_info->running_transaction; | 1509 | cur = root->fs_info->running_transaction; |
1510 | if (!cur) { | 1510 | if (!cur) { |
1511 | spin_unlock(&root->fs_info->new_trans_lock); | 1511 | spin_unlock(&root->fs_info->trans_lock); |
1512 | goto sleep; | 1512 | goto sleep; |
1513 | } | 1513 | } |
1514 | 1514 | ||
1515 | now = get_seconds(); | 1515 | now = get_seconds(); |
1516 | if (!cur->blocked && | 1516 | if (!cur->blocked && |
1517 | (now < cur->start_time || now - cur->start_time < 30)) { | 1517 | (now < cur->start_time || now - cur->start_time < 30)) { |
1518 | spin_unlock(&root->fs_info->new_trans_lock); | 1518 | spin_unlock(&root->fs_info->trans_lock); |
1519 | delay = HZ * 5; | 1519 | delay = HZ * 5; |
1520 | goto sleep; | 1520 | goto sleep; |
1521 | } | 1521 | } |
1522 | transid = cur->transid; | 1522 | transid = cur->transid; |
1523 | spin_unlock(&root->fs_info->new_trans_lock); | 1523 | spin_unlock(&root->fs_info->trans_lock); |
1524 | 1524 | ||
1525 | trans = btrfs_join_transaction(root, 1); | 1525 | trans = btrfs_join_transaction(root); |
1526 | BUG_ON(IS_ERR(trans)); | 1526 | BUG_ON(IS_ERR(trans)); |
1527 | if (transid == trans->transid) { | 1527 | if (transid == trans->transid) { |
1528 | ret = btrfs_commit_transaction(trans, root); | 1528 | ret = btrfs_commit_transaction(trans, root); |
@@ -1613,7 +1613,7 @@ struct btrfs_root *open_ctree(struct super_block *sb, | |||
1613 | INIT_LIST_HEAD(&fs_info->ordered_operations); | 1613 | INIT_LIST_HEAD(&fs_info->ordered_operations); |
1614 | INIT_LIST_HEAD(&fs_info->caching_block_groups); | 1614 | INIT_LIST_HEAD(&fs_info->caching_block_groups); |
1615 | spin_lock_init(&fs_info->delalloc_lock); | 1615 | spin_lock_init(&fs_info->delalloc_lock); |
1616 | spin_lock_init(&fs_info->new_trans_lock); | 1616 | spin_lock_init(&fs_info->trans_lock); |
1617 | spin_lock_init(&fs_info->ref_cache_lock); | 1617 | spin_lock_init(&fs_info->ref_cache_lock); |
1618 | spin_lock_init(&fs_info->fs_roots_radix_lock); | 1618 | spin_lock_init(&fs_info->fs_roots_radix_lock); |
1619 | spin_lock_init(&fs_info->delayed_iput_lock); | 1619 | spin_lock_init(&fs_info->delayed_iput_lock); |
@@ -1645,6 +1645,7 @@ struct btrfs_root *open_ctree(struct super_block *sb, | |||
1645 | fs_info->max_inline = 8192 * 1024; | 1645 | fs_info->max_inline = 8192 * 1024; |
1646 | fs_info->metadata_ratio = 0; | 1646 | fs_info->metadata_ratio = 0; |
1647 | fs_info->defrag_inodes = RB_ROOT; | 1647 | fs_info->defrag_inodes = RB_ROOT; |
1648 | fs_info->trans_no_join = 0; | ||
1648 | 1649 | ||
1649 | fs_info->thread_pool_size = min_t(unsigned long, | 1650 | fs_info->thread_pool_size = min_t(unsigned long, |
1650 | num_online_cpus() + 2, 8); | 1651 | num_online_cpus() + 2, 8); |
@@ -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); |
@@ -3024,10 +3024,13 @@ static int btrfs_cleanup_transaction(struct btrfs_root *root) | |||
3024 | 3024 | ||
3025 | WARN_ON(1); | 3025 | WARN_ON(1); |
3026 | 3026 | ||
3027 | mutex_lock(&root->fs_info->trans_mutex); | ||
3028 | mutex_lock(&root->fs_info->transaction_kthread_mutex); | 3027 | mutex_lock(&root->fs_info->transaction_kthread_mutex); |
3029 | 3028 | ||
3029 | spin_lock(&root->fs_info->trans_lock); | ||
3030 | list_splice_init(&root->fs_info->trans_list, &list); | 3030 | list_splice_init(&root->fs_info->trans_list, &list); |
3031 | root->fs_info->trans_no_join = 1; | ||
3032 | spin_unlock(&root->fs_info->trans_lock); | ||
3033 | |||
3031 | while (!list_empty(&list)) { | 3034 | while (!list_empty(&list)) { |
3032 | t = list_entry(list.next, struct btrfs_transaction, list); | 3035 | t = list_entry(list.next, struct btrfs_transaction, list); |
3033 | if (!t) | 3036 | if (!t) |
@@ -3052,23 +3055,18 @@ static int btrfs_cleanup_transaction(struct btrfs_root *root) | |||
3052 | t->blocked = 0; | 3055 | t->blocked = 0; |
3053 | if (waitqueue_active(&root->fs_info->transaction_wait)) | 3056 | if (waitqueue_active(&root->fs_info->transaction_wait)) |
3054 | wake_up(&root->fs_info->transaction_wait); | 3057 | wake_up(&root->fs_info->transaction_wait); |
3055 | mutex_unlock(&root->fs_info->trans_mutex); | ||
3056 | 3058 | ||
3057 | mutex_lock(&root->fs_info->trans_mutex); | ||
3058 | t->commit_done = 1; | 3059 | t->commit_done = 1; |
3059 | if (waitqueue_active(&t->commit_wait)) | 3060 | if (waitqueue_active(&t->commit_wait)) |
3060 | wake_up(&t->commit_wait); | 3061 | wake_up(&t->commit_wait); |
3061 | mutex_unlock(&root->fs_info->trans_mutex); | ||
3062 | |||
3063 | mutex_lock(&root->fs_info->trans_mutex); | ||
3064 | 3062 | ||
3065 | btrfs_destroy_pending_snapshots(t); | 3063 | btrfs_destroy_pending_snapshots(t); |
3066 | 3064 | ||
3067 | btrfs_destroy_delalloc_inodes(root); | 3065 | btrfs_destroy_delalloc_inodes(root); |
3068 | 3066 | ||
3069 | spin_lock(&root->fs_info->new_trans_lock); | 3067 | spin_lock(&root->fs_info->trans_lock); |
3070 | root->fs_info->running_transaction = NULL; | 3068 | root->fs_info->running_transaction = NULL; |
3071 | spin_unlock(&root->fs_info->new_trans_lock); | 3069 | spin_unlock(&root->fs_info->trans_lock); |
3072 | 3070 | ||
3073 | btrfs_destroy_marked_extents(root, &t->dirty_pages, | 3071 | btrfs_destroy_marked_extents(root, &t->dirty_pages, |
3074 | EXTENT_DIRTY); | 3072 | EXTENT_DIRTY); |
@@ -3082,8 +3080,10 @@ static int btrfs_cleanup_transaction(struct btrfs_root *root) | |||
3082 | kmem_cache_free(btrfs_transaction_cachep, t); | 3080 | kmem_cache_free(btrfs_transaction_cachep, t); |
3083 | } | 3081 | } |
3084 | 3082 | ||
3083 | spin_lock(&root->fs_info->trans_lock); | ||
3084 | root->fs_info->trans_no_join = 0; | ||
3085 | spin_unlock(&root->fs_info->trans_lock); | ||
3085 | mutex_unlock(&root->fs_info->transaction_kthread_mutex); | 3086 | mutex_unlock(&root->fs_info->transaction_kthread_mutex); |
3086 | mutex_unlock(&root->fs_info->trans_mutex); | ||
3087 | 3087 | ||
3088 | return 0; | 3088 | return 0; |
3089 | } | 3089 | } |
diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c index 169bd62ce776..c9173a7827b0 100644 --- a/fs/btrfs/extent-tree.c +++ b/fs/btrfs/extent-tree.c | |||
@@ -348,7 +348,7 @@ static int caching_kthread(void *data) | |||
348 | */ | 348 | */ |
349 | path->skip_locking = 1; | 349 | path->skip_locking = 1; |
350 | path->search_commit_root = 1; | 350 | path->search_commit_root = 1; |
351 | path->reada = 2; | 351 | path->reada = 1; |
352 | 352 | ||
353 | key.objectid = last; | 353 | key.objectid = last; |
354 | key.offset = 0; | 354 | key.offset = 0; |
@@ -379,15 +379,18 @@ again: | |||
379 | if (ret) | 379 | if (ret) |
380 | break; | 380 | break; |
381 | 381 | ||
382 | caching_ctl->progress = last; | 382 | if (need_resched() || |
383 | btrfs_release_path(path); | 383 | btrfs_next_leaf(extent_root, path)) { |
384 | up_read(&fs_info->extent_commit_sem); | 384 | caching_ctl->progress = last; |
385 | mutex_unlock(&caching_ctl->mutex); | 385 | btrfs_release_path(path); |
386 | if (btrfs_transaction_in_commit(fs_info)) | 386 | up_read(&fs_info->extent_commit_sem); |
387 | schedule_timeout(1); | 387 | mutex_unlock(&caching_ctl->mutex); |
388 | else | ||
389 | cond_resched(); | 388 | cond_resched(); |
390 | goto again; | 389 | goto again; |
390 | } | ||
391 | leaf = path->nodes[0]; | ||
392 | nritems = btrfs_header_nritems(leaf); | ||
393 | continue; | ||
391 | } | 394 | } |
392 | 395 | ||
393 | if (key.objectid < block_group->key.objectid) { | 396 | if (key.objectid < block_group->key.objectid) { |
@@ -3065,7 +3068,7 @@ again: | |||
3065 | spin_unlock(&data_sinfo->lock); | 3068 | spin_unlock(&data_sinfo->lock); |
3066 | alloc: | 3069 | alloc: |
3067 | alloc_target = btrfs_get_alloc_profile(root, 1); | 3070 | alloc_target = btrfs_get_alloc_profile(root, 1); |
3068 | trans = btrfs_join_transaction(root, 1); | 3071 | trans = btrfs_join_transaction(root); |
3069 | if (IS_ERR(trans)) | 3072 | if (IS_ERR(trans)) |
3070 | return PTR_ERR(trans); | 3073 | return PTR_ERR(trans); |
3071 | 3074 | ||
@@ -3091,9 +3094,10 @@ alloc: | |||
3091 | 3094 | ||
3092 | /* commit the current transaction and try again */ | 3095 | /* commit the current transaction and try again */ |
3093 | commit_trans: | 3096 | commit_trans: |
3094 | if (!committed && !root->fs_info->open_ioctl_trans) { | 3097 | if (!committed && |
3098 | !atomic_read(&root->fs_info->open_ioctl_trans)) { | ||
3095 | committed = 1; | 3099 | committed = 1; |
3096 | trans = btrfs_join_transaction(root, 1); | 3100 | trans = btrfs_join_transaction(root); |
3097 | if (IS_ERR(trans)) | 3101 | if (IS_ERR(trans)) |
3098 | return PTR_ERR(trans); | 3102 | return PTR_ERR(trans); |
3099 | ret = btrfs_commit_transaction(trans, root); | 3103 | ret = btrfs_commit_transaction(trans, root); |
@@ -3472,7 +3476,7 @@ again: | |||
3472 | goto out; | 3476 | goto out; |
3473 | 3477 | ||
3474 | ret = -ENOSPC; | 3478 | ret = -ENOSPC; |
3475 | trans = btrfs_join_transaction(root, 1); | 3479 | trans = btrfs_join_transaction(root); |
3476 | if (IS_ERR(trans)) | 3480 | if (IS_ERR(trans)) |
3477 | goto out; | 3481 | goto out; |
3478 | ret = btrfs_commit_transaction(trans, root); | 3482 | ret = btrfs_commit_transaction(trans, root); |
@@ -3699,7 +3703,7 @@ int btrfs_block_rsv_check(struct btrfs_trans_handle *trans, | |||
3699 | if (trans) | 3703 | if (trans) |
3700 | return -EAGAIN; | 3704 | return -EAGAIN; |
3701 | 3705 | ||
3702 | trans = btrfs_join_transaction(root, 1); | 3706 | trans = btrfs_join_transaction(root); |
3703 | BUG_ON(IS_ERR(trans)); | 3707 | BUG_ON(IS_ERR(trans)); |
3704 | ret = btrfs_commit_transaction(trans, root); | 3708 | ret = btrfs_commit_transaction(trans, root); |
3705 | return 0; | 3709 | return 0; |
@@ -3837,6 +3841,37 @@ static void release_global_block_rsv(struct btrfs_fs_info *fs_info) | |||
3837 | WARN_ON(fs_info->chunk_block_rsv.reserved > 0); | 3841 | WARN_ON(fs_info->chunk_block_rsv.reserved > 0); |
3838 | } | 3842 | } |
3839 | 3843 | ||
3844 | int btrfs_truncate_reserve_metadata(struct btrfs_trans_handle *trans, | ||
3845 | struct btrfs_root *root, | ||
3846 | struct btrfs_block_rsv *rsv) | ||
3847 | { | ||
3848 | struct btrfs_block_rsv *trans_rsv = &root->fs_info->trans_block_rsv; | ||
3849 | u64 num_bytes; | ||
3850 | int ret; | ||
3851 | |||
3852 | /* | ||
3853 | * Truncate should be freeing data, but give us 2 items just in case it | ||
3854 | * needs to use some space. We may want to be smarter about this in the | ||
3855 | * future. | ||
3856 | */ | ||
3857 | num_bytes = btrfs_calc_trans_metadata_size(root, 2); | ||
3858 | |||
3859 | /* We already have enough bytes, just return */ | ||
3860 | if (rsv->reserved >= num_bytes) | ||
3861 | return 0; | ||
3862 | |||
3863 | num_bytes -= rsv->reserved; | ||
3864 | |||
3865 | /* | ||
3866 | * You should have reserved enough space before hand to do this, so this | ||
3867 | * should not fail. | ||
3868 | */ | ||
3869 | ret = block_rsv_migrate_bytes(trans_rsv, rsv, num_bytes); | ||
3870 | BUG_ON(ret); | ||
3871 | |||
3872 | return 0; | ||
3873 | } | ||
3874 | |||
3840 | int btrfs_trans_reserve_metadata(struct btrfs_trans_handle *trans, | 3875 | int btrfs_trans_reserve_metadata(struct btrfs_trans_handle *trans, |
3841 | struct btrfs_root *root, | 3876 | struct btrfs_root *root, |
3842 | int num_items) | 3877 | int num_items) |
@@ -3877,23 +3912,18 @@ int btrfs_orphan_reserve_metadata(struct btrfs_trans_handle *trans, | |||
3877 | struct btrfs_block_rsv *dst_rsv = root->orphan_block_rsv; | 3912 | struct btrfs_block_rsv *dst_rsv = root->orphan_block_rsv; |
3878 | 3913 | ||
3879 | /* | 3914 | /* |
3880 | * one for deleting orphan item, one for updating inode and | 3915 | * We need to hold space in order to delete our orphan item once we've |
3881 | * two for calling btrfs_truncate_inode_items. | 3916 | * added it, so this takes the reservation so we can release it later |
3882 | * | 3917 | * when we are truly done with the orphan item. |
3883 | * btrfs_truncate_inode_items is a delete operation, it frees | ||
3884 | * more space than it uses in most cases. So two units of | ||
3885 | * metadata space should be enough for calling it many times. | ||
3886 | * If all of the metadata space is used, we can commit | ||
3887 | * transaction and use space it freed. | ||
3888 | */ | 3918 | */ |
3889 | u64 num_bytes = btrfs_calc_trans_metadata_size(root, 4); | 3919 | u64 num_bytes = btrfs_calc_trans_metadata_size(root, 1); |
3890 | return block_rsv_migrate_bytes(src_rsv, dst_rsv, num_bytes); | 3920 | return block_rsv_migrate_bytes(src_rsv, dst_rsv, num_bytes); |
3891 | } | 3921 | } |
3892 | 3922 | ||
3893 | void btrfs_orphan_release_metadata(struct inode *inode) | 3923 | void btrfs_orphan_release_metadata(struct inode *inode) |
3894 | { | 3924 | { |
3895 | struct btrfs_root *root = BTRFS_I(inode)->root; | 3925 | struct btrfs_root *root = BTRFS_I(inode)->root; |
3896 | u64 num_bytes = btrfs_calc_trans_metadata_size(root, 4); | 3926 | u64 num_bytes = btrfs_calc_trans_metadata_size(root, 1); |
3897 | btrfs_block_rsv_release(root, root->orphan_block_rsv, num_bytes); | 3927 | btrfs_block_rsv_release(root, root->orphan_block_rsv, num_bytes); |
3898 | } | 3928 | } |
3899 | 3929 | ||
@@ -4987,6 +5017,15 @@ have_block_group: | |||
4987 | if (unlikely(block_group->ro)) | 5017 | if (unlikely(block_group->ro)) |
4988 | goto loop; | 5018 | goto loop; |
4989 | 5019 | ||
5020 | spin_lock(&block_group->free_space_ctl->tree_lock); | ||
5021 | if (cached && | ||
5022 | block_group->free_space_ctl->free_space < | ||
5023 | num_bytes + empty_size) { | ||
5024 | spin_unlock(&block_group->free_space_ctl->tree_lock); | ||
5025 | goto loop; | ||
5026 | } | ||
5027 | spin_unlock(&block_group->free_space_ctl->tree_lock); | ||
5028 | |||
4990 | /* | 5029 | /* |
4991 | * Ok we want to try and use the cluster allocator, so lets look | 5030 | * Ok we want to try and use the cluster allocator, so lets look |
4992 | * there, unless we are on LOOP_NO_EMPTY_SIZE, since we will | 5031 | * there, unless we are on LOOP_NO_EMPTY_SIZE, since we will |
@@ -5150,6 +5189,7 @@ checks: | |||
5150 | btrfs_add_free_space(block_group, offset, | 5189 | btrfs_add_free_space(block_group, offset, |
5151 | search_start - offset); | 5190 | search_start - offset); |
5152 | BUG_ON(offset > search_start); | 5191 | BUG_ON(offset > search_start); |
5192 | btrfs_put_block_group(block_group); | ||
5153 | break; | 5193 | break; |
5154 | loop: | 5194 | loop: |
5155 | failed_cluster_refill = false; | 5195 | failed_cluster_refill = false; |
@@ -5242,14 +5282,7 @@ loop: | |||
5242 | ret = -ENOSPC; | 5282 | ret = -ENOSPC; |
5243 | } else if (!ins->objectid) { | 5283 | } else if (!ins->objectid) { |
5244 | ret = -ENOSPC; | 5284 | ret = -ENOSPC; |
5245 | } | 5285 | } else if (ins->objectid) { |
5246 | |||
5247 | /* we found what we needed */ | ||
5248 | if (ins->objectid) { | ||
5249 | if (!(data & BTRFS_BLOCK_GROUP_DATA)) | ||
5250 | trans->block_group = block_group->key.objectid; | ||
5251 | |||
5252 | btrfs_put_block_group(block_group); | ||
5253 | ret = 0; | 5286 | ret = 0; |
5254 | } | 5287 | } |
5255 | 5288 | ||
@@ -6526,7 +6559,7 @@ int btrfs_set_block_group_ro(struct btrfs_root *root, | |||
6526 | 6559 | ||
6527 | BUG_ON(cache->ro); | 6560 | BUG_ON(cache->ro); |
6528 | 6561 | ||
6529 | trans = btrfs_join_transaction(root, 1); | 6562 | trans = btrfs_join_transaction(root); |
6530 | BUG_ON(IS_ERR(trans)); | 6563 | BUG_ON(IS_ERR(trans)); |
6531 | 6564 | ||
6532 | alloc_flags = update_block_group_flags(root, cache->flags); | 6565 | alloc_flags = update_block_group_flags(root, cache->flags); |
@@ -6882,6 +6915,7 @@ int btrfs_read_block_groups(struct btrfs_root *root) | |||
6882 | path = btrfs_alloc_path(); | 6915 | path = btrfs_alloc_path(); |
6883 | if (!path) | 6916 | if (!path) |
6884 | return -ENOMEM; | 6917 | return -ENOMEM; |
6918 | path->reada = 1; | ||
6885 | 6919 | ||
6886 | cache_gen = btrfs_super_cache_generation(&root->fs_info->super_copy); | 6920 | cache_gen = btrfs_super_cache_generation(&root->fs_info->super_copy); |
6887 | if (cache_gen != 0 && | 6921 | if (cache_gen != 0 && |
diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c index 0e0fe0f6ec75..b181a94a7170 100644 --- a/fs/btrfs/extent_io.c +++ b/fs/btrfs/extent_io.c | |||
@@ -1474,7 +1474,7 @@ u64 count_range_bits(struct extent_io_tree *tree, | |||
1474 | if (total_bytes >= max_bytes) | 1474 | if (total_bytes >= max_bytes) |
1475 | break; | 1475 | break; |
1476 | if (!found) { | 1476 | if (!found) { |
1477 | *start = state->start; | 1477 | *start = max(cur_start, state->start); |
1478 | found = 1; | 1478 | found = 1; |
1479 | } | 1479 | } |
1480 | last = state->end; | 1480 | last = state->end; |
diff --git a/fs/btrfs/file.c b/fs/btrfs/file.c index c6a22d783c35..e3a1b0c2394c 100644 --- a/fs/btrfs/file.c +++ b/fs/btrfs/file.c | |||
@@ -1480,14 +1480,12 @@ int btrfs_sync_file(struct file *file, int datasync) | |||
1480 | * the current transaction, we can bail out now without any | 1480 | * the current transaction, we can bail out now without any |
1481 | * syncing | 1481 | * syncing |
1482 | */ | 1482 | */ |
1483 | mutex_lock(&root->fs_info->trans_mutex); | 1483 | smp_mb(); |
1484 | if (BTRFS_I(inode)->last_trans <= | 1484 | if (BTRFS_I(inode)->last_trans <= |
1485 | root->fs_info->last_trans_committed) { | 1485 | root->fs_info->last_trans_committed) { |
1486 | BTRFS_I(inode)->last_trans = 0; | 1486 | BTRFS_I(inode)->last_trans = 0; |
1487 | mutex_unlock(&root->fs_info->trans_mutex); | ||
1488 | goto out; | 1487 | goto out; |
1489 | } | 1488 | } |
1490 | mutex_unlock(&root->fs_info->trans_mutex); | ||
1491 | 1489 | ||
1492 | /* | 1490 | /* |
1493 | * ok we haven't committed the transaction yet, lets do a commit | 1491 | * ok we haven't committed the transaction yet, lets do a commit |
diff --git a/fs/btrfs/free-space-cache.c b/fs/btrfs/free-space-cache.c index 70d45795d758..dd38d4c3a599 100644 --- a/fs/btrfs/free-space-cache.c +++ b/fs/btrfs/free-space-cache.c | |||
@@ -402,7 +402,14 @@ int __load_free_space_cache(struct btrfs_root *root, struct inode *inode, | |||
402 | spin_lock(&ctl->tree_lock); | 402 | spin_lock(&ctl->tree_lock); |
403 | ret = link_free_space(ctl, e); | 403 | ret = link_free_space(ctl, e); |
404 | spin_unlock(&ctl->tree_lock); | 404 | spin_unlock(&ctl->tree_lock); |
405 | BUG_ON(ret); | 405 | if (ret) { |
406 | printk(KERN_ERR "Duplicate entries in " | ||
407 | "free space cache, dumping\n"); | ||
408 | kunmap(page); | ||
409 | unlock_page(page); | ||
410 | page_cache_release(page); | ||
411 | goto free_cache; | ||
412 | } | ||
406 | } else { | 413 | } else { |
407 | e->bitmap = kzalloc(PAGE_CACHE_SIZE, GFP_NOFS); | 414 | e->bitmap = kzalloc(PAGE_CACHE_SIZE, GFP_NOFS); |
408 | if (!e->bitmap) { | 415 | if (!e->bitmap) { |
@@ -419,6 +426,14 @@ int __load_free_space_cache(struct btrfs_root *root, struct inode *inode, | |||
419 | ctl->op->recalc_thresholds(ctl); | 426 | ctl->op->recalc_thresholds(ctl); |
420 | spin_unlock(&ctl->tree_lock); | 427 | spin_unlock(&ctl->tree_lock); |
421 | list_add_tail(&e->list, &bitmaps); | 428 | list_add_tail(&e->list, &bitmaps); |
429 | if (ret) { | ||
430 | printk(KERN_ERR "Duplicate entries in " | ||
431 | "free space cache, dumping\n"); | ||
432 | kunmap(page); | ||
433 | unlock_page(page); | ||
434 | page_cache_release(page); | ||
435 | goto free_cache; | ||
436 | } | ||
422 | } | 437 | } |
423 | 438 | ||
424 | num_entries--; | 439 | num_entries--; |
@@ -963,10 +978,16 @@ static int tree_insert_offset(struct rb_root *root, u64 offset, | |||
963 | * logically. | 978 | * logically. |
964 | */ | 979 | */ |
965 | if (bitmap) { | 980 | if (bitmap) { |
966 | WARN_ON(info->bitmap); | 981 | if (info->bitmap) { |
982 | WARN_ON_ONCE(1); | ||
983 | return -EEXIST; | ||
984 | } | ||
967 | p = &(*p)->rb_right; | 985 | p = &(*p)->rb_right; |
968 | } else { | 986 | } else { |
969 | WARN_ON(!info->bitmap); | 987 | if (!info->bitmap) { |
988 | WARN_ON_ONCE(1); | ||
989 | return -EEXIST; | ||
990 | } | ||
970 | p = &(*p)->rb_left; | 991 | p = &(*p)->rb_left; |
971 | } | 992 | } |
972 | } | 993 | } |
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index bb51bb1fa44f..a83e44bf3206 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c | |||
@@ -138,7 +138,6 @@ static noinline int insert_inline_extent(struct btrfs_trans_handle *trans, | |||
138 | return -ENOMEM; | 138 | return -ENOMEM; |
139 | 139 | ||
140 | path->leave_spinning = 1; | 140 | path->leave_spinning = 1; |
141 | btrfs_set_trans_block_group(trans, inode); | ||
142 | 141 | ||
143 | key.objectid = btrfs_ino(inode); | 142 | key.objectid = btrfs_ino(inode); |
144 | key.offset = start; | 143 | key.offset = start; |
@@ -426,9 +425,8 @@ again: | |||
426 | } | 425 | } |
427 | } | 426 | } |
428 | if (start == 0) { | 427 | if (start == 0) { |
429 | trans = btrfs_join_transaction(root, 1); | 428 | trans = btrfs_join_transaction(root); |
430 | BUG_ON(IS_ERR(trans)); | 429 | BUG_ON(IS_ERR(trans)); |
431 | btrfs_set_trans_block_group(trans, inode); | ||
432 | trans->block_rsv = &root->fs_info->delalloc_block_rsv; | 430 | trans->block_rsv = &root->fs_info->delalloc_block_rsv; |
433 | 431 | ||
434 | /* lets try to make an inline extent */ | 432 | /* lets try to make an inline extent */ |
@@ -623,8 +621,9 @@ retry: | |||
623 | async_extent->start + async_extent->ram_size - 1, | 621 | async_extent->start + async_extent->ram_size - 1, |
624 | GFP_NOFS); | 622 | GFP_NOFS); |
625 | 623 | ||
626 | trans = btrfs_join_transaction(root, 1); | 624 | trans = btrfs_join_transaction(root); |
627 | BUG_ON(IS_ERR(trans)); | 625 | BUG_ON(IS_ERR(trans)); |
626 | trans->block_rsv = &root->fs_info->delalloc_block_rsv; | ||
628 | ret = btrfs_reserve_extent(trans, root, | 627 | ret = btrfs_reserve_extent(trans, root, |
629 | async_extent->compressed_size, | 628 | async_extent->compressed_size, |
630 | async_extent->compressed_size, | 629 | async_extent->compressed_size, |
@@ -793,9 +792,8 @@ static noinline int cow_file_range(struct inode *inode, | |||
793 | int ret = 0; | 792 | int ret = 0; |
794 | 793 | ||
795 | BUG_ON(is_free_space_inode(root, inode)); | 794 | BUG_ON(is_free_space_inode(root, inode)); |
796 | trans = btrfs_join_transaction(root, 1); | 795 | trans = btrfs_join_transaction(root); |
797 | BUG_ON(IS_ERR(trans)); | 796 | BUG_ON(IS_ERR(trans)); |
798 | btrfs_set_trans_block_group(trans, inode); | ||
799 | trans->block_rsv = &root->fs_info->delalloc_block_rsv; | 797 | trans->block_rsv = &root->fs_info->delalloc_block_rsv; |
800 | 798 | ||
801 | num_bytes = (end - start + blocksize) & ~(blocksize - 1); | 799 | num_bytes = (end - start + blocksize) & ~(blocksize - 1); |
@@ -1077,10 +1075,12 @@ static noinline int run_delalloc_nocow(struct inode *inode, | |||
1077 | nolock = is_free_space_inode(root, inode); | 1075 | nolock = is_free_space_inode(root, inode); |
1078 | 1076 | ||
1079 | if (nolock) | 1077 | if (nolock) |
1080 | trans = btrfs_join_transaction_nolock(root, 1); | 1078 | trans = btrfs_join_transaction_nolock(root); |
1081 | else | 1079 | else |
1082 | trans = btrfs_join_transaction(root, 1); | 1080 | trans = btrfs_join_transaction(root); |
1081 | |||
1083 | BUG_ON(IS_ERR(trans)); | 1082 | BUG_ON(IS_ERR(trans)); |
1083 | trans->block_rsv = &root->fs_info->delalloc_block_rsv; | ||
1084 | 1084 | ||
1085 | cow_start = (u64)-1; | 1085 | cow_start = (u64)-1; |
1086 | cur_offset = start; | 1086 | cur_offset = start; |
@@ -1519,8 +1519,6 @@ static noinline int add_pending_csums(struct btrfs_trans_handle *trans, | |||
1519 | { | 1519 | { |
1520 | struct btrfs_ordered_sum *sum; | 1520 | struct btrfs_ordered_sum *sum; |
1521 | 1521 | ||
1522 | btrfs_set_trans_block_group(trans, inode); | ||
1523 | |||
1524 | list_for_each_entry(sum, list, list) { | 1522 | list_for_each_entry(sum, list, list) { |
1525 | btrfs_csum_file_blocks(trans, | 1523 | btrfs_csum_file_blocks(trans, |
1526 | BTRFS_I(inode)->root->fs_info->csum_root, sum); | 1524 | BTRFS_I(inode)->root->fs_info->csum_root, sum); |
@@ -1735,11 +1733,10 @@ static int btrfs_finish_ordered_io(struct inode *inode, u64 start, u64 end) | |||
1735 | ret = btrfs_ordered_update_i_size(inode, 0, ordered_extent); | 1733 | ret = btrfs_ordered_update_i_size(inode, 0, ordered_extent); |
1736 | if (!ret) { | 1734 | if (!ret) { |
1737 | if (nolock) | 1735 | if (nolock) |
1738 | trans = btrfs_join_transaction_nolock(root, 1); | 1736 | trans = btrfs_join_transaction_nolock(root); |
1739 | else | 1737 | else |
1740 | trans = btrfs_join_transaction(root, 1); | 1738 | trans = btrfs_join_transaction(root); |
1741 | BUG_ON(IS_ERR(trans)); | 1739 | BUG_ON(IS_ERR(trans)); |
1742 | btrfs_set_trans_block_group(trans, inode); | ||
1743 | trans->block_rsv = &root->fs_info->delalloc_block_rsv; | 1740 | trans->block_rsv = &root->fs_info->delalloc_block_rsv; |
1744 | ret = btrfs_update_inode(trans, root, inode); | 1741 | ret = btrfs_update_inode(trans, root, inode); |
1745 | BUG_ON(ret); | 1742 | BUG_ON(ret); |
@@ -1752,11 +1749,10 @@ static int btrfs_finish_ordered_io(struct inode *inode, u64 start, u64 end) | |||
1752 | 0, &cached_state, GFP_NOFS); | 1749 | 0, &cached_state, GFP_NOFS); |
1753 | 1750 | ||
1754 | if (nolock) | 1751 | if (nolock) |
1755 | trans = btrfs_join_transaction_nolock(root, 1); | 1752 | trans = btrfs_join_transaction_nolock(root); |
1756 | else | 1753 | else |
1757 | trans = btrfs_join_transaction(root, 1); | 1754 | trans = btrfs_join_transaction(root); |
1758 | BUG_ON(IS_ERR(trans)); | 1755 | BUG_ON(IS_ERR(trans)); |
1759 | btrfs_set_trans_block_group(trans, inode); | ||
1760 | trans->block_rsv = &root->fs_info->delalloc_block_rsv; | 1756 | trans->block_rsv = &root->fs_info->delalloc_block_rsv; |
1761 | 1757 | ||
1762 | if (test_bit(BTRFS_ORDERED_COMPRESSED, &ordered_extent->flags)) | 1758 | if (test_bit(BTRFS_ORDERED_COMPRESSED, &ordered_extent->flags)) |
@@ -2431,7 +2427,7 @@ int btrfs_orphan_cleanup(struct btrfs_root *root) | |||
2431 | (u64)-1); | 2427 | (u64)-1); |
2432 | 2428 | ||
2433 | if (root->orphan_block_rsv || root->orphan_item_inserted) { | 2429 | if (root->orphan_block_rsv || root->orphan_item_inserted) { |
2434 | trans = btrfs_join_transaction(root, 1); | 2430 | trans = btrfs_join_transaction(root); |
2435 | if (!IS_ERR(trans)) | 2431 | if (!IS_ERR(trans)) |
2436 | btrfs_end_transaction(trans, root); | 2432 | btrfs_end_transaction(trans, root); |
2437 | } | 2433 | } |
@@ -2511,12 +2507,12 @@ static void btrfs_read_locked_inode(struct inode *inode) | |||
2511 | struct btrfs_root *root = BTRFS_I(inode)->root; | 2507 | struct btrfs_root *root = BTRFS_I(inode)->root; |
2512 | struct btrfs_key location; | 2508 | struct btrfs_key location; |
2513 | int maybe_acls; | 2509 | int maybe_acls; |
2514 | u64 alloc_group_block; | ||
2515 | u32 rdev; | 2510 | u32 rdev; |
2516 | int ret; | 2511 | int ret; |
2517 | 2512 | ||
2518 | path = btrfs_alloc_path(); | 2513 | path = btrfs_alloc_path(); |
2519 | BUG_ON(!path); | 2514 | BUG_ON(!path); |
2515 | path->leave_spinning = 1; | ||
2520 | memcpy(&location, &BTRFS_I(inode)->location, sizeof(location)); | 2516 | memcpy(&location, &BTRFS_I(inode)->location, sizeof(location)); |
2521 | 2517 | ||
2522 | ret = btrfs_lookup_inode(NULL, root, path, &location, 0); | 2518 | ret = btrfs_lookup_inode(NULL, root, path, &location, 0); |
@@ -2526,6 +2522,12 @@ static void btrfs_read_locked_inode(struct inode *inode) | |||
2526 | leaf = path->nodes[0]; | 2522 | leaf = path->nodes[0]; |
2527 | inode_item = btrfs_item_ptr(leaf, path->slots[0], | 2523 | inode_item = btrfs_item_ptr(leaf, path->slots[0], |
2528 | struct btrfs_inode_item); | 2524 | struct btrfs_inode_item); |
2525 | if (!leaf->map_token) | ||
2526 | map_private_extent_buffer(leaf, (unsigned long)inode_item, | ||
2527 | sizeof(struct btrfs_inode_item), | ||
2528 | &leaf->map_token, &leaf->kaddr, | ||
2529 | &leaf->map_start, &leaf->map_len, | ||
2530 | KM_USER1); | ||
2529 | 2531 | ||
2530 | inode->i_mode = btrfs_inode_mode(leaf, inode_item); | 2532 | inode->i_mode = btrfs_inode_mode(leaf, inode_item); |
2531 | inode->i_nlink = btrfs_inode_nlink(leaf, inode_item); | 2533 | inode->i_nlink = btrfs_inode_nlink(leaf, inode_item); |
@@ -2555,8 +2557,6 @@ static void btrfs_read_locked_inode(struct inode *inode) | |||
2555 | BTRFS_I(inode)->index_cnt = (u64)-1; | 2557 | BTRFS_I(inode)->index_cnt = (u64)-1; |
2556 | BTRFS_I(inode)->flags = btrfs_inode_flags(leaf, inode_item); | 2558 | BTRFS_I(inode)->flags = btrfs_inode_flags(leaf, inode_item); |
2557 | 2559 | ||
2558 | alloc_group_block = btrfs_inode_block_group(leaf, inode_item); | ||
2559 | |||
2560 | /* | 2560 | /* |
2561 | * try to precache a NULL acl entry for files that don't have | 2561 | * try to precache a NULL acl entry for files that don't have |
2562 | * any xattrs or acls | 2562 | * any xattrs or acls |
@@ -2566,8 +2566,11 @@ static void btrfs_read_locked_inode(struct inode *inode) | |||
2566 | if (!maybe_acls) | 2566 | if (!maybe_acls) |
2567 | cache_no_acl(inode); | 2567 | cache_no_acl(inode); |
2568 | 2568 | ||
2569 | BTRFS_I(inode)->block_group = btrfs_find_block_group(root, 0, | 2569 | if (leaf->map_token) { |
2570 | alloc_group_block, 0); | 2570 | unmap_extent_buffer(leaf, leaf->map_token, KM_USER1); |
2571 | leaf->map_token = NULL; | ||
2572 | } | ||
2573 | |||
2571 | btrfs_free_path(path); | 2574 | btrfs_free_path(path); |
2572 | inode_item = NULL; | 2575 | inode_item = NULL; |
2573 | 2576 | ||
@@ -2647,7 +2650,7 @@ static void fill_inode_item(struct btrfs_trans_handle *trans, | |||
2647 | btrfs_set_inode_transid(leaf, item, trans->transid); | 2650 | btrfs_set_inode_transid(leaf, item, trans->transid); |
2648 | btrfs_set_inode_rdev(leaf, item, inode->i_rdev); | 2651 | btrfs_set_inode_rdev(leaf, item, inode->i_rdev); |
2649 | btrfs_set_inode_flags(leaf, item, BTRFS_I(inode)->flags); | 2652 | btrfs_set_inode_flags(leaf, item, BTRFS_I(inode)->flags); |
2650 | btrfs_set_inode_block_group(leaf, item, BTRFS_I(inode)->block_group); | 2653 | btrfs_set_inode_block_group(leaf, item, 0); |
2651 | 2654 | ||
2652 | if (leaf->map_token) { | 2655 | if (leaf->map_token) { |
2653 | unmap_extent_buffer(leaf, leaf->map_token, KM_USER1); | 2656 | unmap_extent_buffer(leaf, leaf->map_token, KM_USER1); |
@@ -3004,8 +3007,6 @@ static int btrfs_unlink(struct inode *dir, struct dentry *dentry) | |||
3004 | if (IS_ERR(trans)) | 3007 | if (IS_ERR(trans)) |
3005 | return PTR_ERR(trans); | 3008 | return PTR_ERR(trans); |
3006 | 3009 | ||
3007 | btrfs_set_trans_block_group(trans, dir); | ||
3008 | |||
3009 | btrfs_record_unlink_dir(trans, dir, dentry->d_inode, 0); | 3010 | btrfs_record_unlink_dir(trans, dir, dentry->d_inode, 0); |
3010 | 3011 | ||
3011 | ret = btrfs_unlink_inode(trans, root, dir, dentry->d_inode, | 3012 | ret = btrfs_unlink_inode(trans, root, dir, dentry->d_inode, |
@@ -3094,8 +3095,6 @@ static int btrfs_rmdir(struct inode *dir, struct dentry *dentry) | |||
3094 | if (IS_ERR(trans)) | 3095 | if (IS_ERR(trans)) |
3095 | return PTR_ERR(trans); | 3096 | return PTR_ERR(trans); |
3096 | 3097 | ||
3097 | btrfs_set_trans_block_group(trans, dir); | ||
3098 | |||
3099 | if (unlikely(btrfs_ino(inode) == BTRFS_EMPTY_SUBVOL_DIR_OBJECTID)) { | 3098 | if (unlikely(btrfs_ino(inode) == BTRFS_EMPTY_SUBVOL_DIR_OBJECTID)) { |
3100 | err = btrfs_unlink_subvol(trans, root, dir, | 3099 | err = btrfs_unlink_subvol(trans, root, dir, |
3101 | BTRFS_I(inode)->location.objectid, | 3100 | BTRFS_I(inode)->location.objectid, |
@@ -3514,7 +3513,6 @@ int btrfs_cont_expand(struct inode *inode, loff_t oldsize, loff_t size) | |||
3514 | err = PTR_ERR(trans); | 3513 | err = PTR_ERR(trans); |
3515 | break; | 3514 | break; |
3516 | } | 3515 | } |
3517 | btrfs_set_trans_block_group(trans, inode); | ||
3518 | 3516 | ||
3519 | err = btrfs_drop_extents(trans, inode, cur_offset, | 3517 | err = btrfs_drop_extents(trans, inode, cur_offset, |
3520 | cur_offset + hole_size, | 3518 | cur_offset + hole_size, |
@@ -3650,7 +3648,6 @@ void btrfs_evict_inode(struct inode *inode) | |||
3650 | while (1) { | 3648 | while (1) { |
3651 | trans = btrfs_start_transaction(root, 0); | 3649 | trans = btrfs_start_transaction(root, 0); |
3652 | BUG_ON(IS_ERR(trans)); | 3650 | BUG_ON(IS_ERR(trans)); |
3653 | btrfs_set_trans_block_group(trans, inode); | ||
3654 | trans->block_rsv = root->orphan_block_rsv; | 3651 | trans->block_rsv = root->orphan_block_rsv; |
3655 | 3652 | ||
3656 | ret = btrfs_block_rsv_check(trans, root, | 3653 | ret = btrfs_block_rsv_check(trans, root, |
@@ -4133,7 +4130,8 @@ static int btrfs_real_readdir(struct file *filp, void *dirent, | |||
4133 | path = btrfs_alloc_path(); | 4130 | path = btrfs_alloc_path(); |
4134 | if (!path) | 4131 | if (!path) |
4135 | return -ENOMEM; | 4132 | return -ENOMEM; |
4136 | path->reada = 2; | 4133 | |
4134 | path->reada = 1; | ||
4137 | 4135 | ||
4138 | if (key_type == BTRFS_DIR_INDEX_KEY) { | 4136 | if (key_type == BTRFS_DIR_INDEX_KEY) { |
4139 | INIT_LIST_HEAD(&ins_list); | 4137 | INIT_LIST_HEAD(&ins_list); |
@@ -4274,12 +4272,11 @@ int btrfs_write_inode(struct inode *inode, struct writeback_control *wbc) | |||
4274 | 4272 | ||
4275 | if (wbc->sync_mode == WB_SYNC_ALL) { | 4273 | if (wbc->sync_mode == WB_SYNC_ALL) { |
4276 | if (nolock) | 4274 | if (nolock) |
4277 | trans = btrfs_join_transaction_nolock(root, 1); | 4275 | trans = btrfs_join_transaction_nolock(root); |
4278 | else | 4276 | else |
4279 | trans = btrfs_join_transaction(root, 1); | 4277 | trans = btrfs_join_transaction(root); |
4280 | if (IS_ERR(trans)) | 4278 | if (IS_ERR(trans)) |
4281 | return PTR_ERR(trans); | 4279 | return PTR_ERR(trans); |
4282 | btrfs_set_trans_block_group(trans, inode); | ||
4283 | if (nolock) | 4280 | if (nolock) |
4284 | ret = btrfs_end_transaction_nolock(trans, root); | 4281 | ret = btrfs_end_transaction_nolock(trans, root); |
4285 | else | 4282 | else |
@@ -4303,9 +4300,8 @@ void btrfs_dirty_inode(struct inode *inode) | |||
4303 | if (BTRFS_I(inode)->dummy_inode) | 4300 | if (BTRFS_I(inode)->dummy_inode) |
4304 | return; | 4301 | return; |
4305 | 4302 | ||
4306 | trans = btrfs_join_transaction(root, 1); | 4303 | trans = btrfs_join_transaction(root); |
4307 | BUG_ON(IS_ERR(trans)); | 4304 | BUG_ON(IS_ERR(trans)); |
4308 | btrfs_set_trans_block_group(trans, inode); | ||
4309 | 4305 | ||
4310 | ret = btrfs_update_inode(trans, root, inode); | 4306 | ret = btrfs_update_inode(trans, root, inode); |
4311 | if (ret && ret == -ENOSPC) { | 4307 | if (ret && ret == -ENOSPC) { |
@@ -4319,7 +4315,6 @@ void btrfs_dirty_inode(struct inode *inode) | |||
4319 | PTR_ERR(trans)); | 4315 | PTR_ERR(trans)); |
4320 | return; | 4316 | return; |
4321 | } | 4317 | } |
4322 | btrfs_set_trans_block_group(trans, inode); | ||
4323 | 4318 | ||
4324 | ret = btrfs_update_inode(trans, root, inode); | 4319 | ret = btrfs_update_inode(trans, root, inode); |
4325 | if (ret) { | 4320 | if (ret) { |
@@ -4418,8 +4413,8 @@ static struct inode *btrfs_new_inode(struct btrfs_trans_handle *trans, | |||
4418 | struct btrfs_root *root, | 4413 | struct btrfs_root *root, |
4419 | struct inode *dir, | 4414 | struct inode *dir, |
4420 | const char *name, int name_len, | 4415 | const char *name, int name_len, |
4421 | u64 ref_objectid, u64 objectid, | 4416 | u64 ref_objectid, u64 objectid, int mode, |
4422 | u64 alloc_hint, int mode, u64 *index) | 4417 | u64 *index) |
4423 | { | 4418 | { |
4424 | struct inode *inode; | 4419 | struct inode *inode; |
4425 | struct btrfs_inode_item *inode_item; | 4420 | struct btrfs_inode_item *inode_item; |
@@ -4472,8 +4467,6 @@ static struct inode *btrfs_new_inode(struct btrfs_trans_handle *trans, | |||
4472 | owner = 0; | 4467 | owner = 0; |
4473 | else | 4468 | else |
4474 | owner = 1; | 4469 | owner = 1; |
4475 | BTRFS_I(inode)->block_group = | ||
4476 | btrfs_find_block_group(root, 0, alloc_hint, owner); | ||
4477 | 4470 | ||
4478 | key[0].objectid = objectid; | 4471 | key[0].objectid = objectid; |
4479 | btrfs_set_key_type(&key[0], BTRFS_INODE_ITEM_KEY); | 4472 | btrfs_set_key_type(&key[0], BTRFS_INODE_ITEM_KEY); |
@@ -4629,15 +4622,13 @@ static int btrfs_mknod(struct inode *dir, struct dentry *dentry, | |||
4629 | if (IS_ERR(trans)) | 4622 | if (IS_ERR(trans)) |
4630 | return PTR_ERR(trans); | 4623 | return PTR_ERR(trans); |
4631 | 4624 | ||
4632 | btrfs_set_trans_block_group(trans, dir); | ||
4633 | |||
4634 | err = btrfs_find_free_ino(root, &objectid); | 4625 | err = btrfs_find_free_ino(root, &objectid); |
4635 | if (err) | 4626 | if (err) |
4636 | goto out_unlock; | 4627 | goto out_unlock; |
4637 | 4628 | ||
4638 | inode = btrfs_new_inode(trans, root, dir, dentry->d_name.name, | 4629 | inode = btrfs_new_inode(trans, root, dir, dentry->d_name.name, |
4639 | dentry->d_name.len, btrfs_ino(dir), objectid, | 4630 | dentry->d_name.len, btrfs_ino(dir), objectid, |
4640 | BTRFS_I(dir)->block_group, mode, &index); | 4631 | mode, &index); |
4641 | if (IS_ERR(inode)) { | 4632 | if (IS_ERR(inode)) { |
4642 | err = PTR_ERR(inode); | 4633 | err = PTR_ERR(inode); |
4643 | goto out_unlock; | 4634 | goto out_unlock; |
@@ -4649,7 +4640,6 @@ static int btrfs_mknod(struct inode *dir, struct dentry *dentry, | |||
4649 | goto out_unlock; | 4640 | goto out_unlock; |
4650 | } | 4641 | } |
4651 | 4642 | ||
4652 | btrfs_set_trans_block_group(trans, inode); | ||
4653 | err = btrfs_add_nondir(trans, dir, dentry, inode, 0, index); | 4643 | err = btrfs_add_nondir(trans, dir, dentry, inode, 0, index); |
4654 | if (err) | 4644 | if (err) |
4655 | drop_inode = 1; | 4645 | drop_inode = 1; |
@@ -4658,8 +4648,6 @@ static int btrfs_mknod(struct inode *dir, struct dentry *dentry, | |||
4658 | init_special_inode(inode, inode->i_mode, rdev); | 4648 | init_special_inode(inode, inode->i_mode, rdev); |
4659 | btrfs_update_inode(trans, root, inode); | 4649 | btrfs_update_inode(trans, root, inode); |
4660 | } | 4650 | } |
4661 | btrfs_update_inode_block_group(trans, inode); | ||
4662 | btrfs_update_inode_block_group(trans, dir); | ||
4663 | out_unlock: | 4651 | out_unlock: |
4664 | nr = trans->blocks_used; | 4652 | nr = trans->blocks_used; |
4665 | btrfs_end_transaction_throttle(trans, root); | 4653 | btrfs_end_transaction_throttle(trans, root); |
@@ -4692,15 +4680,13 @@ static int btrfs_create(struct inode *dir, struct dentry *dentry, | |||
4692 | if (IS_ERR(trans)) | 4680 | if (IS_ERR(trans)) |
4693 | return PTR_ERR(trans); | 4681 | return PTR_ERR(trans); |
4694 | 4682 | ||
4695 | btrfs_set_trans_block_group(trans, dir); | ||
4696 | |||
4697 | err = btrfs_find_free_ino(root, &objectid); | 4683 | err = btrfs_find_free_ino(root, &objectid); |
4698 | if (err) | 4684 | if (err) |
4699 | goto out_unlock; | 4685 | goto out_unlock; |
4700 | 4686 | ||
4701 | inode = btrfs_new_inode(trans, root, dir, dentry->d_name.name, | 4687 | inode = btrfs_new_inode(trans, root, dir, dentry->d_name.name, |
4702 | dentry->d_name.len, btrfs_ino(dir), objectid, | 4688 | dentry->d_name.len, btrfs_ino(dir), objectid, |
4703 | BTRFS_I(dir)->block_group, mode, &index); | 4689 | mode, &index); |
4704 | if (IS_ERR(inode)) { | 4690 | if (IS_ERR(inode)) { |
4705 | err = PTR_ERR(inode); | 4691 | err = PTR_ERR(inode); |
4706 | goto out_unlock; | 4692 | goto out_unlock; |
@@ -4712,7 +4698,6 @@ static int btrfs_create(struct inode *dir, struct dentry *dentry, | |||
4712 | goto out_unlock; | 4698 | goto out_unlock; |
4713 | } | 4699 | } |
4714 | 4700 | ||
4715 | btrfs_set_trans_block_group(trans, inode); | ||
4716 | err = btrfs_add_nondir(trans, dir, dentry, inode, 0, index); | 4701 | err = btrfs_add_nondir(trans, dir, dentry, inode, 0, index); |
4717 | if (err) | 4702 | if (err) |
4718 | drop_inode = 1; | 4703 | drop_inode = 1; |
@@ -4723,8 +4708,6 @@ static int btrfs_create(struct inode *dir, struct dentry *dentry, | |||
4723 | inode->i_op = &btrfs_file_inode_operations; | 4708 | inode->i_op = &btrfs_file_inode_operations; |
4724 | BTRFS_I(inode)->io_tree.ops = &btrfs_extent_io_ops; | 4709 | BTRFS_I(inode)->io_tree.ops = &btrfs_extent_io_ops; |
4725 | } | 4710 | } |
4726 | btrfs_update_inode_block_group(trans, inode); | ||
4727 | btrfs_update_inode_block_group(trans, dir); | ||
4728 | out_unlock: | 4711 | out_unlock: |
4729 | nr = trans->blocks_used; | 4712 | nr = trans->blocks_used; |
4730 | btrfs_end_transaction_throttle(trans, root); | 4713 | btrfs_end_transaction_throttle(trans, root); |
@@ -4771,8 +4754,6 @@ static int btrfs_link(struct dentry *old_dentry, struct inode *dir, | |||
4771 | 4754 | ||
4772 | btrfs_inc_nlink(inode); | 4755 | btrfs_inc_nlink(inode); |
4773 | inode->i_ctime = CURRENT_TIME; | 4756 | inode->i_ctime = CURRENT_TIME; |
4774 | |||
4775 | btrfs_set_trans_block_group(trans, dir); | ||
4776 | ihold(inode); | 4757 | ihold(inode); |
4777 | 4758 | ||
4778 | err = btrfs_add_nondir(trans, dir, dentry, inode, 1, index); | 4759 | err = btrfs_add_nondir(trans, dir, dentry, inode, 1, index); |
@@ -4781,7 +4762,6 @@ static int btrfs_link(struct dentry *old_dentry, struct inode *dir, | |||
4781 | drop_inode = 1; | 4762 | drop_inode = 1; |
4782 | } else { | 4763 | } else { |
4783 | struct dentry *parent = dget_parent(dentry); | 4764 | struct dentry *parent = dget_parent(dentry); |
4784 | btrfs_update_inode_block_group(trans, dir); | ||
4785 | err = btrfs_update_inode(trans, root, inode); | 4765 | err = btrfs_update_inode(trans, root, inode); |
4786 | BUG_ON(err); | 4766 | BUG_ON(err); |
4787 | btrfs_log_new_name(trans, inode, NULL, parent); | 4767 | btrfs_log_new_name(trans, inode, NULL, parent); |
@@ -4818,7 +4798,6 @@ static int btrfs_mkdir(struct inode *dir, struct dentry *dentry, int mode) | |||
4818 | trans = btrfs_start_transaction(root, 5); | 4798 | trans = btrfs_start_transaction(root, 5); |
4819 | if (IS_ERR(trans)) | 4799 | if (IS_ERR(trans)) |
4820 | return PTR_ERR(trans); | 4800 | return PTR_ERR(trans); |
4821 | btrfs_set_trans_block_group(trans, dir); | ||
4822 | 4801 | ||
4823 | err = btrfs_find_free_ino(root, &objectid); | 4802 | err = btrfs_find_free_ino(root, &objectid); |
4824 | if (err) | 4803 | if (err) |
@@ -4826,8 +4805,7 @@ static int btrfs_mkdir(struct inode *dir, struct dentry *dentry, int mode) | |||
4826 | 4805 | ||
4827 | inode = btrfs_new_inode(trans, root, dir, dentry->d_name.name, | 4806 | inode = btrfs_new_inode(trans, root, dir, dentry->d_name.name, |
4828 | dentry->d_name.len, btrfs_ino(dir), objectid, | 4807 | dentry->d_name.len, btrfs_ino(dir), objectid, |
4829 | BTRFS_I(dir)->block_group, S_IFDIR | mode, | 4808 | S_IFDIR | mode, &index); |
4830 | &index); | ||
4831 | if (IS_ERR(inode)) { | 4809 | if (IS_ERR(inode)) { |
4832 | err = PTR_ERR(inode); | 4810 | err = PTR_ERR(inode); |
4833 | goto out_fail; | 4811 | goto out_fail; |
@@ -4841,7 +4819,6 @@ static int btrfs_mkdir(struct inode *dir, struct dentry *dentry, int mode) | |||
4841 | 4819 | ||
4842 | inode->i_op = &btrfs_dir_inode_operations; | 4820 | inode->i_op = &btrfs_dir_inode_operations; |
4843 | inode->i_fop = &btrfs_dir_file_operations; | 4821 | inode->i_fop = &btrfs_dir_file_operations; |
4844 | btrfs_set_trans_block_group(trans, inode); | ||
4845 | 4822 | ||
4846 | btrfs_i_size_write(inode, 0); | 4823 | btrfs_i_size_write(inode, 0); |
4847 | err = btrfs_update_inode(trans, root, inode); | 4824 | err = btrfs_update_inode(trans, root, inode); |
@@ -4855,8 +4832,6 @@ static int btrfs_mkdir(struct inode *dir, struct dentry *dentry, int mode) | |||
4855 | 4832 | ||
4856 | d_instantiate(dentry, inode); | 4833 | d_instantiate(dentry, inode); |
4857 | drop_on_err = 0; | 4834 | drop_on_err = 0; |
4858 | btrfs_update_inode_block_group(trans, inode); | ||
4859 | btrfs_update_inode_block_group(trans, dir); | ||
4860 | 4835 | ||
4861 | out_fail: | 4836 | out_fail: |
4862 | nr = trans->blocks_used; | 4837 | nr = trans->blocks_used; |
@@ -4989,7 +4964,15 @@ again: | |||
4989 | 4964 | ||
4990 | if (!path) { | 4965 | if (!path) { |
4991 | path = btrfs_alloc_path(); | 4966 | path = btrfs_alloc_path(); |
4992 | BUG_ON(!path); | 4967 | if (!path) { |
4968 | err = -ENOMEM; | ||
4969 | goto out; | ||
4970 | } | ||
4971 | /* | ||
4972 | * Chances are we'll be called again, so go ahead and do | ||
4973 | * readahead | ||
4974 | */ | ||
4975 | path->reada = 1; | ||
4993 | } | 4976 | } |
4994 | 4977 | ||
4995 | ret = btrfs_lookup_file_extent(trans, root, path, | 4978 | ret = btrfs_lookup_file_extent(trans, root, path, |
@@ -5130,8 +5113,10 @@ again: | |||
5130 | kunmap(page); | 5113 | kunmap(page); |
5131 | free_extent_map(em); | 5114 | free_extent_map(em); |
5132 | em = NULL; | 5115 | em = NULL; |
5116 | |||
5133 | btrfs_release_path(path); | 5117 | btrfs_release_path(path); |
5134 | trans = btrfs_join_transaction(root, 1); | 5118 | trans = btrfs_join_transaction(root); |
5119 | |||
5135 | if (IS_ERR(trans)) | 5120 | if (IS_ERR(trans)) |
5136 | return ERR_CAST(trans); | 5121 | return ERR_CAST(trans); |
5137 | goto again; | 5122 | goto again; |
@@ -5375,7 +5360,7 @@ static struct extent_map *btrfs_new_extent_direct(struct inode *inode, | |||
5375 | btrfs_drop_extent_cache(inode, start, start + len - 1, 0); | 5360 | btrfs_drop_extent_cache(inode, start, start + len - 1, 0); |
5376 | } | 5361 | } |
5377 | 5362 | ||
5378 | trans = btrfs_join_transaction(root, 0); | 5363 | trans = btrfs_join_transaction(root); |
5379 | if (IS_ERR(trans)) | 5364 | if (IS_ERR(trans)) |
5380 | return ERR_CAST(trans); | 5365 | return ERR_CAST(trans); |
5381 | 5366 | ||
@@ -5611,7 +5596,7 @@ static int btrfs_get_blocks_direct(struct inode *inode, sector_t iblock, | |||
5611 | * to make sure the current transaction stays open | 5596 | * to make sure the current transaction stays open |
5612 | * while we look for nocow cross refs | 5597 | * while we look for nocow cross refs |
5613 | */ | 5598 | */ |
5614 | trans = btrfs_join_transaction(root, 0); | 5599 | trans = btrfs_join_transaction(root); |
5615 | if (IS_ERR(trans)) | 5600 | if (IS_ERR(trans)) |
5616 | goto must_cow; | 5601 | goto must_cow; |
5617 | 5602 | ||
@@ -5750,7 +5735,7 @@ again: | |||
5750 | 5735 | ||
5751 | BUG_ON(!ordered); | 5736 | BUG_ON(!ordered); |
5752 | 5737 | ||
5753 | trans = btrfs_join_transaction(root, 1); | 5738 | trans = btrfs_join_transaction(root); |
5754 | if (IS_ERR(trans)) { | 5739 | if (IS_ERR(trans)) { |
5755 | err = -ENOMEM; | 5740 | err = -ENOMEM; |
5756 | goto out; | 5741 | goto out; |
@@ -6500,6 +6485,7 @@ out: | |||
6500 | static int btrfs_truncate(struct inode *inode) | 6485 | static int btrfs_truncate(struct inode *inode) |
6501 | { | 6486 | { |
6502 | struct btrfs_root *root = BTRFS_I(inode)->root; | 6487 | struct btrfs_root *root = BTRFS_I(inode)->root; |
6488 | struct btrfs_block_rsv *rsv; | ||
6503 | int ret; | 6489 | int ret; |
6504 | int err = 0; | 6490 | int err = 0; |
6505 | struct btrfs_trans_handle *trans; | 6491 | struct btrfs_trans_handle *trans; |
@@ -6513,28 +6499,80 @@ static int btrfs_truncate(struct inode *inode) | |||
6513 | btrfs_wait_ordered_range(inode, inode->i_size & (~mask), (u64)-1); | 6499 | btrfs_wait_ordered_range(inode, inode->i_size & (~mask), (u64)-1); |
6514 | btrfs_ordered_update_i_size(inode, inode->i_size, NULL); | 6500 | btrfs_ordered_update_i_size(inode, inode->i_size, NULL); |
6515 | 6501 | ||
6516 | trans = btrfs_start_transaction(root, 5); | 6502 | /* |
6517 | if (IS_ERR(trans)) | 6503 | * Yes ladies and gentelment, this is indeed ugly. The fact is we have |
6518 | return PTR_ERR(trans); | 6504 | * 3 things going on here |
6505 | * | ||
6506 | * 1) We need to reserve space for our orphan item and the space to | ||
6507 | * delete our orphan item. Lord knows we don't want to have a dangling | ||
6508 | * orphan item because we didn't reserve space to remove it. | ||
6509 | * | ||
6510 | * 2) We need to reserve space to update our inode. | ||
6511 | * | ||
6512 | * 3) We need to have something to cache all the space that is going to | ||
6513 | * be free'd up by the truncate operation, but also have some slack | ||
6514 | * space reserved in case it uses space during the truncate (thank you | ||
6515 | * very much snapshotting). | ||
6516 | * | ||
6517 | * And we need these to all be seperate. The fact is we can use alot of | ||
6518 | * space doing the truncate, and we have no earthly idea how much space | ||
6519 | * we will use, so we need the truncate reservation to be seperate so it | ||
6520 | * doesn't end up using space reserved for updating the inode or | ||
6521 | * removing the orphan item. We also need to be able to stop the | ||
6522 | * transaction and start a new one, which means we need to be able to | ||
6523 | * update the inode several times, and we have no idea of knowing how | ||
6524 | * many times that will be, so we can't just reserve 1 item for the | ||
6525 | * entirety of the opration, so that has to be done seperately as well. | ||
6526 | * Then there is the orphan item, which does indeed need to be held on | ||
6527 | * to for the whole operation, and we need nobody to touch this reserved | ||
6528 | * space except the orphan code. | ||
6529 | * | ||
6530 | * So that leaves us with | ||
6531 | * | ||
6532 | * 1) root->orphan_block_rsv - for the orphan deletion. | ||
6533 | * 2) rsv - for the truncate reservation, which we will steal from the | ||
6534 | * transaction reservation. | ||
6535 | * 3) fs_info->trans_block_rsv - this will have 1 items worth left for | ||
6536 | * updating the inode. | ||
6537 | */ | ||
6538 | rsv = btrfs_alloc_block_rsv(root); | ||
6539 | if (!rsv) | ||
6540 | return -ENOMEM; | ||
6541 | btrfs_add_durable_block_rsv(root->fs_info, rsv); | ||
6519 | 6542 | ||
6520 | btrfs_set_trans_block_group(trans, inode); | 6543 | trans = btrfs_start_transaction(root, 4); |
6544 | if (IS_ERR(trans)) { | ||
6545 | err = PTR_ERR(trans); | ||
6546 | goto out; | ||
6547 | } | ||
6548 | |||
6549 | /* | ||
6550 | * Reserve space for the truncate process. Truncate should be adding | ||
6551 | * space, but if there are snapshots it may end up using space. | ||
6552 | */ | ||
6553 | ret = btrfs_truncate_reserve_metadata(trans, root, rsv); | ||
6554 | BUG_ON(ret); | ||
6521 | 6555 | ||
6522 | ret = btrfs_orphan_add(trans, inode); | 6556 | ret = btrfs_orphan_add(trans, inode); |
6523 | if (ret) { | 6557 | if (ret) { |
6524 | btrfs_end_transaction(trans, root); | 6558 | btrfs_end_transaction(trans, root); |
6525 | return ret; | 6559 | goto out; |
6526 | } | 6560 | } |
6527 | 6561 | ||
6528 | nr = trans->blocks_used; | 6562 | nr = trans->blocks_used; |
6529 | btrfs_end_transaction(trans, root); | 6563 | btrfs_end_transaction(trans, root); |
6530 | btrfs_btree_balance_dirty(root, nr); | 6564 | btrfs_btree_balance_dirty(root, nr); |
6531 | 6565 | ||
6532 | /* Now start a transaction for the truncate */ | 6566 | /* |
6533 | trans = btrfs_start_transaction(root, 0); | 6567 | * Ok so we've already migrated our bytes over for the truncate, so here |
6534 | if (IS_ERR(trans)) | 6568 | * just reserve the one slot we need for updating the inode. |
6535 | return PTR_ERR(trans); | 6569 | */ |
6536 | btrfs_set_trans_block_group(trans, inode); | 6570 | trans = btrfs_start_transaction(root, 1); |
6537 | trans->block_rsv = root->orphan_block_rsv; | 6571 | if (IS_ERR(trans)) { |
6572 | err = PTR_ERR(trans); | ||
6573 | goto out; | ||
6574 | } | ||
6575 | trans->block_rsv = rsv; | ||
6538 | 6576 | ||
6539 | /* | 6577 | /* |
6540 | * setattr is responsible for setting the ordered_data_close flag, | 6578 | * setattr is responsible for setting the ordered_data_close flag, |
@@ -6558,24 +6596,17 @@ static int btrfs_truncate(struct inode *inode) | |||
6558 | 6596 | ||
6559 | while (1) { | 6597 | while (1) { |
6560 | if (!trans) { | 6598 | if (!trans) { |
6561 | trans = btrfs_start_transaction(root, 0); | 6599 | trans = btrfs_start_transaction(root, 3); |
6562 | if (IS_ERR(trans)) | 6600 | if (IS_ERR(trans)) { |
6563 | return PTR_ERR(trans); | 6601 | err = PTR_ERR(trans); |
6564 | btrfs_set_trans_block_group(trans, inode); | 6602 | goto out; |
6565 | trans->block_rsv = root->orphan_block_rsv; | 6603 | } |
6566 | } | ||
6567 | 6604 | ||
6568 | ret = btrfs_block_rsv_check(trans, root, | 6605 | ret = btrfs_truncate_reserve_metadata(trans, root, |
6569 | root->orphan_block_rsv, 0, 5); | 6606 | rsv); |
6570 | if (ret == -EAGAIN) { | 6607 | BUG_ON(ret); |
6571 | ret = btrfs_commit_transaction(trans, root); | 6608 | |
6572 | if (ret) | 6609 | trans->block_rsv = rsv; |
6573 | return ret; | ||
6574 | trans = NULL; | ||
6575 | continue; | ||
6576 | } else if (ret) { | ||
6577 | err = ret; | ||
6578 | break; | ||
6579 | } | 6610 | } |
6580 | 6611 | ||
6581 | ret = btrfs_truncate_inode_items(trans, root, inode, | 6612 | ret = btrfs_truncate_inode_items(trans, root, inode, |
@@ -6586,6 +6617,7 @@ static int btrfs_truncate(struct inode *inode) | |||
6586 | break; | 6617 | break; |
6587 | } | 6618 | } |
6588 | 6619 | ||
6620 | trans->block_rsv = &root->fs_info->trans_block_rsv; | ||
6589 | ret = btrfs_update_inode(trans, root, inode); | 6621 | ret = btrfs_update_inode(trans, root, inode); |
6590 | if (ret) { | 6622 | if (ret) { |
6591 | err = ret; | 6623 | err = ret; |
@@ -6599,6 +6631,7 @@ static int btrfs_truncate(struct inode *inode) | |||
6599 | } | 6631 | } |
6600 | 6632 | ||
6601 | if (ret == 0 && inode->i_nlink > 0) { | 6633 | if (ret == 0 && inode->i_nlink > 0) { |
6634 | trans->block_rsv = root->orphan_block_rsv; | ||
6602 | ret = btrfs_orphan_del(trans, inode); | 6635 | ret = btrfs_orphan_del(trans, inode); |
6603 | if (ret) | 6636 | if (ret) |
6604 | err = ret; | 6637 | err = ret; |
@@ -6610,15 +6643,20 @@ static int btrfs_truncate(struct inode *inode) | |||
6610 | ret = btrfs_orphan_del(NULL, inode); | 6643 | ret = btrfs_orphan_del(NULL, inode); |
6611 | } | 6644 | } |
6612 | 6645 | ||
6646 | trans->block_rsv = &root->fs_info->trans_block_rsv; | ||
6613 | ret = btrfs_update_inode(trans, root, inode); | 6647 | ret = btrfs_update_inode(trans, root, inode); |
6614 | if (ret && !err) | 6648 | if (ret && !err) |
6615 | err = ret; | 6649 | err = ret; |
6616 | 6650 | ||
6617 | nr = trans->blocks_used; | 6651 | nr = trans->blocks_used; |
6618 | ret = btrfs_end_transaction_throttle(trans, root); | 6652 | ret = btrfs_end_transaction_throttle(trans, root); |
6653 | btrfs_btree_balance_dirty(root, nr); | ||
6654 | |||
6655 | out: | ||
6656 | btrfs_free_block_rsv(root, rsv); | ||
6657 | |||
6619 | if (ret && !err) | 6658 | if (ret && !err) |
6620 | err = ret; | 6659 | err = ret; |
6621 | btrfs_btree_balance_dirty(root, nr); | ||
6622 | 6660 | ||
6623 | return err; | 6661 | return err; |
6624 | } | 6662 | } |
@@ -6627,15 +6665,14 @@ static int btrfs_truncate(struct inode *inode) | |||
6627 | * create a new subvolume directory/inode (helper for the ioctl). | 6665 | * create a new subvolume directory/inode (helper for the ioctl). |
6628 | */ | 6666 | */ |
6629 | int btrfs_create_subvol_root(struct btrfs_trans_handle *trans, | 6667 | int btrfs_create_subvol_root(struct btrfs_trans_handle *trans, |
6630 | struct btrfs_root *new_root, | 6668 | struct btrfs_root *new_root, u64 new_dirid) |
6631 | u64 new_dirid, u64 alloc_hint) | ||
6632 | { | 6669 | { |
6633 | struct inode *inode; | 6670 | struct inode *inode; |
6634 | int err; | 6671 | int err; |
6635 | u64 index = 0; | 6672 | u64 index = 0; |
6636 | 6673 | ||
6637 | inode = btrfs_new_inode(trans, new_root, NULL, "..", 2, new_dirid, | 6674 | inode = btrfs_new_inode(trans, new_root, NULL, "..", 2, new_dirid, |
6638 | new_dirid, alloc_hint, S_IFDIR | 0700, &index); | 6675 | new_dirid, S_IFDIR | 0700, &index); |
6639 | if (IS_ERR(inode)) | 6676 | if (IS_ERR(inode)) |
6640 | return PTR_ERR(inode); | 6677 | return PTR_ERR(inode); |
6641 | inode->i_op = &btrfs_dir_inode_operations; | 6678 | inode->i_op = &btrfs_dir_inode_operations; |
@@ -6748,21 +6785,6 @@ void btrfs_destroy_inode(struct inode *inode) | |||
6748 | spin_unlock(&root->fs_info->ordered_extent_lock); | 6785 | spin_unlock(&root->fs_info->ordered_extent_lock); |
6749 | } | 6786 | } |
6750 | 6787 | ||
6751 | if (root == root->fs_info->tree_root) { | ||
6752 | struct btrfs_block_group_cache *block_group; | ||
6753 | |||
6754 | block_group = btrfs_lookup_block_group(root->fs_info, | ||
6755 | BTRFS_I(inode)->block_group); | ||
6756 | if (block_group && block_group->inode == inode) { | ||
6757 | spin_lock(&block_group->lock); | ||
6758 | block_group->inode = NULL; | ||
6759 | spin_unlock(&block_group->lock); | ||
6760 | btrfs_put_block_group(block_group); | ||
6761 | } else if (block_group) { | ||
6762 | btrfs_put_block_group(block_group); | ||
6763 | } | ||
6764 | } | ||
6765 | |||
6766 | spin_lock(&root->orphan_lock); | 6788 | spin_lock(&root->orphan_lock); |
6767 | if (!list_empty(&BTRFS_I(inode)->i_orphan)) { | 6789 | if (!list_empty(&BTRFS_I(inode)->i_orphan)) { |
6768 | printk(KERN_INFO "BTRFS: inode %llu still on the orphan list\n", | 6790 | printk(KERN_INFO "BTRFS: inode %llu still on the orphan list\n", |
@@ -6948,8 +6970,6 @@ static int btrfs_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
6948 | goto out_notrans; | 6970 | goto out_notrans; |
6949 | } | 6971 | } |
6950 | 6972 | ||
6951 | btrfs_set_trans_block_group(trans, new_dir); | ||
6952 | |||
6953 | if (dest != root) | 6973 | if (dest != root) |
6954 | btrfs_record_root_in_trans(trans, dest); | 6974 | btrfs_record_root_in_trans(trans, dest); |
6955 | 6975 | ||
@@ -7131,16 +7151,13 @@ static int btrfs_symlink(struct inode *dir, struct dentry *dentry, | |||
7131 | if (IS_ERR(trans)) | 7151 | if (IS_ERR(trans)) |
7132 | return PTR_ERR(trans); | 7152 | return PTR_ERR(trans); |
7133 | 7153 | ||
7134 | btrfs_set_trans_block_group(trans, dir); | ||
7135 | |||
7136 | err = btrfs_find_free_ino(root, &objectid); | 7154 | err = btrfs_find_free_ino(root, &objectid); |
7137 | if (err) | 7155 | if (err) |
7138 | goto out_unlock; | 7156 | goto out_unlock; |
7139 | 7157 | ||
7140 | inode = btrfs_new_inode(trans, root, dir, dentry->d_name.name, | 7158 | inode = btrfs_new_inode(trans, root, dir, dentry->d_name.name, |
7141 | dentry->d_name.len, btrfs_ino(dir), objectid, | 7159 | dentry->d_name.len, btrfs_ino(dir), objectid, |
7142 | BTRFS_I(dir)->block_group, S_IFLNK|S_IRWXUGO, | 7160 | S_IFLNK|S_IRWXUGO, &index); |
7143 | &index); | ||
7144 | if (IS_ERR(inode)) { | 7161 | if (IS_ERR(inode)) { |
7145 | err = PTR_ERR(inode); | 7162 | err = PTR_ERR(inode); |
7146 | goto out_unlock; | 7163 | goto out_unlock; |
@@ -7152,7 +7169,6 @@ static int btrfs_symlink(struct inode *dir, struct dentry *dentry, | |||
7152 | goto out_unlock; | 7169 | goto out_unlock; |
7153 | } | 7170 | } |
7154 | 7171 | ||
7155 | btrfs_set_trans_block_group(trans, inode); | ||
7156 | err = btrfs_add_nondir(trans, dir, dentry, inode, 0, index); | 7172 | err = btrfs_add_nondir(trans, dir, dentry, inode, 0, index); |
7157 | if (err) | 7173 | if (err) |
7158 | drop_inode = 1; | 7174 | drop_inode = 1; |
@@ -7163,8 +7179,6 @@ static int btrfs_symlink(struct inode *dir, struct dentry *dentry, | |||
7163 | inode->i_op = &btrfs_file_inode_operations; | 7179 | inode->i_op = &btrfs_file_inode_operations; |
7164 | BTRFS_I(inode)->io_tree.ops = &btrfs_extent_io_ops; | 7180 | BTRFS_I(inode)->io_tree.ops = &btrfs_extent_io_ops; |
7165 | } | 7181 | } |
7166 | btrfs_update_inode_block_group(trans, inode); | ||
7167 | btrfs_update_inode_block_group(trans, dir); | ||
7168 | if (drop_inode) | 7182 | if (drop_inode) |
7169 | goto out_unlock; | 7183 | goto out_unlock; |
7170 | 7184 | ||
diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c index 85e818ce00c5..74c80595d707 100644 --- a/fs/btrfs/ioctl.c +++ b/fs/btrfs/ioctl.c | |||
@@ -243,7 +243,7 @@ static int btrfs_ioctl_setflags(struct file *file, void __user *arg) | |||
243 | ip->flags &= ~(BTRFS_INODE_COMPRESS | BTRFS_INODE_NOCOMPRESS); | 243 | ip->flags &= ~(BTRFS_INODE_COMPRESS | BTRFS_INODE_NOCOMPRESS); |
244 | } | 244 | } |
245 | 245 | ||
246 | trans = btrfs_join_transaction(root, 1); | 246 | trans = btrfs_join_transaction(root); |
247 | BUG_ON(IS_ERR(trans)); | 247 | BUG_ON(IS_ERR(trans)); |
248 | 248 | ||
249 | ret = btrfs_update_inode(trans, root, inode); | 249 | ret = btrfs_update_inode(trans, root, inode); |
@@ -414,8 +414,7 @@ static noinline int create_subvol(struct btrfs_root *root, | |||
414 | 414 | ||
415 | btrfs_record_root_in_trans(trans, new_root); | 415 | btrfs_record_root_in_trans(trans, new_root); |
416 | 416 | ||
417 | ret = btrfs_create_subvol_root(trans, new_root, new_dirid, | 417 | ret = btrfs_create_subvol_root(trans, new_root, new_dirid); |
418 | BTRFS_I(dir)->block_group); | ||
419 | /* | 418 | /* |
420 | * insert the directory item | 419 | * insert the directory item |
421 | */ | 420 | */ |
@@ -2489,12 +2488,10 @@ static long btrfs_ioctl_trans_start(struct file *file) | |||
2489 | if (ret) | 2488 | if (ret) |
2490 | goto out; | 2489 | goto out; |
2491 | 2490 | ||
2492 | mutex_lock(&root->fs_info->trans_mutex); | 2491 | atomic_inc(&root->fs_info->open_ioctl_trans); |
2493 | root->fs_info->open_ioctl_trans++; | ||
2494 | mutex_unlock(&root->fs_info->trans_mutex); | ||
2495 | 2492 | ||
2496 | ret = -ENOMEM; | 2493 | ret = -ENOMEM; |
2497 | trans = btrfs_start_ioctl_transaction(root, 0); | 2494 | trans = btrfs_start_ioctl_transaction(root); |
2498 | if (IS_ERR(trans)) | 2495 | if (IS_ERR(trans)) |
2499 | goto out_drop; | 2496 | goto out_drop; |
2500 | 2497 | ||
@@ -2502,9 +2499,7 @@ static long btrfs_ioctl_trans_start(struct file *file) | |||
2502 | return 0; | 2499 | return 0; |
2503 | 2500 | ||
2504 | out_drop: | 2501 | out_drop: |
2505 | mutex_lock(&root->fs_info->trans_mutex); | 2502 | atomic_dec(&root->fs_info->open_ioctl_trans); |
2506 | root->fs_info->open_ioctl_trans--; | ||
2507 | mutex_unlock(&root->fs_info->trans_mutex); | ||
2508 | mnt_drop_write(file->f_path.mnt); | 2503 | mnt_drop_write(file->f_path.mnt); |
2509 | out: | 2504 | out: |
2510 | return ret; | 2505 | return ret; |
@@ -2738,9 +2733,7 @@ long btrfs_ioctl_trans_end(struct file *file) | |||
2738 | 2733 | ||
2739 | btrfs_end_transaction(trans, root); | 2734 | btrfs_end_transaction(trans, root); |
2740 | 2735 | ||
2741 | mutex_lock(&root->fs_info->trans_mutex); | 2736 | atomic_dec(&root->fs_info->open_ioctl_trans); |
2742 | root->fs_info->open_ioctl_trans--; | ||
2743 | mutex_unlock(&root->fs_info->trans_mutex); | ||
2744 | 2737 | ||
2745 | mnt_drop_write(file->f_path.mnt); | 2738 | mnt_drop_write(file->f_path.mnt); |
2746 | return 0; | 2739 | return 0; |
diff --git a/fs/btrfs/relocation.c b/fs/btrfs/relocation.c index fa2c5d87f219..f25b10a22a0a 100644 --- a/fs/btrfs/relocation.c +++ b/fs/btrfs/relocation.c | |||
@@ -677,6 +677,8 @@ struct backref_node *build_backref_tree(struct reloc_control *rc, | |||
677 | err = -ENOMEM; | 677 | err = -ENOMEM; |
678 | goto out; | 678 | goto out; |
679 | } | 679 | } |
680 | path1->reada = 1; | ||
681 | path2->reada = 2; | ||
680 | 682 | ||
681 | node = alloc_backref_node(cache); | 683 | node = alloc_backref_node(cache); |
682 | if (!node) { | 684 | if (!node) { |
@@ -1999,6 +2001,7 @@ static noinline_for_stack int merge_reloc_root(struct reloc_control *rc, | |||
1999 | path = btrfs_alloc_path(); | 2001 | path = btrfs_alloc_path(); |
2000 | if (!path) | 2002 | if (!path) |
2001 | return -ENOMEM; | 2003 | return -ENOMEM; |
2004 | path->reada = 1; | ||
2002 | 2005 | ||
2003 | reloc_root = root->reloc_root; | 2006 | reloc_root = root->reloc_root; |
2004 | root_item = &reloc_root->root_item; | 2007 | root_item = &reloc_root->root_item; |
@@ -2139,10 +2142,10 @@ int prepare_to_merge(struct reloc_control *rc, int err) | |||
2139 | u64 num_bytes = 0; | 2142 | u64 num_bytes = 0; |
2140 | int ret; | 2143 | int ret; |
2141 | 2144 | ||
2142 | mutex_lock(&root->fs_info->trans_mutex); | 2145 | spin_lock(&root->fs_info->trans_lock); |
2143 | rc->merging_rsv_size += root->nodesize * (BTRFS_MAX_LEVEL - 1) * 2; | 2146 | rc->merging_rsv_size += root->nodesize * (BTRFS_MAX_LEVEL - 1) * 2; |
2144 | rc->merging_rsv_size += rc->nodes_relocated * 2; | 2147 | rc->merging_rsv_size += rc->nodes_relocated * 2; |
2145 | mutex_unlock(&root->fs_info->trans_mutex); | 2148 | spin_unlock(&root->fs_info->trans_lock); |
2146 | again: | 2149 | again: |
2147 | if (!err) { | 2150 | if (!err) { |
2148 | num_bytes = rc->merging_rsv_size; | 2151 | num_bytes = rc->merging_rsv_size; |
@@ -2152,7 +2155,7 @@ again: | |||
2152 | err = ret; | 2155 | err = ret; |
2153 | } | 2156 | } |
2154 | 2157 | ||
2155 | trans = btrfs_join_transaction(rc->extent_root, 1); | 2158 | trans = btrfs_join_transaction(rc->extent_root); |
2156 | if (IS_ERR(trans)) { | 2159 | if (IS_ERR(trans)) { |
2157 | if (!err) | 2160 | if (!err) |
2158 | btrfs_block_rsv_release(rc->extent_root, | 2161 | btrfs_block_rsv_release(rc->extent_root, |
@@ -2211,9 +2214,9 @@ int merge_reloc_roots(struct reloc_control *rc) | |||
2211 | int ret; | 2214 | int ret; |
2212 | again: | 2215 | again: |
2213 | root = rc->extent_root; | 2216 | root = rc->extent_root; |
2214 | mutex_lock(&root->fs_info->trans_mutex); | 2217 | spin_lock(&root->fs_info->trans_lock); |
2215 | list_splice_init(&rc->reloc_roots, &reloc_roots); | 2218 | list_splice_init(&rc->reloc_roots, &reloc_roots); |
2216 | mutex_unlock(&root->fs_info->trans_mutex); | 2219 | spin_unlock(&root->fs_info->trans_lock); |
2217 | 2220 | ||
2218 | while (!list_empty(&reloc_roots)) { | 2221 | while (!list_empty(&reloc_roots)) { |
2219 | found = 1; | 2222 | found = 1; |
@@ -3236,7 +3239,7 @@ truncate: | |||
3236 | goto out; | 3239 | goto out; |
3237 | } | 3240 | } |
3238 | 3241 | ||
3239 | trans = btrfs_join_transaction(root, 0); | 3242 | trans = btrfs_join_transaction(root); |
3240 | if (IS_ERR(trans)) { | 3243 | if (IS_ERR(trans)) { |
3241 | btrfs_free_path(path); | 3244 | btrfs_free_path(path); |
3242 | ret = PTR_ERR(trans); | 3245 | ret = PTR_ERR(trans); |
@@ -3300,6 +3303,7 @@ static int find_data_references(struct reloc_control *rc, | |||
3300 | path = btrfs_alloc_path(); | 3303 | path = btrfs_alloc_path(); |
3301 | if (!path) | 3304 | if (!path) |
3302 | return -ENOMEM; | 3305 | return -ENOMEM; |
3306 | path->reada = 1; | ||
3303 | 3307 | ||
3304 | root = read_fs_root(rc->extent_root->fs_info, ref_root); | 3308 | root = read_fs_root(rc->extent_root->fs_info, ref_root); |
3305 | if (IS_ERR(root)) { | 3309 | if (IS_ERR(root)) { |
@@ -3586,17 +3590,17 @@ next: | |||
3586 | static void set_reloc_control(struct reloc_control *rc) | 3590 | static void set_reloc_control(struct reloc_control *rc) |
3587 | { | 3591 | { |
3588 | struct btrfs_fs_info *fs_info = rc->extent_root->fs_info; | 3592 | struct btrfs_fs_info *fs_info = rc->extent_root->fs_info; |
3589 | mutex_lock(&fs_info->trans_mutex); | 3593 | spin_lock(&fs_info->trans_lock); |
3590 | fs_info->reloc_ctl = rc; | 3594 | fs_info->reloc_ctl = rc; |
3591 | mutex_unlock(&fs_info->trans_mutex); | 3595 | spin_unlock(&fs_info->trans_lock); |
3592 | } | 3596 | } |
3593 | 3597 | ||
3594 | static void unset_reloc_control(struct reloc_control *rc) | 3598 | static void unset_reloc_control(struct reloc_control *rc) |
3595 | { | 3599 | { |
3596 | struct btrfs_fs_info *fs_info = rc->extent_root->fs_info; | 3600 | struct btrfs_fs_info *fs_info = rc->extent_root->fs_info; |
3597 | mutex_lock(&fs_info->trans_mutex); | 3601 | spin_lock(&fs_info->trans_lock); |
3598 | fs_info->reloc_ctl = NULL; | 3602 | fs_info->reloc_ctl = NULL; |
3599 | mutex_unlock(&fs_info->trans_mutex); | 3603 | spin_unlock(&fs_info->trans_lock); |
3600 | } | 3604 | } |
3601 | 3605 | ||
3602 | static int check_extent_flags(u64 flags) | 3606 | static int check_extent_flags(u64 flags) |
@@ -3645,7 +3649,7 @@ int prepare_to_relocate(struct reloc_control *rc) | |||
3645 | rc->create_reloc_tree = 1; | 3649 | rc->create_reloc_tree = 1; |
3646 | set_reloc_control(rc); | 3650 | set_reloc_control(rc); |
3647 | 3651 | ||
3648 | trans = btrfs_join_transaction(rc->extent_root, 1); | 3652 | trans = btrfs_join_transaction(rc->extent_root); |
3649 | BUG_ON(IS_ERR(trans)); | 3653 | BUG_ON(IS_ERR(trans)); |
3650 | btrfs_commit_transaction(trans, rc->extent_root); | 3654 | btrfs_commit_transaction(trans, rc->extent_root); |
3651 | return 0; | 3655 | return 0; |
@@ -3668,6 +3672,7 @@ static noinline_for_stack int relocate_block_group(struct reloc_control *rc) | |||
3668 | path = btrfs_alloc_path(); | 3672 | path = btrfs_alloc_path(); |
3669 | if (!path) | 3673 | if (!path) |
3670 | return -ENOMEM; | 3674 | return -ENOMEM; |
3675 | path->reada = 1; | ||
3671 | 3676 | ||
3672 | ret = prepare_to_relocate(rc); | 3677 | ret = prepare_to_relocate(rc); |
3673 | if (ret) { | 3678 | if (ret) { |
@@ -3834,7 +3839,7 @@ restart: | |||
3834 | btrfs_block_rsv_release(rc->extent_root, rc->block_rsv, (u64)-1); | 3839 | btrfs_block_rsv_release(rc->extent_root, rc->block_rsv, (u64)-1); |
3835 | 3840 | ||
3836 | /* get rid of pinned extents */ | 3841 | /* get rid of pinned extents */ |
3837 | trans = btrfs_join_transaction(rc->extent_root, 1); | 3842 | trans = btrfs_join_transaction(rc->extent_root); |
3838 | if (IS_ERR(trans)) | 3843 | if (IS_ERR(trans)) |
3839 | err = PTR_ERR(trans); | 3844 | err = PTR_ERR(trans); |
3840 | else | 3845 | else |
@@ -4093,6 +4098,7 @@ int btrfs_recover_relocation(struct btrfs_root *root) | |||
4093 | path = btrfs_alloc_path(); | 4098 | path = btrfs_alloc_path(); |
4094 | if (!path) | 4099 | if (!path) |
4095 | return -ENOMEM; | 4100 | return -ENOMEM; |
4101 | path->reada = -1; | ||
4096 | 4102 | ||
4097 | key.objectid = BTRFS_TREE_RELOC_OBJECTID; | 4103 | key.objectid = BTRFS_TREE_RELOC_OBJECTID; |
4098 | key.type = BTRFS_ROOT_ITEM_KEY; | 4104 | key.type = BTRFS_ROOT_ITEM_KEY; |
@@ -4159,7 +4165,7 @@ int btrfs_recover_relocation(struct btrfs_root *root) | |||
4159 | 4165 | ||
4160 | set_reloc_control(rc); | 4166 | set_reloc_control(rc); |
4161 | 4167 | ||
4162 | trans = btrfs_join_transaction(rc->extent_root, 1); | 4168 | trans = btrfs_join_transaction(rc->extent_root); |
4163 | if (IS_ERR(trans)) { | 4169 | if (IS_ERR(trans)) { |
4164 | unset_reloc_control(rc); | 4170 | unset_reloc_control(rc); |
4165 | err = PTR_ERR(trans); | 4171 | err = PTR_ERR(trans); |
@@ -4193,7 +4199,7 @@ int btrfs_recover_relocation(struct btrfs_root *root) | |||
4193 | 4199 | ||
4194 | unset_reloc_control(rc); | 4200 | unset_reloc_control(rc); |
4195 | 4201 | ||
4196 | trans = btrfs_join_transaction(rc->extent_root, 1); | 4202 | trans = btrfs_join_transaction(rc->extent_root); |
4197 | if (IS_ERR(trans)) | 4203 | if (IS_ERR(trans)) |
4198 | err = PTR_ERR(trans); | 4204 | err = PTR_ERR(trans); |
4199 | else | 4205 | else |
diff --git a/fs/btrfs/transaction.c b/fs/btrfs/transaction.c index dc80f7156923..2d5c6d2aa4e4 100644 --- a/fs/btrfs/transaction.c +++ b/fs/btrfs/transaction.c | |||
@@ -35,6 +35,7 @@ static noinline void put_transaction(struct btrfs_transaction *transaction) | |||
35 | { | 35 | { |
36 | WARN_ON(atomic_read(&transaction->use_count) == 0); | 36 | WARN_ON(atomic_read(&transaction->use_count) == 0); |
37 | if (atomic_dec_and_test(&transaction->use_count)) { | 37 | if (atomic_dec_and_test(&transaction->use_count)) { |
38 | BUG_ON(!list_empty(&transaction->list)); | ||
38 | memset(transaction, 0, sizeof(*transaction)); | 39 | memset(transaction, 0, sizeof(*transaction)); |
39 | kmem_cache_free(btrfs_transaction_cachep, transaction); | 40 | kmem_cache_free(btrfs_transaction_cachep, transaction); |
40 | } | 41 | } |
@@ -49,46 +50,72 @@ static noinline void switch_commit_root(struct btrfs_root *root) | |||
49 | /* | 50 | /* |
50 | * either allocate a new transaction or hop into the existing one | 51 | * either allocate a new transaction or hop into the existing one |
51 | */ | 52 | */ |
52 | static noinline int join_transaction(struct btrfs_root *root) | 53 | static noinline int join_transaction(struct btrfs_root *root, int nofail) |
53 | { | 54 | { |
54 | struct btrfs_transaction *cur_trans; | 55 | struct btrfs_transaction *cur_trans; |
56 | |||
57 | spin_lock(&root->fs_info->trans_lock); | ||
58 | if (root->fs_info->trans_no_join) { | ||
59 | if (!nofail) { | ||
60 | spin_unlock(&root->fs_info->trans_lock); | ||
61 | return -EBUSY; | ||
62 | } | ||
63 | } | ||
64 | |||
55 | cur_trans = root->fs_info->running_transaction; | 65 | cur_trans = root->fs_info->running_transaction; |
56 | if (!cur_trans) { | 66 | if (cur_trans) { |
57 | cur_trans = kmem_cache_alloc(btrfs_transaction_cachep, | 67 | atomic_inc(&cur_trans->use_count); |
58 | GFP_NOFS); | ||
59 | if (!cur_trans) | ||
60 | return -ENOMEM; | ||
61 | root->fs_info->generation++; | ||
62 | atomic_set(&cur_trans->num_writers, 1); | ||
63 | cur_trans->num_joined = 0; | ||
64 | cur_trans->transid = root->fs_info->generation; | ||
65 | init_waitqueue_head(&cur_trans->writer_wait); | ||
66 | init_waitqueue_head(&cur_trans->commit_wait); | ||
67 | cur_trans->in_commit = 0; | ||
68 | cur_trans->blocked = 0; | ||
69 | atomic_set(&cur_trans->use_count, 1); | ||
70 | cur_trans->commit_done = 0; | ||
71 | cur_trans->start_time = get_seconds(); | ||
72 | |||
73 | cur_trans->delayed_refs.root = RB_ROOT; | ||
74 | cur_trans->delayed_refs.num_entries = 0; | ||
75 | cur_trans->delayed_refs.num_heads_ready = 0; | ||
76 | cur_trans->delayed_refs.num_heads = 0; | ||
77 | cur_trans->delayed_refs.flushing = 0; | ||
78 | cur_trans->delayed_refs.run_delayed_start = 0; | ||
79 | spin_lock_init(&cur_trans->delayed_refs.lock); | ||
80 | |||
81 | INIT_LIST_HEAD(&cur_trans->pending_snapshots); | ||
82 | list_add_tail(&cur_trans->list, &root->fs_info->trans_list); | ||
83 | extent_io_tree_init(&cur_trans->dirty_pages, | ||
84 | root->fs_info->btree_inode->i_mapping); | ||
85 | spin_lock(&root->fs_info->new_trans_lock); | ||
86 | root->fs_info->running_transaction = cur_trans; | ||
87 | spin_unlock(&root->fs_info->new_trans_lock); | ||
88 | } else { | ||
89 | atomic_inc(&cur_trans->num_writers); | 68 | atomic_inc(&cur_trans->num_writers); |
90 | cur_trans->num_joined++; | 69 | cur_trans->num_joined++; |
70 | spin_unlock(&root->fs_info->trans_lock); | ||
71 | return 0; | ||
91 | } | 72 | } |
73 | spin_unlock(&root->fs_info->trans_lock); | ||
74 | |||
75 | cur_trans = kmem_cache_alloc(btrfs_transaction_cachep, GFP_NOFS); | ||
76 | if (!cur_trans) | ||
77 | return -ENOMEM; | ||
78 | spin_lock(&root->fs_info->trans_lock); | ||
79 | if (root->fs_info->running_transaction) { | ||
80 | kmem_cache_free(btrfs_transaction_cachep, cur_trans); | ||
81 | cur_trans = root->fs_info->running_transaction; | ||
82 | atomic_inc(&cur_trans->use_count); | ||
83 | atomic_inc(&cur_trans->num_writers); | ||
84 | cur_trans->num_joined++; | ||
85 | spin_unlock(&root->fs_info->trans_lock); | ||
86 | return 0; | ||
87 | } | ||
88 | atomic_set(&cur_trans->num_writers, 1); | ||
89 | cur_trans->num_joined = 0; | ||
90 | init_waitqueue_head(&cur_trans->writer_wait); | ||
91 | init_waitqueue_head(&cur_trans->commit_wait); | ||
92 | cur_trans->in_commit = 0; | ||
93 | cur_trans->blocked = 0; | ||
94 | /* | ||
95 | * One for this trans handle, one so it will live on until we | ||
96 | * commit the transaction. | ||
97 | */ | ||
98 | atomic_set(&cur_trans->use_count, 2); | ||
99 | cur_trans->commit_done = 0; | ||
100 | cur_trans->start_time = get_seconds(); | ||
101 | |||
102 | cur_trans->delayed_refs.root = RB_ROOT; | ||
103 | cur_trans->delayed_refs.num_entries = 0; | ||
104 | cur_trans->delayed_refs.num_heads_ready = 0; | ||
105 | cur_trans->delayed_refs.num_heads = 0; | ||
106 | cur_trans->delayed_refs.flushing = 0; | ||
107 | cur_trans->delayed_refs.run_delayed_start = 0; | ||
108 | spin_lock_init(&cur_trans->commit_lock); | ||
109 | spin_lock_init(&cur_trans->delayed_refs.lock); | ||
110 | |||
111 | INIT_LIST_HEAD(&cur_trans->pending_snapshots); | ||
112 | list_add_tail(&cur_trans->list, &root->fs_info->trans_list); | ||
113 | extent_io_tree_init(&cur_trans->dirty_pages, | ||
114 | root->fs_info->btree_inode->i_mapping); | ||
115 | root->fs_info->generation++; | ||
116 | cur_trans->transid = root->fs_info->generation; | ||
117 | root->fs_info->running_transaction = cur_trans; | ||
118 | spin_unlock(&root->fs_info->trans_lock); | ||
92 | 119 | ||
93 | return 0; | 120 | return 0; |
94 | } | 121 | } |
@@ -99,39 +126,28 @@ static noinline int join_transaction(struct btrfs_root *root) | |||
99 | * to make sure the old root from before we joined the transaction is deleted | 126 | * to make sure the old root from before we joined the transaction is deleted |
100 | * when the transaction commits | 127 | * when the transaction commits |
101 | */ | 128 | */ |
102 | static noinline int record_root_in_trans(struct btrfs_trans_handle *trans, | 129 | int btrfs_record_root_in_trans(struct btrfs_trans_handle *trans, |
103 | struct btrfs_root *root) | 130 | struct btrfs_root *root) |
104 | { | 131 | { |
105 | if (root->ref_cows && root->last_trans < trans->transid) { | 132 | if (root->ref_cows && root->last_trans < trans->transid) { |
106 | WARN_ON(root == root->fs_info->extent_root); | 133 | WARN_ON(root == root->fs_info->extent_root); |
107 | WARN_ON(root->commit_root != root->node); | 134 | WARN_ON(root->commit_root != root->node); |
108 | 135 | ||
136 | spin_lock(&root->fs_info->fs_roots_radix_lock); | ||
137 | if (root->last_trans == trans->transid) { | ||
138 | spin_unlock(&root->fs_info->fs_roots_radix_lock); | ||
139 | return 0; | ||
140 | } | ||
141 | root->last_trans = trans->transid; | ||
109 | radix_tree_tag_set(&root->fs_info->fs_roots_radix, | 142 | radix_tree_tag_set(&root->fs_info->fs_roots_radix, |
110 | (unsigned long)root->root_key.objectid, | 143 | (unsigned long)root->root_key.objectid, |
111 | BTRFS_ROOT_TRANS_TAG); | 144 | BTRFS_ROOT_TRANS_TAG); |
112 | root->last_trans = trans->transid; | 145 | spin_unlock(&root->fs_info->fs_roots_radix_lock); |
113 | btrfs_init_reloc_root(trans, root); | 146 | btrfs_init_reloc_root(trans, root); |
114 | } | 147 | } |
115 | return 0; | 148 | return 0; |
116 | } | 149 | } |
117 | 150 | ||
118 | int btrfs_record_root_in_trans(struct btrfs_trans_handle *trans, | ||
119 | struct btrfs_root *root) | ||
120 | { | ||
121 | if (!root->ref_cows) | ||
122 | return 0; | ||
123 | |||
124 | mutex_lock(&root->fs_info->trans_mutex); | ||
125 | if (root->last_trans == trans->transid) { | ||
126 | mutex_unlock(&root->fs_info->trans_mutex); | ||
127 | return 0; | ||
128 | } | ||
129 | |||
130 | record_root_in_trans(trans, root); | ||
131 | mutex_unlock(&root->fs_info->trans_mutex); | ||
132 | return 0; | ||
133 | } | ||
134 | |||
135 | /* wait for commit against the current transaction to become unblocked | 151 | /* wait for commit against the current transaction to become unblocked |
136 | * when this is done, it is safe to start a new transaction, but the current | 152 | * when this is done, it is safe to start a new transaction, but the current |
137 | * transaction might not be fully on disk. | 153 | * transaction might not be fully on disk. |
@@ -140,21 +156,23 @@ static void wait_current_trans(struct btrfs_root *root) | |||
140 | { | 156 | { |
141 | struct btrfs_transaction *cur_trans; | 157 | struct btrfs_transaction *cur_trans; |
142 | 158 | ||
159 | spin_lock(&root->fs_info->trans_lock); | ||
143 | cur_trans = root->fs_info->running_transaction; | 160 | cur_trans = root->fs_info->running_transaction; |
144 | if (cur_trans && cur_trans->blocked) { | 161 | if (cur_trans && cur_trans->blocked) { |
145 | DEFINE_WAIT(wait); | 162 | DEFINE_WAIT(wait); |
146 | atomic_inc(&cur_trans->use_count); | 163 | atomic_inc(&cur_trans->use_count); |
164 | spin_unlock(&root->fs_info->trans_lock); | ||
147 | while (1) { | 165 | while (1) { |
148 | prepare_to_wait(&root->fs_info->transaction_wait, &wait, | 166 | prepare_to_wait(&root->fs_info->transaction_wait, &wait, |
149 | TASK_UNINTERRUPTIBLE); | 167 | TASK_UNINTERRUPTIBLE); |
150 | if (!cur_trans->blocked) | 168 | if (!cur_trans->blocked) |
151 | break; | 169 | break; |
152 | mutex_unlock(&root->fs_info->trans_mutex); | ||
153 | schedule(); | 170 | schedule(); |
154 | mutex_lock(&root->fs_info->trans_mutex); | ||
155 | } | 171 | } |
156 | finish_wait(&root->fs_info->transaction_wait, &wait); | 172 | finish_wait(&root->fs_info->transaction_wait, &wait); |
157 | put_transaction(cur_trans); | 173 | put_transaction(cur_trans); |
174 | } else { | ||
175 | spin_unlock(&root->fs_info->trans_lock); | ||
158 | } | 176 | } |
159 | } | 177 | } |
160 | 178 | ||
@@ -167,10 +185,16 @@ enum btrfs_trans_type { | |||
167 | 185 | ||
168 | static int may_wait_transaction(struct btrfs_root *root, int type) | 186 | static int may_wait_transaction(struct btrfs_root *root, int type) |
169 | { | 187 | { |
170 | if (!root->fs_info->log_root_recovering && | 188 | if (root->fs_info->log_root_recovering) |
171 | ((type == TRANS_START && !root->fs_info->open_ioctl_trans) || | 189 | return 0; |
172 | type == TRANS_USERSPACE)) | 190 | |
191 | if (type == TRANS_USERSPACE) | ||
192 | return 1; | ||
193 | |||
194 | if (type == TRANS_START && | ||
195 | !atomic_read(&root->fs_info->open_ioctl_trans)) | ||
173 | return 1; | 196 | return 1; |
197 | |||
174 | return 0; | 198 | return 0; |
175 | } | 199 | } |
176 | 200 | ||
@@ -184,36 +208,44 @@ static struct btrfs_trans_handle *start_transaction(struct btrfs_root *root, | |||
184 | 208 | ||
185 | if (root->fs_info->fs_state & BTRFS_SUPER_FLAG_ERROR) | 209 | if (root->fs_info->fs_state & BTRFS_SUPER_FLAG_ERROR) |
186 | return ERR_PTR(-EROFS); | 210 | return ERR_PTR(-EROFS); |
211 | |||
212 | if (current->journal_info) { | ||
213 | WARN_ON(type != TRANS_JOIN && type != TRANS_JOIN_NOLOCK); | ||
214 | h = current->journal_info; | ||
215 | h->use_count++; | ||
216 | h->orig_rsv = h->block_rsv; | ||
217 | h->block_rsv = NULL; | ||
218 | goto got_it; | ||
219 | } | ||
187 | again: | 220 | again: |
188 | h = kmem_cache_alloc(btrfs_trans_handle_cachep, GFP_NOFS); | 221 | h = kmem_cache_alloc(btrfs_trans_handle_cachep, GFP_NOFS); |
189 | if (!h) | 222 | if (!h) |
190 | return ERR_PTR(-ENOMEM); | 223 | return ERR_PTR(-ENOMEM); |
191 | 224 | ||
192 | if (type != TRANS_JOIN_NOLOCK) | ||
193 | mutex_lock(&root->fs_info->trans_mutex); | ||
194 | if (may_wait_transaction(root, type)) | 225 | if (may_wait_transaction(root, type)) |
195 | wait_current_trans(root); | 226 | wait_current_trans(root); |
196 | 227 | ||
197 | ret = join_transaction(root); | 228 | do { |
229 | ret = join_transaction(root, type == TRANS_JOIN_NOLOCK); | ||
230 | if (ret == -EBUSY) | ||
231 | wait_current_trans(root); | ||
232 | } while (ret == -EBUSY); | ||
233 | |||
198 | if (ret < 0) { | 234 | if (ret < 0) { |
199 | kmem_cache_free(btrfs_trans_handle_cachep, h); | 235 | kmem_cache_free(btrfs_trans_handle_cachep, h); |
200 | if (type != TRANS_JOIN_NOLOCK) | ||
201 | mutex_unlock(&root->fs_info->trans_mutex); | ||
202 | return ERR_PTR(ret); | 236 | return ERR_PTR(ret); |
203 | } | 237 | } |
204 | 238 | ||
205 | cur_trans = root->fs_info->running_transaction; | 239 | cur_trans = root->fs_info->running_transaction; |
206 | atomic_inc(&cur_trans->use_count); | ||
207 | if (type != TRANS_JOIN_NOLOCK) | ||
208 | mutex_unlock(&root->fs_info->trans_mutex); | ||
209 | 240 | ||
210 | h->transid = cur_trans->transid; | 241 | h->transid = cur_trans->transid; |
211 | h->transaction = cur_trans; | 242 | h->transaction = cur_trans; |
212 | h->blocks_used = 0; | 243 | h->blocks_used = 0; |
213 | h->block_group = 0; | ||
214 | h->bytes_reserved = 0; | 244 | h->bytes_reserved = 0; |
215 | h->delayed_ref_updates = 0; | 245 | h->delayed_ref_updates = 0; |
246 | h->use_count = 1; | ||
216 | h->block_rsv = NULL; | 247 | h->block_rsv = NULL; |
248 | h->orig_rsv = NULL; | ||
217 | 249 | ||
218 | smp_mb(); | 250 | smp_mb(); |
219 | if (cur_trans->blocked && may_wait_transaction(root, type)) { | 251 | if (cur_trans->blocked && may_wait_transaction(root, type)) { |
@@ -241,11 +273,8 @@ again: | |||
241 | } | 273 | } |
242 | } | 274 | } |
243 | 275 | ||
244 | if (type != TRANS_JOIN_NOLOCK) | 276 | got_it: |
245 | mutex_lock(&root->fs_info->trans_mutex); | 277 | btrfs_record_root_in_trans(h, root); |
246 | record_root_in_trans(h, root); | ||
247 | if (type != TRANS_JOIN_NOLOCK) | ||
248 | mutex_unlock(&root->fs_info->trans_mutex); | ||
249 | 278 | ||
250 | if (!current->journal_info && type != TRANS_USERSPACE) | 279 | if (!current->journal_info && type != TRANS_USERSPACE) |
251 | current->journal_info = h; | 280 | current->journal_info = h; |
@@ -257,22 +286,19 @@ struct btrfs_trans_handle *btrfs_start_transaction(struct btrfs_root *root, | |||
257 | { | 286 | { |
258 | return start_transaction(root, num_items, TRANS_START); | 287 | return start_transaction(root, num_items, TRANS_START); |
259 | } | 288 | } |
260 | struct btrfs_trans_handle *btrfs_join_transaction(struct btrfs_root *root, | 289 | struct btrfs_trans_handle *btrfs_join_transaction(struct btrfs_root *root) |
261 | int num_blocks) | ||
262 | { | 290 | { |
263 | return start_transaction(root, 0, TRANS_JOIN); | 291 | return start_transaction(root, 0, TRANS_JOIN); |
264 | } | 292 | } |
265 | 293 | ||
266 | struct btrfs_trans_handle *btrfs_join_transaction_nolock(struct btrfs_root *root, | 294 | struct btrfs_trans_handle *btrfs_join_transaction_nolock(struct btrfs_root *root) |
267 | int num_blocks) | ||
268 | { | 295 | { |
269 | return start_transaction(root, 0, TRANS_JOIN_NOLOCK); | 296 | return start_transaction(root, 0, TRANS_JOIN_NOLOCK); |
270 | } | 297 | } |
271 | 298 | ||
272 | struct btrfs_trans_handle *btrfs_start_ioctl_transaction(struct btrfs_root *r, | 299 | struct btrfs_trans_handle *btrfs_start_ioctl_transaction(struct btrfs_root *root) |
273 | int num_blocks) | ||
274 | { | 300 | { |
275 | return start_transaction(r, 0, TRANS_USERSPACE); | 301 | return start_transaction(root, 0, TRANS_USERSPACE); |
276 | } | 302 | } |
277 | 303 | ||
278 | /* wait for a transaction commit to be fully complete */ | 304 | /* wait for a transaction commit to be fully complete */ |
@@ -280,17 +306,13 @@ static noinline int wait_for_commit(struct btrfs_root *root, | |||
280 | struct btrfs_transaction *commit) | 306 | struct btrfs_transaction *commit) |
281 | { | 307 | { |
282 | DEFINE_WAIT(wait); | 308 | DEFINE_WAIT(wait); |
283 | mutex_lock(&root->fs_info->trans_mutex); | ||
284 | while (!commit->commit_done) { | 309 | while (!commit->commit_done) { |
285 | prepare_to_wait(&commit->commit_wait, &wait, | 310 | prepare_to_wait(&commit->commit_wait, &wait, |
286 | TASK_UNINTERRUPTIBLE); | 311 | TASK_UNINTERRUPTIBLE); |
287 | if (commit->commit_done) | 312 | if (commit->commit_done) |
288 | break; | 313 | break; |
289 | mutex_unlock(&root->fs_info->trans_mutex); | ||
290 | schedule(); | 314 | schedule(); |
291 | mutex_lock(&root->fs_info->trans_mutex); | ||
292 | } | 315 | } |
293 | mutex_unlock(&root->fs_info->trans_mutex); | ||
294 | finish_wait(&commit->commit_wait, &wait); | 316 | finish_wait(&commit->commit_wait, &wait); |
295 | return 0; | 317 | return 0; |
296 | } | 318 | } |
@@ -300,59 +322,56 @@ int btrfs_wait_for_commit(struct btrfs_root *root, u64 transid) | |||
300 | struct btrfs_transaction *cur_trans = NULL, *t; | 322 | struct btrfs_transaction *cur_trans = NULL, *t; |
301 | int ret; | 323 | int ret; |
302 | 324 | ||
303 | mutex_lock(&root->fs_info->trans_mutex); | ||
304 | |||
305 | ret = 0; | 325 | ret = 0; |
306 | if (transid) { | 326 | if (transid) { |
307 | if (transid <= root->fs_info->last_trans_committed) | 327 | if (transid <= root->fs_info->last_trans_committed) |
308 | goto out_unlock; | 328 | goto out; |
309 | 329 | ||
310 | /* find specified transaction */ | 330 | /* find specified transaction */ |
331 | spin_lock(&root->fs_info->trans_lock); | ||
311 | list_for_each_entry(t, &root->fs_info->trans_list, list) { | 332 | list_for_each_entry(t, &root->fs_info->trans_list, list) { |
312 | if (t->transid == transid) { | 333 | if (t->transid == transid) { |
313 | cur_trans = t; | 334 | cur_trans = t; |
335 | atomic_inc(&cur_trans->use_count); | ||
314 | break; | 336 | break; |
315 | } | 337 | } |
316 | if (t->transid > transid) | 338 | if (t->transid > transid) |
317 | break; | 339 | break; |
318 | } | 340 | } |
341 | spin_unlock(&root->fs_info->trans_lock); | ||
319 | ret = -EINVAL; | 342 | ret = -EINVAL; |
320 | if (!cur_trans) | 343 | if (!cur_trans) |
321 | goto out_unlock; /* bad transid */ | 344 | goto out; /* bad transid */ |
322 | } else { | 345 | } else { |
323 | /* find newest transaction that is committing | committed */ | 346 | /* find newest transaction that is committing | committed */ |
347 | spin_lock(&root->fs_info->trans_lock); | ||
324 | list_for_each_entry_reverse(t, &root->fs_info->trans_list, | 348 | list_for_each_entry_reverse(t, &root->fs_info->trans_list, |
325 | list) { | 349 | list) { |
326 | if (t->in_commit) { | 350 | if (t->in_commit) { |
327 | if (t->commit_done) | 351 | if (t->commit_done) |
328 | goto out_unlock; | 352 | goto out; |
329 | cur_trans = t; | 353 | cur_trans = t; |
354 | atomic_inc(&cur_trans->use_count); | ||
330 | break; | 355 | break; |
331 | } | 356 | } |
332 | } | 357 | } |
358 | spin_unlock(&root->fs_info->trans_lock); | ||
333 | if (!cur_trans) | 359 | if (!cur_trans) |
334 | goto out_unlock; /* nothing committing|committed */ | 360 | goto out; /* nothing committing|committed */ |
335 | } | 361 | } |
336 | 362 | ||
337 | atomic_inc(&cur_trans->use_count); | ||
338 | mutex_unlock(&root->fs_info->trans_mutex); | ||
339 | |||
340 | wait_for_commit(root, cur_trans); | 363 | wait_for_commit(root, cur_trans); |
341 | 364 | ||
342 | mutex_lock(&root->fs_info->trans_mutex); | ||
343 | put_transaction(cur_trans); | 365 | put_transaction(cur_trans); |
344 | ret = 0; | 366 | ret = 0; |
345 | out_unlock: | 367 | out: |
346 | mutex_unlock(&root->fs_info->trans_mutex); | ||
347 | return ret; | 368 | return ret; |
348 | } | 369 | } |
349 | 370 | ||
350 | void btrfs_throttle(struct btrfs_root *root) | 371 | void btrfs_throttle(struct btrfs_root *root) |
351 | { | 372 | { |
352 | mutex_lock(&root->fs_info->trans_mutex); | 373 | if (!atomic_read(&root->fs_info->open_ioctl_trans)) |
353 | if (!root->fs_info->open_ioctl_trans) | ||
354 | wait_current_trans(root); | 374 | wait_current_trans(root); |
355 | mutex_unlock(&root->fs_info->trans_mutex); | ||
356 | } | 375 | } |
357 | 376 | ||
358 | static int should_end_transaction(struct btrfs_trans_handle *trans, | 377 | static int should_end_transaction(struct btrfs_trans_handle *trans, |
@@ -370,6 +389,7 @@ int btrfs_should_end_transaction(struct btrfs_trans_handle *trans, | |||
370 | struct btrfs_transaction *cur_trans = trans->transaction; | 389 | struct btrfs_transaction *cur_trans = trans->transaction; |
371 | int updates; | 390 | int updates; |
372 | 391 | ||
392 | smp_mb(); | ||
373 | if (cur_trans->blocked || cur_trans->delayed_refs.flushing) | 393 | if (cur_trans->blocked || cur_trans->delayed_refs.flushing) |
374 | return 1; | 394 | return 1; |
375 | 395 | ||
@@ -388,6 +408,11 @@ static int __btrfs_end_transaction(struct btrfs_trans_handle *trans, | |||
388 | struct btrfs_fs_info *info = root->fs_info; | 408 | struct btrfs_fs_info *info = root->fs_info; |
389 | int count = 0; | 409 | int count = 0; |
390 | 410 | ||
411 | if (--trans->use_count) { | ||
412 | trans->block_rsv = trans->orig_rsv; | ||
413 | return 0; | ||
414 | } | ||
415 | |||
391 | while (count < 4) { | 416 | while (count < 4) { |
392 | unsigned long cur = trans->delayed_ref_updates; | 417 | unsigned long cur = trans->delayed_ref_updates; |
393 | trans->delayed_ref_updates = 0; | 418 | trans->delayed_ref_updates = 0; |
@@ -410,9 +435,11 @@ static int __btrfs_end_transaction(struct btrfs_trans_handle *trans, | |||
410 | 435 | ||
411 | btrfs_trans_release_metadata(trans, root); | 436 | btrfs_trans_release_metadata(trans, root); |
412 | 437 | ||
413 | if (lock && !root->fs_info->open_ioctl_trans && | 438 | if (lock && !atomic_read(&root->fs_info->open_ioctl_trans) && |
414 | should_end_transaction(trans, root)) | 439 | should_end_transaction(trans, root)) { |
415 | trans->transaction->blocked = 1; | 440 | trans->transaction->blocked = 1; |
441 | smp_wmb(); | ||
442 | } | ||
416 | 443 | ||
417 | if (lock && cur_trans->blocked && !cur_trans->in_commit) { | 444 | if (lock && cur_trans->blocked && !cur_trans->in_commit) { |
418 | if (throttle) | 445 | if (throttle) |
@@ -703,9 +730,9 @@ static noinline int commit_cowonly_roots(struct btrfs_trans_handle *trans, | |||
703 | */ | 730 | */ |
704 | int btrfs_add_dead_root(struct btrfs_root *root) | 731 | int btrfs_add_dead_root(struct btrfs_root *root) |
705 | { | 732 | { |
706 | mutex_lock(&root->fs_info->trans_mutex); | 733 | spin_lock(&root->fs_info->trans_lock); |
707 | list_add(&root->root_list, &root->fs_info->dead_roots); | 734 | list_add(&root->root_list, &root->fs_info->dead_roots); |
708 | mutex_unlock(&root->fs_info->trans_mutex); | 735 | spin_unlock(&root->fs_info->trans_lock); |
709 | return 0; | 736 | return 0; |
710 | } | 737 | } |
711 | 738 | ||
@@ -721,6 +748,7 @@ static noinline int commit_fs_roots(struct btrfs_trans_handle *trans, | |||
721 | int ret; | 748 | int ret; |
722 | int err = 0; | 749 | int err = 0; |
723 | 750 | ||
751 | spin_lock(&fs_info->fs_roots_radix_lock); | ||
724 | while (1) { | 752 | while (1) { |
725 | ret = radix_tree_gang_lookup_tag(&fs_info->fs_roots_radix, | 753 | ret = radix_tree_gang_lookup_tag(&fs_info->fs_roots_radix, |
726 | (void **)gang, 0, | 754 | (void **)gang, 0, |
@@ -733,6 +761,7 @@ static noinline int commit_fs_roots(struct btrfs_trans_handle *trans, | |||
733 | radix_tree_tag_clear(&fs_info->fs_roots_radix, | 761 | radix_tree_tag_clear(&fs_info->fs_roots_radix, |
734 | (unsigned long)root->root_key.objectid, | 762 | (unsigned long)root->root_key.objectid, |
735 | BTRFS_ROOT_TRANS_TAG); | 763 | BTRFS_ROOT_TRANS_TAG); |
764 | spin_unlock(&fs_info->fs_roots_radix_lock); | ||
736 | 765 | ||
737 | btrfs_free_log(trans, root); | 766 | btrfs_free_log(trans, root); |
738 | btrfs_update_reloc_root(trans, root); | 767 | btrfs_update_reloc_root(trans, root); |
@@ -753,10 +782,12 @@ static noinline int commit_fs_roots(struct btrfs_trans_handle *trans, | |||
753 | err = btrfs_update_root(trans, fs_info->tree_root, | 782 | err = btrfs_update_root(trans, fs_info->tree_root, |
754 | &root->root_key, | 783 | &root->root_key, |
755 | &root->root_item); | 784 | &root->root_item); |
785 | spin_lock(&fs_info->fs_roots_radix_lock); | ||
756 | if (err) | 786 | if (err) |
757 | break; | 787 | break; |
758 | } | 788 | } |
759 | } | 789 | } |
790 | spin_unlock(&fs_info->fs_roots_radix_lock); | ||
760 | return err; | 791 | return err; |
761 | } | 792 | } |
762 | 793 | ||
@@ -851,7 +882,7 @@ static noinline int create_pending_snapshot(struct btrfs_trans_handle *trans, | |||
851 | parent = dget_parent(dentry); | 882 | parent = dget_parent(dentry); |
852 | parent_inode = parent->d_inode; | 883 | parent_inode = parent->d_inode; |
853 | parent_root = BTRFS_I(parent_inode)->root; | 884 | parent_root = BTRFS_I(parent_inode)->root; |
854 | record_root_in_trans(trans, parent_root); | 885 | btrfs_record_root_in_trans(trans, parent_root); |
855 | 886 | ||
856 | /* | 887 | /* |
857 | * insert the directory item | 888 | * insert the directory item |
@@ -869,7 +900,7 @@ static noinline int create_pending_snapshot(struct btrfs_trans_handle *trans, | |||
869 | ret = btrfs_update_inode(trans, parent_root, parent_inode); | 900 | ret = btrfs_update_inode(trans, parent_root, parent_inode); |
870 | BUG_ON(ret); | 901 | BUG_ON(ret); |
871 | 902 | ||
872 | record_root_in_trans(trans, root); | 903 | btrfs_record_root_in_trans(trans, root); |
873 | btrfs_set_root_last_snapshot(&root->root_item, trans->transid); | 904 | btrfs_set_root_last_snapshot(&root->root_item, trans->transid); |
874 | memcpy(new_root_item, &root->root_item, sizeof(*new_root_item)); | 905 | memcpy(new_root_item, &root->root_item, sizeof(*new_root_item)); |
875 | btrfs_check_and_init_root_item(new_root_item); | 906 | btrfs_check_and_init_root_item(new_root_item); |
@@ -967,20 +998,20 @@ static void update_super_roots(struct btrfs_root *root) | |||
967 | int btrfs_transaction_in_commit(struct btrfs_fs_info *info) | 998 | int btrfs_transaction_in_commit(struct btrfs_fs_info *info) |
968 | { | 999 | { |
969 | int ret = 0; | 1000 | int ret = 0; |
970 | spin_lock(&info->new_trans_lock); | 1001 | spin_lock(&info->trans_lock); |
971 | if (info->running_transaction) | 1002 | if (info->running_transaction) |
972 | ret = info->running_transaction->in_commit; | 1003 | ret = info->running_transaction->in_commit; |
973 | spin_unlock(&info->new_trans_lock); | 1004 | spin_unlock(&info->trans_lock); |
974 | return ret; | 1005 | return ret; |
975 | } | 1006 | } |
976 | 1007 | ||
977 | int btrfs_transaction_blocked(struct btrfs_fs_info *info) | 1008 | int btrfs_transaction_blocked(struct btrfs_fs_info *info) |
978 | { | 1009 | { |
979 | int ret = 0; | 1010 | int ret = 0; |
980 | spin_lock(&info->new_trans_lock); | 1011 | spin_lock(&info->trans_lock); |
981 | if (info->running_transaction) | 1012 | if (info->running_transaction) |
982 | ret = info->running_transaction->blocked; | 1013 | ret = info->running_transaction->blocked; |
983 | spin_unlock(&info->new_trans_lock); | 1014 | spin_unlock(&info->trans_lock); |
984 | return ret; | 1015 | return ret; |
985 | } | 1016 | } |
986 | 1017 | ||
@@ -1004,9 +1035,7 @@ static void wait_current_trans_commit_start(struct btrfs_root *root, | |||
1004 | &wait); | 1035 | &wait); |
1005 | break; | 1036 | break; |
1006 | } | 1037 | } |
1007 | mutex_unlock(&root->fs_info->trans_mutex); | ||
1008 | schedule(); | 1038 | schedule(); |
1009 | mutex_lock(&root->fs_info->trans_mutex); | ||
1010 | finish_wait(&root->fs_info->transaction_blocked_wait, &wait); | 1039 | finish_wait(&root->fs_info->transaction_blocked_wait, &wait); |
1011 | } | 1040 | } |
1012 | } | 1041 | } |
@@ -1032,9 +1061,7 @@ static void wait_current_trans_commit_start_and_unblock(struct btrfs_root *root, | |||
1032 | &wait); | 1061 | &wait); |
1033 | break; | 1062 | break; |
1034 | } | 1063 | } |
1035 | mutex_unlock(&root->fs_info->trans_mutex); | ||
1036 | schedule(); | 1064 | schedule(); |
1037 | mutex_lock(&root->fs_info->trans_mutex); | ||
1038 | finish_wait(&root->fs_info->transaction_wait, | 1065 | finish_wait(&root->fs_info->transaction_wait, |
1039 | &wait); | 1066 | &wait); |
1040 | } | 1067 | } |
@@ -1072,7 +1099,7 @@ int btrfs_commit_transaction_async(struct btrfs_trans_handle *trans, | |||
1072 | 1099 | ||
1073 | INIT_DELAYED_WORK(&ac->work, do_async_commit); | 1100 | INIT_DELAYED_WORK(&ac->work, do_async_commit); |
1074 | ac->root = root; | 1101 | ac->root = root; |
1075 | ac->newtrans = btrfs_join_transaction(root, 0); | 1102 | ac->newtrans = btrfs_join_transaction(root); |
1076 | if (IS_ERR(ac->newtrans)) { | 1103 | if (IS_ERR(ac->newtrans)) { |
1077 | int err = PTR_ERR(ac->newtrans); | 1104 | int err = PTR_ERR(ac->newtrans); |
1078 | kfree(ac); | 1105 | kfree(ac); |
@@ -1080,22 +1107,18 @@ int btrfs_commit_transaction_async(struct btrfs_trans_handle *trans, | |||
1080 | } | 1107 | } |
1081 | 1108 | ||
1082 | /* take transaction reference */ | 1109 | /* take transaction reference */ |
1083 | mutex_lock(&root->fs_info->trans_mutex); | ||
1084 | cur_trans = trans->transaction; | 1110 | cur_trans = trans->transaction; |
1085 | atomic_inc(&cur_trans->use_count); | 1111 | atomic_inc(&cur_trans->use_count); |
1086 | mutex_unlock(&root->fs_info->trans_mutex); | ||
1087 | 1112 | ||
1088 | btrfs_end_transaction(trans, root); | 1113 | btrfs_end_transaction(trans, root); |
1089 | schedule_delayed_work(&ac->work, 0); | 1114 | schedule_delayed_work(&ac->work, 0); |
1090 | 1115 | ||
1091 | /* wait for transaction to start and unblock */ | 1116 | /* wait for transaction to start and unblock */ |
1092 | mutex_lock(&root->fs_info->trans_mutex); | ||
1093 | if (wait_for_unblock) | 1117 | if (wait_for_unblock) |
1094 | wait_current_trans_commit_start_and_unblock(root, cur_trans); | 1118 | wait_current_trans_commit_start_and_unblock(root, cur_trans); |
1095 | else | 1119 | else |
1096 | wait_current_trans_commit_start(root, cur_trans); | 1120 | wait_current_trans_commit_start(root, cur_trans); |
1097 | put_transaction(cur_trans); | 1121 | put_transaction(cur_trans); |
1098 | mutex_unlock(&root->fs_info->trans_mutex); | ||
1099 | 1122 | ||
1100 | return 0; | 1123 | return 0; |
1101 | } | 1124 | } |
@@ -1139,38 +1162,41 @@ int btrfs_commit_transaction(struct btrfs_trans_handle *trans, | |||
1139 | ret = btrfs_run_delayed_refs(trans, root, 0); | 1162 | ret = btrfs_run_delayed_refs(trans, root, 0); |
1140 | BUG_ON(ret); | 1163 | BUG_ON(ret); |
1141 | 1164 | ||
1142 | mutex_lock(&root->fs_info->trans_mutex); | 1165 | spin_lock(&cur_trans->commit_lock); |
1143 | if (cur_trans->in_commit) { | 1166 | if (cur_trans->in_commit) { |
1167 | spin_unlock(&cur_trans->commit_lock); | ||
1144 | atomic_inc(&cur_trans->use_count); | 1168 | atomic_inc(&cur_trans->use_count); |
1145 | mutex_unlock(&root->fs_info->trans_mutex); | ||
1146 | btrfs_end_transaction(trans, root); | 1169 | btrfs_end_transaction(trans, root); |
1147 | 1170 | ||
1148 | ret = wait_for_commit(root, cur_trans); | 1171 | ret = wait_for_commit(root, cur_trans); |
1149 | BUG_ON(ret); | 1172 | BUG_ON(ret); |
1150 | 1173 | ||
1151 | mutex_lock(&root->fs_info->trans_mutex); | ||
1152 | put_transaction(cur_trans); | 1174 | put_transaction(cur_trans); |
1153 | mutex_unlock(&root->fs_info->trans_mutex); | ||
1154 | 1175 | ||
1155 | return 0; | 1176 | return 0; |
1156 | } | 1177 | } |
1157 | 1178 | ||
1158 | trans->transaction->in_commit = 1; | 1179 | trans->transaction->in_commit = 1; |
1159 | trans->transaction->blocked = 1; | 1180 | trans->transaction->blocked = 1; |
1181 | spin_unlock(&cur_trans->commit_lock); | ||
1160 | wake_up(&root->fs_info->transaction_blocked_wait); | 1182 | wake_up(&root->fs_info->transaction_blocked_wait); |
1161 | 1183 | ||
1184 | spin_lock(&root->fs_info->trans_lock); | ||
1162 | if (cur_trans->list.prev != &root->fs_info->trans_list) { | 1185 | if (cur_trans->list.prev != &root->fs_info->trans_list) { |
1163 | prev_trans = list_entry(cur_trans->list.prev, | 1186 | prev_trans = list_entry(cur_trans->list.prev, |
1164 | struct btrfs_transaction, list); | 1187 | struct btrfs_transaction, list); |
1165 | if (!prev_trans->commit_done) { | 1188 | if (!prev_trans->commit_done) { |
1166 | atomic_inc(&prev_trans->use_count); | 1189 | atomic_inc(&prev_trans->use_count); |
1167 | mutex_unlock(&root->fs_info->trans_mutex); | 1190 | spin_unlock(&root->fs_info->trans_lock); |
1168 | 1191 | ||
1169 | wait_for_commit(root, prev_trans); | 1192 | wait_for_commit(root, prev_trans); |
1170 | 1193 | ||
1171 | mutex_lock(&root->fs_info->trans_mutex); | ||
1172 | put_transaction(prev_trans); | 1194 | put_transaction(prev_trans); |
1195 | } else { | ||
1196 | spin_unlock(&root->fs_info->trans_lock); | ||
1173 | } | 1197 | } |
1198 | } else { | ||
1199 | spin_unlock(&root->fs_info->trans_lock); | ||
1174 | } | 1200 | } |
1175 | 1201 | ||
1176 | if (now < cur_trans->start_time || now - cur_trans->start_time < 1) | 1202 | if (now < cur_trans->start_time || now - cur_trans->start_time < 1) |
@@ -1178,12 +1204,12 @@ int btrfs_commit_transaction(struct btrfs_trans_handle *trans, | |||
1178 | 1204 | ||
1179 | do { | 1205 | do { |
1180 | int snap_pending = 0; | 1206 | int snap_pending = 0; |
1207 | |||
1181 | joined = cur_trans->num_joined; | 1208 | joined = cur_trans->num_joined; |
1182 | if (!list_empty(&trans->transaction->pending_snapshots)) | 1209 | if (!list_empty(&trans->transaction->pending_snapshots)) |
1183 | snap_pending = 1; | 1210 | snap_pending = 1; |
1184 | 1211 | ||
1185 | WARN_ON(cur_trans != trans->transaction); | 1212 | WARN_ON(cur_trans != trans->transaction); |
1186 | mutex_unlock(&root->fs_info->trans_mutex); | ||
1187 | 1213 | ||
1188 | if (flush_on_commit || snap_pending) { | 1214 | if (flush_on_commit || snap_pending) { |
1189 | btrfs_start_delalloc_inodes(root, 1); | 1215 | btrfs_start_delalloc_inodes(root, 1); |
@@ -1206,14 +1232,15 @@ int btrfs_commit_transaction(struct btrfs_trans_handle *trans, | |||
1206 | prepare_to_wait(&cur_trans->writer_wait, &wait, | 1232 | prepare_to_wait(&cur_trans->writer_wait, &wait, |
1207 | TASK_UNINTERRUPTIBLE); | 1233 | TASK_UNINTERRUPTIBLE); |
1208 | 1234 | ||
1209 | smp_mb(); | ||
1210 | if (atomic_read(&cur_trans->num_writers) > 1) | 1235 | if (atomic_read(&cur_trans->num_writers) > 1) |
1211 | schedule_timeout(MAX_SCHEDULE_TIMEOUT); | 1236 | schedule_timeout(MAX_SCHEDULE_TIMEOUT); |
1212 | else if (should_grow) | 1237 | else if (should_grow) |
1213 | schedule_timeout(1); | 1238 | schedule_timeout(1); |
1214 | 1239 | ||
1215 | mutex_lock(&root->fs_info->trans_mutex); | ||
1216 | finish_wait(&cur_trans->writer_wait, &wait); | 1240 | finish_wait(&cur_trans->writer_wait, &wait); |
1241 | spin_lock(&root->fs_info->trans_lock); | ||
1242 | root->fs_info->trans_no_join = 1; | ||
1243 | spin_unlock(&root->fs_info->trans_lock); | ||
1217 | } while (atomic_read(&cur_trans->num_writers) > 1 || | 1244 | } while (atomic_read(&cur_trans->num_writers) > 1 || |
1218 | (should_grow && cur_trans->num_joined != joined)); | 1245 | (should_grow && cur_trans->num_joined != joined)); |
1219 | 1246 | ||
@@ -1258,9 +1285,6 @@ int btrfs_commit_transaction(struct btrfs_trans_handle *trans, | |||
1258 | btrfs_prepare_extent_commit(trans, root); | 1285 | btrfs_prepare_extent_commit(trans, root); |
1259 | 1286 | ||
1260 | cur_trans = root->fs_info->running_transaction; | 1287 | cur_trans = root->fs_info->running_transaction; |
1261 | spin_lock(&root->fs_info->new_trans_lock); | ||
1262 | root->fs_info->running_transaction = NULL; | ||
1263 | spin_unlock(&root->fs_info->new_trans_lock); | ||
1264 | 1288 | ||
1265 | btrfs_set_root_node(&root->fs_info->tree_root->root_item, | 1289 | btrfs_set_root_node(&root->fs_info->tree_root->root_item, |
1266 | root->fs_info->tree_root->node); | 1290 | root->fs_info->tree_root->node); |
@@ -1281,10 +1305,13 @@ int btrfs_commit_transaction(struct btrfs_trans_handle *trans, | |||
1281 | sizeof(root->fs_info->super_copy)); | 1305 | sizeof(root->fs_info->super_copy)); |
1282 | 1306 | ||
1283 | trans->transaction->blocked = 0; | 1307 | trans->transaction->blocked = 0; |
1308 | spin_lock(&root->fs_info->trans_lock); | ||
1309 | root->fs_info->running_transaction = NULL; | ||
1310 | root->fs_info->trans_no_join = 0; | ||
1311 | spin_unlock(&root->fs_info->trans_lock); | ||
1284 | 1312 | ||
1285 | wake_up(&root->fs_info->transaction_wait); | 1313 | wake_up(&root->fs_info->transaction_wait); |
1286 | 1314 | ||
1287 | mutex_unlock(&root->fs_info->trans_mutex); | ||
1288 | ret = btrfs_write_and_wait_transaction(trans, root); | 1315 | ret = btrfs_write_and_wait_transaction(trans, root); |
1289 | BUG_ON(ret); | 1316 | BUG_ON(ret); |
1290 | write_ctree_super(trans, root, 0); | 1317 | write_ctree_super(trans, root, 0); |
@@ -1297,22 +1324,21 @@ int btrfs_commit_transaction(struct btrfs_trans_handle *trans, | |||
1297 | 1324 | ||
1298 | btrfs_finish_extent_commit(trans, root); | 1325 | btrfs_finish_extent_commit(trans, root); |
1299 | 1326 | ||
1300 | mutex_lock(&root->fs_info->trans_mutex); | ||
1301 | |||
1302 | cur_trans->commit_done = 1; | 1327 | cur_trans->commit_done = 1; |
1303 | 1328 | ||
1304 | root->fs_info->last_trans_committed = cur_trans->transid; | 1329 | root->fs_info->last_trans_committed = cur_trans->transid; |
1305 | 1330 | ||
1306 | wake_up(&cur_trans->commit_wait); | 1331 | wake_up(&cur_trans->commit_wait); |
1307 | 1332 | ||
1333 | spin_lock(&root->fs_info->trans_lock); | ||
1308 | list_del_init(&cur_trans->list); | 1334 | list_del_init(&cur_trans->list); |
1335 | spin_unlock(&root->fs_info->trans_lock); | ||
1336 | |||
1309 | put_transaction(cur_trans); | 1337 | put_transaction(cur_trans); |
1310 | put_transaction(cur_trans); | 1338 | put_transaction(cur_trans); |
1311 | 1339 | ||
1312 | trace_btrfs_transaction_commit(root); | 1340 | trace_btrfs_transaction_commit(root); |
1313 | 1341 | ||
1314 | mutex_unlock(&root->fs_info->trans_mutex); | ||
1315 | |||
1316 | btrfs_scrub_continue(root); | 1342 | btrfs_scrub_continue(root); |
1317 | 1343 | ||
1318 | if (current->journal_info == trans) | 1344 | if (current->journal_info == trans) |
@@ -1334,9 +1360,9 @@ int btrfs_clean_old_snapshots(struct btrfs_root *root) | |||
1334 | LIST_HEAD(list); | 1360 | LIST_HEAD(list); |
1335 | struct btrfs_fs_info *fs_info = root->fs_info; | 1361 | struct btrfs_fs_info *fs_info = root->fs_info; |
1336 | 1362 | ||
1337 | mutex_lock(&fs_info->trans_mutex); | 1363 | spin_lock(&fs_info->trans_lock); |
1338 | list_splice_init(&fs_info->dead_roots, &list); | 1364 | list_splice_init(&fs_info->dead_roots, &list); |
1339 | mutex_unlock(&fs_info->trans_mutex); | 1365 | spin_unlock(&fs_info->trans_lock); |
1340 | 1366 | ||
1341 | while (!list_empty(&list)) { | 1367 | while (!list_empty(&list)) { |
1342 | root = list_entry(list.next, struct btrfs_root, root_list); | 1368 | root = list_entry(list.next, struct btrfs_root, root_list); |
diff --git a/fs/btrfs/transaction.h b/fs/btrfs/transaction.h index 804c88639e5d..02564e6230ac 100644 --- a/fs/btrfs/transaction.h +++ b/fs/btrfs/transaction.h | |||
@@ -28,10 +28,12 @@ struct btrfs_transaction { | |||
28 | * transaction can end | 28 | * transaction can end |
29 | */ | 29 | */ |
30 | atomic_t num_writers; | 30 | atomic_t num_writers; |
31 | atomic_t use_count; | ||
31 | 32 | ||
32 | unsigned long num_joined; | 33 | unsigned long num_joined; |
34 | |||
35 | spinlock_t commit_lock; | ||
33 | int in_commit; | 36 | int in_commit; |
34 | atomic_t use_count; | ||
35 | int commit_done; | 37 | int commit_done; |
36 | int blocked; | 38 | int blocked; |
37 | struct list_head list; | 39 | struct list_head list; |
@@ -45,13 +47,14 @@ struct btrfs_transaction { | |||
45 | 47 | ||
46 | struct btrfs_trans_handle { | 48 | struct btrfs_trans_handle { |
47 | u64 transid; | 49 | u64 transid; |
48 | u64 block_group; | ||
49 | u64 bytes_reserved; | 50 | u64 bytes_reserved; |
51 | unsigned long use_count; | ||
50 | unsigned long blocks_reserved; | 52 | unsigned long blocks_reserved; |
51 | unsigned long blocks_used; | 53 | unsigned long blocks_used; |
52 | unsigned long delayed_ref_updates; | 54 | unsigned long delayed_ref_updates; |
53 | struct btrfs_transaction *transaction; | 55 | struct btrfs_transaction *transaction; |
54 | struct btrfs_block_rsv *block_rsv; | 56 | struct btrfs_block_rsv *block_rsv; |
57 | struct btrfs_block_rsv *orig_rsv; | ||
55 | }; | 58 | }; |
56 | 59 | ||
57 | struct btrfs_pending_snapshot { | 60 | struct btrfs_pending_snapshot { |
@@ -66,19 +69,6 @@ struct btrfs_pending_snapshot { | |||
66 | struct list_head list; | 69 | struct list_head list; |
67 | }; | 70 | }; |
68 | 71 | ||
69 | static inline void btrfs_set_trans_block_group(struct btrfs_trans_handle *trans, | ||
70 | struct inode *inode) | ||
71 | { | ||
72 | trans->block_group = BTRFS_I(inode)->block_group; | ||
73 | } | ||
74 | |||
75 | static inline void btrfs_update_inode_block_group( | ||
76 | struct btrfs_trans_handle *trans, | ||
77 | struct inode *inode) | ||
78 | { | ||
79 | BTRFS_I(inode)->block_group = trans->block_group; | ||
80 | } | ||
81 | |||
82 | static inline void btrfs_set_inode_last_trans(struct btrfs_trans_handle *trans, | 72 | static inline void btrfs_set_inode_last_trans(struct btrfs_trans_handle *trans, |
83 | struct inode *inode) | 73 | struct inode *inode) |
84 | { | 74 | { |
@@ -92,12 +82,9 @@ int btrfs_end_transaction_nolock(struct btrfs_trans_handle *trans, | |||
92 | struct btrfs_root *root); | 82 | struct btrfs_root *root); |
93 | struct btrfs_trans_handle *btrfs_start_transaction(struct btrfs_root *root, | 83 | struct btrfs_trans_handle *btrfs_start_transaction(struct btrfs_root *root, |
94 | int num_items); | 84 | int num_items); |
95 | struct btrfs_trans_handle *btrfs_join_transaction(struct btrfs_root *root, | 85 | struct btrfs_trans_handle *btrfs_join_transaction(struct btrfs_root *root); |
96 | int num_blocks); | 86 | struct btrfs_trans_handle *btrfs_join_transaction_nolock(struct btrfs_root *root); |
97 | struct btrfs_trans_handle *btrfs_join_transaction_nolock(struct btrfs_root *root, | 87 | struct btrfs_trans_handle *btrfs_start_ioctl_transaction(struct btrfs_root *root); |
98 | int num_blocks); | ||
99 | struct btrfs_trans_handle *btrfs_start_ioctl_transaction(struct btrfs_root *r, | ||
100 | int num_blocks); | ||
101 | int btrfs_wait_for_commit(struct btrfs_root *root, u64 transid); | 88 | int btrfs_wait_for_commit(struct btrfs_root *root, u64 transid); |
102 | int btrfs_write_and_wait_transaction(struct btrfs_trans_handle *trans, | 89 | int btrfs_write_and_wait_transaction(struct btrfs_trans_handle *trans, |
103 | struct btrfs_root *root); | 90 | struct btrfs_root *root); |
diff --git a/fs/btrfs/xattr.c b/fs/btrfs/xattr.c index f3107e4b4d56..5366fe452ab0 100644 --- a/fs/btrfs/xattr.c +++ b/fs/btrfs/xattr.c | |||
@@ -158,8 +158,6 @@ int __btrfs_setxattr(struct btrfs_trans_handle *trans, | |||
158 | if (IS_ERR(trans)) | 158 | if (IS_ERR(trans)) |
159 | return PTR_ERR(trans); | 159 | return PTR_ERR(trans); |
160 | 160 | ||
161 | btrfs_set_trans_block_group(trans, inode); | ||
162 | |||
163 | ret = do_setxattr(trans, inode, name, value, size, flags); | 161 | ret = do_setxattr(trans, inode, name, value, size, flags); |
164 | if (ret) | 162 | if (ret) |
165 | goto out; | 163 | goto out; |