Skip to content

Commit e6ece70

Browse files
committed
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mason/btrfs-unstable
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mason/btrfs-unstable: (25 commits) btrfs: fix uninitialized variable warning btrfs: add helper for fs_info->closing Btrfs: add mount -o inode_cache btrfs: scrub: add explicit plugging btrfs: use btrfs_ino to access inode number Btrfs: don't save the inode cache if we are deleting this root btrfs: false BUG_ON when degraded Btrfs: don't save the inode cache in non-FS roots Btrfs: make sure we don't overflow the free space cache crc page Btrfs: fix uninit variable in the delayed inode code btrfs: scrub: don't reuse bios and pages Btrfs: leave spinning on lookup and map the leaf Btrfs: check for duplicate entries in the free space cache Btrfs: don't try to allocate from a block group that doesn't have enough space Btrfs: don't always do readahead Btrfs: try not to sleep as much when doing slow caching Btrfs: kill BTRFS_I(inode)->block_group Btrfs: don't look at the extent buffer level 3 times in a row Btrfs: map the node block when looking for readahead targets Btrfs: set range_start to the right start in count_range_bits ...
2 parents 23c79d3 + aa0467d commit e6ece70

19 files changed

+635
-468
lines changed

fs/btrfs/btrfs_inode.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -121,9 +121,6 @@ struct btrfs_inode {
121121
*/
122122
u64 index_cnt;
123123

124-
/* the start of block group preferred for allocations. */
125-
u64 block_group;
126-
127124
/* the fsync log has some corner cases that mean we have to check
128125
* directories to see if any unlinks have been done before
129126
* the directory was logged. See tree-log.c for all the

fs/btrfs/ctree.c

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,6 @@ struct btrfs_path *btrfs_alloc_path(void)
4343
{
4444
struct btrfs_path *path;
4545
path = kmem_cache_zalloc(btrfs_path_cachep, GFP_NOFS);
46-
if (path)
47-
path->reada = 1;
4846
return path;
4947
}
5048

@@ -1224,6 +1222,7 @@ static void reada_for_search(struct btrfs_root *root,
12241222
u64 search;
12251223
u64 target;
12261224
u64 nread = 0;
1225+
u64 gen;
12271226
int direction = path->reada;
12281227
struct extent_buffer *eb;
12291228
u32 nr;
@@ -1251,6 +1250,15 @@ static void reada_for_search(struct btrfs_root *root,
12511250
nritems = btrfs_header_nritems(node);
12521251
nr = slot;
12531252
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+
}
12541262
if (direction < 0) {
12551263
if (nr == 0)
12561264
break;
@@ -1268,14 +1276,23 @@ static void reada_for_search(struct btrfs_root *root,
12681276
search = btrfs_node_blockptr(node, nr);
12691277
if ((search <= target && target - search <= 65536) ||
12701278
(search > target && search - target <= 65536)) {
1271-
readahead_tree_block(root, search, blocksize,
1272-
btrfs_node_ptr_generation(node, nr));
1279+
gen = 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);
12731286
nread += blocksize;
12741287
}
12751288
nscan++;
12761289
if ((nread > 65536 || nscan > 32))
12771290
break;
12781291
}
1292+
if (node->map_token) {
1293+
unmap_extent_buffer(node, node->map_token, KM_USER1);
1294+
node->map_token = NULL;
1295+
}
12791296
}
12801297

12811298
/*
@@ -1648,9 +1665,6 @@ int btrfs_search_slot(struct btrfs_trans_handle *trans, struct btrfs_root
16481665
}
16491666
cow_done:
16501667
BUG_ON(!cow && ins_len);
1651-
if (level != btrfs_header_level(b))
1652-
WARN_ON(1);
1653-
level = btrfs_header_level(b);
16541668

16551669
p->nodes[level] = b;
16561670
if (!p->skip_locking)

fs/btrfs/ctree.h

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -930,7 +930,6 @@ struct btrfs_fs_info {
930930
* is required instead of the faster short fsync log commits
931931
*/
932932
u64 last_trans_log_full_commit;
933-
u64 open_ioctl_trans;
934933
unsigned long mount_opt:20;
935934
unsigned long compress_type:4;
936935
u64 max_inline;
@@ -947,7 +946,6 @@ struct btrfs_fs_info {
947946
struct super_block *sb;
948947
struct inode *btree_inode;
949948
struct backing_dev_info bdi;
950-
struct mutex trans_mutex;
951949
struct mutex tree_log_mutex;
952950
struct mutex transaction_kthread_mutex;
953951
struct mutex cleaner_mutex;
@@ -968,6 +966,7 @@ struct btrfs_fs_info {
968966
struct rw_semaphore subvol_sem;
969967
struct srcu_struct subvol_srcu;
970968

969+
spinlock_t trans_lock;
971970
struct list_head trans_list;
972971
struct list_head hashers;
973972
struct list_head dead_roots;
@@ -980,6 +979,7 @@ struct btrfs_fs_info {
980979
atomic_t async_submit_draining;
981980
atomic_t nr_async_bios;
982981
atomic_t async_delalloc_pages;
982+
atomic_t open_ioctl_trans;
983983

984984
/*
985985
* this is used by the balancing code to wait for all the pending
@@ -1044,6 +1044,7 @@ struct btrfs_fs_info {
10441044
int closing;
10451045
int log_root_recovering;
10461046
int enospc_unlink;
1047+
int trans_no_join;
10471048

10481049
u64 total_pinned;
10491050

@@ -1065,7 +1066,6 @@ struct btrfs_fs_info {
10651066
struct reloc_control *reloc_ctl;
10661067

10671068
spinlock_t delalloc_lock;
1068-
spinlock_t new_trans_lock;
10691069
u64 delalloc_bytes;
10701070

10711071
/* data_alloc_cluster is only used in ssd mode */
@@ -1340,6 +1340,7 @@ struct btrfs_ioctl_defrag_range_args {
13401340
#define BTRFS_MOUNT_USER_SUBVOL_RM_ALLOWED (1 << 14)
13411341
#define BTRFS_MOUNT_ENOSPC_DEBUG (1 << 15)
13421342
#define BTRFS_MOUNT_AUTO_DEFRAG (1 << 16)
1343+
#define BTRFS_MOUNT_INODE_MAP_CACHE (1 << 17)
13431344

13441345
#define btrfs_clear_opt(o, opt) ((o) &= ~BTRFS_MOUNT_##opt)
13451346
#define btrfs_set_opt(o, opt) ((o) |= BTRFS_MOUNT_##opt)
@@ -2238,6 +2239,9 @@ int btrfs_block_rsv_migrate(struct btrfs_block_rsv *src_rsv,
22382239
void btrfs_block_rsv_release(struct btrfs_root *root,
22392240
struct btrfs_block_rsv *block_rsv,
22402241
u64 num_bytes);
2242+
int btrfs_truncate_reserve_metadata(struct btrfs_trans_handle *trans,
2243+
struct btrfs_root *root,
2244+
struct btrfs_block_rsv *rsv);
22412245
int btrfs_set_block_group_ro(struct btrfs_root *root,
22422246
struct btrfs_block_group_cache *cache);
22432247
int btrfs_set_block_group_rw(struct btrfs_root *root,
@@ -2350,6 +2354,15 @@ int btrfs_drop_subtree(struct btrfs_trans_handle *trans,
23502354
struct btrfs_root *root,
23512355
struct extent_buffer *node,
23522356
struct extent_buffer *parent);
2357+
static inline int btrfs_fs_closing(struct btrfs_fs_info *fs_info)
2358+
{
2359+
/*
2360+
* Get synced with close_ctree()
2361+
*/
2362+
smp_mb();
2363+
return fs_info->closing;
2364+
}
2365+
23532366
/* root-item.c */
23542367
int btrfs_find_root_ref(struct btrfs_root *tree_root,
23552368
struct btrfs_path *path,
@@ -2512,8 +2525,7 @@ int btrfs_set_extent_delalloc(struct inode *inode, u64 start, u64 end,
25122525
int btrfs_writepages(struct address_space *mapping,
25132526
struct writeback_control *wbc);
25142527
int btrfs_create_subvol_root(struct btrfs_trans_handle *trans,
2515-
struct btrfs_root *new_root,
2516-
u64 new_dirid, u64 alloc_hint);
2528+
struct btrfs_root *new_root, u64 new_dirid);
25172529
int btrfs_merge_bio_hook(struct page *page, unsigned long offset,
25182530
size_t size, struct bio *bio, unsigned long bio_flags);
25192531

fs/btrfs/delayed-inode.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -678,6 +678,7 @@ static int btrfs_batch_insert_items(struct btrfs_trans_handle *trans,
678678
INIT_LIST_HEAD(&head);
679679

680680
next = item;
681+
nitems = 0;
681682

682683
/*
683684
* count the number of the continuous items that we can insert in batch
@@ -1129,7 +1130,7 @@ static void btrfs_async_run_delayed_node_done(struct btrfs_work *work)
11291130
delayed_node = async_node->delayed_node;
11301131
root = delayed_node->root;
11311132

1132-
trans = btrfs_join_transaction(root, 0);
1133+
trans = btrfs_join_transaction(root);
11331134
if (IS_ERR(trans))
11341135
goto free_path;
11351136

@@ -1572,8 +1573,7 @@ static void fill_stack_inode_item(struct btrfs_trans_handle *trans,
15721573
btrfs_set_stack_inode_transid(inode_item, trans->transid);
15731574
btrfs_set_stack_inode_rdev(inode_item, inode->i_rdev);
15741575
btrfs_set_stack_inode_flags(inode_item, BTRFS_I(inode)->flags);
1575-
btrfs_set_stack_inode_block_group(inode_item,
1576-
BTRFS_I(inode)->block_group);
1576+
btrfs_set_stack_inode_block_group(inode_item, 0);
15771577

15781578
btrfs_set_stack_timespec_sec(btrfs_inode_atime(inode_item),
15791579
inode->i_atime.tv_sec);
@@ -1595,7 +1595,7 @@ int btrfs_delayed_update_inode(struct btrfs_trans_handle *trans,
15951595
struct btrfs_root *root, struct inode *inode)
15961596
{
15971597
struct btrfs_delayed_node *delayed_node;
1598-
int ret;
1598+
int ret = 0;
15991599

16001600
delayed_node = btrfs_get_or_create_delayed_node(inode);
16011601
if (IS_ERR(delayed_node))

fs/btrfs/disk-io.c

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1505,24 +1505,24 @@ static int transaction_kthread(void *arg)
15051505
vfs_check_frozen(root->fs_info->sb, SB_FREEZE_WRITE);
15061506
mutex_lock(&root->fs_info->transaction_kthread_mutex);
15071507

1508-
spin_lock(&root->fs_info->new_trans_lock);
1508+
spin_lock(&root->fs_info->trans_lock);
15091509
cur = root->fs_info->running_transaction;
15101510
if (!cur) {
1511-
spin_unlock(&root->fs_info->new_trans_lock);
1511+
spin_unlock(&root->fs_info->trans_lock);
15121512
goto sleep;
15131513
}
15141514

15151515
now = get_seconds();
15161516
if (!cur->blocked &&
15171517
(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);
15191519
delay = HZ * 5;
15201520
goto sleep;
15211521
}
15221522
transid = cur->transid;
1523-
spin_unlock(&root->fs_info->new_trans_lock);
1523+
spin_unlock(&root->fs_info->trans_lock);
15241524

1525-
trans = btrfs_join_transaction(root, 1);
1525+
trans = btrfs_join_transaction(root);
15261526
BUG_ON(IS_ERR(trans));
15271527
if (transid == trans->transid) {
15281528
ret = btrfs_commit_transaction(trans, root);
@@ -1613,7 +1613,7 @@ struct btrfs_root *open_ctree(struct super_block *sb,
16131613
INIT_LIST_HEAD(&fs_info->ordered_operations);
16141614
INIT_LIST_HEAD(&fs_info->caching_block_groups);
16151615
spin_lock_init(&fs_info->delalloc_lock);
1616-
spin_lock_init(&fs_info->new_trans_lock);
1616+
spin_lock_init(&fs_info->trans_lock);
16171617
spin_lock_init(&fs_info->ref_cache_lock);
16181618
spin_lock_init(&fs_info->fs_roots_radix_lock);
16191619
spin_lock_init(&fs_info->delayed_iput_lock);
@@ -1645,6 +1645,7 @@ struct btrfs_root *open_ctree(struct super_block *sb,
16451645
fs_info->max_inline = 8192 * 1024;
16461646
fs_info->metadata_ratio = 0;
16471647
fs_info->defrag_inodes = RB_ROOT;
1648+
fs_info->trans_no_join = 0;
16481649

16491650
fs_info->thread_pool_size = min_t(unsigned long,
16501651
num_online_cpus() + 2, 8);
@@ -1709,7 +1710,6 @@ struct btrfs_root *open_ctree(struct super_block *sb,
17091710
fs_info->do_barriers = 1;
17101711

17111712

1712-
mutex_init(&fs_info->trans_mutex);
17131713
mutex_init(&fs_info->ordered_operations_mutex);
17141714
mutex_init(&fs_info->tree_log_mutex);
17151715
mutex_init(&fs_info->chunk_mutex);
@@ -2479,13 +2479,13 @@ int btrfs_commit_super(struct btrfs_root *root)
24792479
down_write(&root->fs_info->cleanup_work_sem);
24802480
up_write(&root->fs_info->cleanup_work_sem);
24812481

2482-
trans = btrfs_join_transaction(root, 1);
2482+
trans = btrfs_join_transaction(root);
24832483
if (IS_ERR(trans))
24842484
return PTR_ERR(trans);
24852485
ret = btrfs_commit_transaction(trans, root);
24862486
BUG_ON(ret);
24872487
/* run commit again to drop the original snapshot */
2488-
trans = btrfs_join_transaction(root, 1);
2488+
trans = btrfs_join_transaction(root);
24892489
if (IS_ERR(trans))
24902490
return PTR_ERR(trans);
24912491
btrfs_commit_transaction(trans, root);
@@ -3024,10 +3024,13 @@ static int btrfs_cleanup_transaction(struct btrfs_root *root)
30243024

30253025
WARN_ON(1);
30263026

3027-
mutex_lock(&root->fs_info->trans_mutex);
30283027
mutex_lock(&root->fs_info->transaction_kthread_mutex);
30293028

3029+
spin_lock(&root->fs_info->trans_lock);
30303030
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+
30313034
while (!list_empty(&list)) {
30323035
t = list_entry(list.next, struct btrfs_transaction, list);
30333036
if (!t)
@@ -3052,23 +3055,18 @@ static int btrfs_cleanup_transaction(struct btrfs_root *root)
30523055
t->blocked = 0;
30533056
if (waitqueue_active(&root->fs_info->transaction_wait))
30543057
wake_up(&root->fs_info->transaction_wait);
3055-
mutex_unlock(&root->fs_info->trans_mutex);
30563058

3057-
mutex_lock(&root->fs_info->trans_mutex);
30583059
t->commit_done = 1;
30593060
if (waitqueue_active(&t->commit_wait))
30603061
wake_up(&t->commit_wait);
3061-
mutex_unlock(&root->fs_info->trans_mutex);
3062-
3063-
mutex_lock(&root->fs_info->trans_mutex);
30643062

30653063
btrfs_destroy_pending_snapshots(t);
30663064

30673065
btrfs_destroy_delalloc_inodes(root);
30683066

3069-
spin_lock(&root->fs_info->new_trans_lock);
3067+
spin_lock(&root->fs_info->trans_lock);
30703068
root->fs_info->running_transaction = NULL;
3071-
spin_unlock(&root->fs_info->new_trans_lock);
3069+
spin_unlock(&root->fs_info->trans_lock);
30723070

30733071
btrfs_destroy_marked_extents(root, &t->dirty_pages,
30743072
EXTENT_DIRTY);
@@ -3082,8 +3080,10 @@ static int btrfs_cleanup_transaction(struct btrfs_root *root)
30823080
kmem_cache_free(btrfs_transaction_cachep, t);
30833081
}
30843082

3083+
spin_lock(&root->fs_info->trans_lock);
3084+
root->fs_info->trans_no_join = 0;
3085+
spin_unlock(&root->fs_info->trans_lock);
30853086
mutex_unlock(&root->fs_info->transaction_kthread_mutex);
3086-
mutex_unlock(&root->fs_info->trans_mutex);
30873087

30883088
return 0;
30893089
}

0 commit comments

Comments
 (0)