aboutsummaryrefslogtreecommitdiffstats
path: root/fs/btrfs/inode.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/btrfs/inode.c')
-rw-r--r--fs/btrfs/inode.c35
1 files changed, 23 insertions, 12 deletions
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c
index 2bf4d2b97d54..55d68ea1866b 100644
--- a/fs/btrfs/inode.c
+++ b/fs/btrfs/inode.c
@@ -1298,7 +1298,9 @@ static int btrfs_split_extent_hook(struct inode *inode,
1298 if (!(orig->state & EXTENT_DELALLOC)) 1298 if (!(orig->state & EXTENT_DELALLOC))
1299 return 0; 1299 return 0;
1300 1300
1301 atomic_inc(&BTRFS_I(inode)->outstanding_extents); 1301 spin_lock(&BTRFS_I(inode)->lock);
1302 BTRFS_I(inode)->outstanding_extents++;
1303 spin_unlock(&BTRFS_I(inode)->lock);
1302 return 0; 1304 return 0;
1303} 1305}
1304 1306
@@ -1316,7 +1318,9 @@ static int btrfs_merge_extent_hook(struct inode *inode,
1316 if (!(other->state & EXTENT_DELALLOC)) 1318 if (!(other->state & EXTENT_DELALLOC))
1317 return 0; 1319 return 0;
1318 1320
1319 atomic_dec(&BTRFS_I(inode)->outstanding_extents); 1321 spin_lock(&BTRFS_I(inode)->lock);
1322 BTRFS_I(inode)->outstanding_extents--;
1323 spin_unlock(&BTRFS_I(inode)->lock);
1320 return 0; 1324 return 0;
1321} 1325}
1322 1326
@@ -1339,10 +1343,13 @@ static int btrfs_set_bit_hook(struct inode *inode,
1339 u64 len = state->end + 1 - state->start; 1343 u64 len = state->end + 1 - state->start;
1340 bool do_list = !is_free_space_inode(root, inode); 1344 bool do_list = !is_free_space_inode(root, inode);
1341 1345
1342 if (*bits & EXTENT_FIRST_DELALLOC) 1346 if (*bits & EXTENT_FIRST_DELALLOC) {
1343 *bits &= ~EXTENT_FIRST_DELALLOC; 1347 *bits &= ~EXTENT_FIRST_DELALLOC;
1344 else 1348 } else {
1345 atomic_inc(&BTRFS_I(inode)->outstanding_extents); 1349 spin_lock(&BTRFS_I(inode)->lock);
1350 BTRFS_I(inode)->outstanding_extents++;
1351 spin_unlock(&BTRFS_I(inode)->lock);
1352 }
1346 1353
1347 spin_lock(&root->fs_info->delalloc_lock); 1354 spin_lock(&root->fs_info->delalloc_lock);
1348 BTRFS_I(inode)->delalloc_bytes += len; 1355 BTRFS_I(inode)->delalloc_bytes += len;
@@ -1372,10 +1379,13 @@ static int btrfs_clear_bit_hook(struct inode *inode,
1372 u64 len = state->end + 1 - state->start; 1379 u64 len = state->end + 1 - state->start;
1373 bool do_list = !is_free_space_inode(root, inode); 1380 bool do_list = !is_free_space_inode(root, inode);
1374 1381
1375 if (*bits & EXTENT_FIRST_DELALLOC) 1382 if (*bits & EXTENT_FIRST_DELALLOC) {
1376 *bits &= ~EXTENT_FIRST_DELALLOC; 1383 *bits &= ~EXTENT_FIRST_DELALLOC;
1377 else if (!(*bits & EXTENT_DO_ACCOUNTING)) 1384 } else if (!(*bits & EXTENT_DO_ACCOUNTING)) {
1378 atomic_dec(&BTRFS_I(inode)->outstanding_extents); 1385 spin_lock(&BTRFS_I(inode)->lock);
1386 BTRFS_I(inode)->outstanding_extents--;
1387 spin_unlock(&BTRFS_I(inode)->lock);
1388 }
1379 1389
1380 if (*bits & EXTENT_DO_ACCOUNTING) 1390 if (*bits & EXTENT_DO_ACCOUNTING)
1381 btrfs_delalloc_release_metadata(inode, len); 1391 btrfs_delalloc_release_metadata(inode, len);
@@ -6735,8 +6745,9 @@ struct inode *btrfs_alloc_inode(struct super_block *sb)
6735 ei->index_cnt = (u64)-1; 6745 ei->index_cnt = (u64)-1;
6736 ei->last_unlink_trans = 0; 6746 ei->last_unlink_trans = 0;
6737 6747
6738 atomic_set(&ei->outstanding_extents, 0); 6748 spin_lock_init(&ei->lock);
6739 atomic_set(&ei->reserved_extents, 0); 6749 ei->outstanding_extents = 0;
6750 ei->reserved_extents = 0;
6740 6751
6741 ei->ordered_data_close = 0; 6752 ei->ordered_data_close = 0;
6742 ei->orphan_meta_reserved = 0; 6753 ei->orphan_meta_reserved = 0;
@@ -6774,8 +6785,8 @@ void btrfs_destroy_inode(struct inode *inode)
6774 6785
6775 WARN_ON(!list_empty(&inode->i_dentry)); 6786 WARN_ON(!list_empty(&inode->i_dentry));
6776 WARN_ON(inode->i_data.nrpages); 6787 WARN_ON(inode->i_data.nrpages);
6777 WARN_ON(atomic_read(&BTRFS_I(inode)->outstanding_extents)); 6788 WARN_ON(BTRFS_I(inode)->outstanding_extents);
6778 WARN_ON(atomic_read(&BTRFS_I(inode)->reserved_extents)); 6789 WARN_ON(BTRFS_I(inode)->reserved_extents);
6779 6790
6780 /* 6791 /*
6781 * This can happen where we create an inode, but somebody else also 6792 * This can happen where we create an inode, but somebody else also