aboutsummaryrefslogtreecommitdiffstats
path: root/fs/btrfs
diff options
context:
space:
mode:
Diffstat (limited to 'fs/btrfs')
-rw-r--r--fs/btrfs/async-thread.c2
-rw-r--r--fs/btrfs/delayed-inode.c4
-rw-r--r--fs/btrfs/inode.c85
-rw-r--r--fs/btrfs/ioctl.c4
-rw-r--r--fs/btrfs/super.c19
5 files changed, 91 insertions, 23 deletions
diff --git a/fs/btrfs/async-thread.c b/fs/btrfs/async-thread.c
index af8e117c8978..cb97174e2366 100644
--- a/fs/btrfs/async-thread.c
+++ b/fs/btrfs/async-thread.c
@@ -325,7 +325,7 @@ again:
325 run_ordered_completions(worker->workers, work); 325 run_ordered_completions(worker->workers, work);
326 326
327 check_pending_worker_creates(worker); 327 check_pending_worker_creates(worker);
328 328 cond_resched();
329 } 329 }
330 330
331 spin_lock_irq(&worker->lock); 331 spin_lock_irq(&worker->lock);
diff --git a/fs/btrfs/delayed-inode.c b/fs/btrfs/delayed-inode.c
index 6a1a6800776c..c7ddf8a01c54 100644
--- a/fs/btrfs/delayed-inode.c
+++ b/fs/btrfs/delayed-inode.c
@@ -640,8 +640,8 @@ static int btrfs_delayed_inode_reserve_metadata(
640 * Now if src_rsv == delalloc_block_rsv we'll let it just steal since 640 * Now if src_rsv == delalloc_block_rsv we'll let it just steal since
641 * we're accounted for. 641 * we're accounted for.
642 */ 642 */
643 if (!trans->bytes_reserved && 643 if (!src_rsv || (!trans->bytes_reserved &&
644 src_rsv != &root->fs_info->delalloc_block_rsv) { 644 src_rsv != &root->fs_info->delalloc_block_rsv)) {
645 ret = btrfs_block_rsv_add_noflush(root, dst_rsv, num_bytes); 645 ret = btrfs_block_rsv_add_noflush(root, dst_rsv, num_bytes);
646 /* 646 /*
647 * Since we're under a transaction reserve_metadata_bytes could 647 * Since we're under a transaction reserve_metadata_bytes could
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c
index b212f391ceab..740e67bbe249 100644
--- a/fs/btrfs/inode.c
+++ b/fs/btrfs/inode.c
@@ -2159,6 +2159,38 @@ int btrfs_orphan_cleanup(struct btrfs_root *root)
2159 if (ret && ret != -ESTALE) 2159 if (ret && ret != -ESTALE)
2160 goto out; 2160 goto out;
2161 2161
2162 if (ret == -ESTALE && root == root->fs_info->tree_root) {
2163 struct btrfs_root *dead_root;
2164 struct btrfs_fs_info *fs_info = root->fs_info;
2165 int is_dead_root = 0;
2166
2167 /*
2168 * this is an orphan in the tree root. Currently these
2169 * could come from 2 sources:
2170 * a) a snapshot deletion in progress
2171 * b) a free space cache inode
2172 * We need to distinguish those two, as the snapshot
2173 * orphan must not get deleted.
2174 * find_dead_roots already ran before us, so if this
2175 * is a snapshot deletion, we should find the root
2176 * in the dead_roots list
2177 */
2178 spin_lock(&fs_info->trans_lock);
2179 list_for_each_entry(dead_root, &fs_info->dead_roots,
2180 root_list) {
2181 if (dead_root->root_key.objectid ==
2182 found_key.objectid) {
2183 is_dead_root = 1;
2184 break;
2185 }
2186 }
2187 spin_unlock(&fs_info->trans_lock);
2188 if (is_dead_root) {
2189 /* prevent this orphan from being found again */
2190 key.offset = found_key.objectid - 1;
2191 continue;
2192 }
2193 }
2162 /* 2194 /*
2163 * Inode is already gone but the orphan item is still there, 2195 * Inode is already gone but the orphan item is still there,
2164 * kill the orphan item. 2196 * kill the orphan item.
@@ -3335,7 +3367,7 @@ int btrfs_cont_expand(struct inode *inode, loff_t oldsize, loff_t size)
3335 u64 hint_byte = 0; 3367 u64 hint_byte = 0;
3336 hole_size = last_byte - cur_offset; 3368 hole_size = last_byte - cur_offset;
3337 3369
3338 trans = btrfs_start_transaction(root, 2); 3370 trans = btrfs_start_transaction(root, 3);
3339 if (IS_ERR(trans)) { 3371 if (IS_ERR(trans)) {
3340 err = PTR_ERR(trans); 3372 err = PTR_ERR(trans);
3341 break; 3373 break;
@@ -3345,6 +3377,7 @@ int btrfs_cont_expand(struct inode *inode, loff_t oldsize, loff_t size)
3345 cur_offset + hole_size, 3377 cur_offset + hole_size,
3346 &hint_byte, 1); 3378 &hint_byte, 1);
3347 if (err) { 3379 if (err) {
3380 btrfs_update_inode(trans, root, inode);
3348 btrfs_end_transaction(trans, root); 3381 btrfs_end_transaction(trans, root);
3349 break; 3382 break;
3350 } 3383 }
@@ -3354,6 +3387,7 @@ int btrfs_cont_expand(struct inode *inode, loff_t oldsize, loff_t size)
3354 0, hole_size, 0, hole_size, 3387 0, hole_size, 0, hole_size,
3355 0, 0, 0); 3388 0, 0, 0);
3356 if (err) { 3389 if (err) {
3390 btrfs_update_inode(trans, root, inode);
3357 btrfs_end_transaction(trans, root); 3391 btrfs_end_transaction(trans, root);
3358 break; 3392 break;
3359 } 3393 }
@@ -3361,6 +3395,7 @@ int btrfs_cont_expand(struct inode *inode, loff_t oldsize, loff_t size)
3361 btrfs_drop_extent_cache(inode, hole_start, 3395 btrfs_drop_extent_cache(inode, hole_start,
3362 last_byte - 1, 0); 3396 last_byte - 1, 0);
3363 3397
3398 btrfs_update_inode(trans, root, inode);
3364 btrfs_end_transaction(trans, root); 3399 btrfs_end_transaction(trans, root);
3365 } 3400 }
3366 free_extent_map(em); 3401 free_extent_map(em);
@@ -3378,6 +3413,8 @@ int btrfs_cont_expand(struct inode *inode, loff_t oldsize, loff_t size)
3378 3413
3379static int btrfs_setsize(struct inode *inode, loff_t newsize) 3414static int btrfs_setsize(struct inode *inode, loff_t newsize)
3380{ 3415{
3416 struct btrfs_root *root = BTRFS_I(inode)->root;
3417 struct btrfs_trans_handle *trans;
3381 loff_t oldsize = i_size_read(inode); 3418 loff_t oldsize = i_size_read(inode);
3382 int ret; 3419 int ret;
3383 3420
@@ -3385,16 +3422,19 @@ static int btrfs_setsize(struct inode *inode, loff_t newsize)
3385 return 0; 3422 return 0;
3386 3423
3387 if (newsize > oldsize) { 3424 if (newsize > oldsize) {
3388 i_size_write(inode, newsize);
3389 btrfs_ordered_update_i_size(inode, i_size_read(inode), NULL);
3390 truncate_pagecache(inode, oldsize, newsize); 3425 truncate_pagecache(inode, oldsize, newsize);
3391 ret = btrfs_cont_expand(inode, oldsize, newsize); 3426 ret = btrfs_cont_expand(inode, oldsize, newsize);
3392 if (ret) { 3427 if (ret)
3393 btrfs_setsize(inode, oldsize);
3394 return ret; 3428 return ret;
3395 }
3396 3429
3397 ret = btrfs_dirty_inode(inode); 3430 trans = btrfs_start_transaction(root, 1);
3431 if (IS_ERR(trans))
3432 return PTR_ERR(trans);
3433
3434 i_size_write(inode, newsize);
3435 btrfs_ordered_update_i_size(inode, i_size_read(inode), NULL);
3436 ret = btrfs_update_inode(trans, root, inode);
3437 btrfs_end_transaction_throttle(trans, root);
3398 } else { 3438 } else {
3399 3439
3400 /* 3440 /*
@@ -4601,11 +4641,18 @@ static int btrfs_mknod(struct inode *dir, struct dentry *dentry,
4601 goto out_unlock; 4641 goto out_unlock;
4602 } 4642 }
4603 4643
4644 /*
4645 * If the active LSM wants to access the inode during
4646 * d_instantiate it needs these. Smack checks to see
4647 * if the filesystem supports xattrs by looking at the
4648 * ops vector.
4649 */
4650
4651 inode->i_op = &btrfs_special_inode_operations;
4604 err = btrfs_add_nondir(trans, dir, dentry, inode, 0, index); 4652 err = btrfs_add_nondir(trans, dir, dentry, inode, 0, index);
4605 if (err) 4653 if (err)
4606 drop_inode = 1; 4654 drop_inode = 1;
4607 else { 4655 else {
4608 inode->i_op = &btrfs_special_inode_operations;
4609 init_special_inode(inode, inode->i_mode, rdev); 4656 init_special_inode(inode, inode->i_mode, rdev);
4610 btrfs_update_inode(trans, root, inode); 4657 btrfs_update_inode(trans, root, inode);
4611 } 4658 }
@@ -4659,14 +4706,21 @@ static int btrfs_create(struct inode *dir, struct dentry *dentry,
4659 goto out_unlock; 4706 goto out_unlock;
4660 } 4707 }
4661 4708
4709 /*
4710 * If the active LSM wants to access the inode during
4711 * d_instantiate it needs these. Smack checks to see
4712 * if the filesystem supports xattrs by looking at the
4713 * ops vector.
4714 */
4715 inode->i_fop = &btrfs_file_operations;
4716 inode->i_op = &btrfs_file_inode_operations;
4717
4662 err = btrfs_add_nondir(trans, dir, dentry, inode, 0, index); 4718 err = btrfs_add_nondir(trans, dir, dentry, inode, 0, index);
4663 if (err) 4719 if (err)
4664 drop_inode = 1; 4720 drop_inode = 1;
4665 else { 4721 else {
4666 inode->i_mapping->a_ops = &btrfs_aops; 4722 inode->i_mapping->a_ops = &btrfs_aops;
4667 inode->i_mapping->backing_dev_info = &root->fs_info->bdi; 4723 inode->i_mapping->backing_dev_info = &root->fs_info->bdi;
4668 inode->i_fop = &btrfs_file_operations;
4669 inode->i_op = &btrfs_file_inode_operations;
4670 BTRFS_I(inode)->io_tree.ops = &btrfs_extent_io_ops; 4724 BTRFS_I(inode)->io_tree.ops = &btrfs_extent_io_ops;
4671 } 4725 }
4672out_unlock: 4726out_unlock:
@@ -7128,14 +7182,21 @@ static int btrfs_symlink(struct inode *dir, struct dentry *dentry,
7128 goto out_unlock; 7182 goto out_unlock;
7129 } 7183 }
7130 7184
7185 /*
7186 * If the active LSM wants to access the inode during
7187 * d_instantiate it needs these. Smack checks to see
7188 * if the filesystem supports xattrs by looking at the
7189 * ops vector.
7190 */
7191 inode->i_fop = &btrfs_file_operations;
7192 inode->i_op = &btrfs_file_inode_operations;
7193
7131 err = btrfs_add_nondir(trans, dir, dentry, inode, 0, index); 7194 err = btrfs_add_nondir(trans, dir, dentry, inode, 0, index);
7132 if (err) 7195 if (err)
7133 drop_inode = 1; 7196 drop_inode = 1;
7134 else { 7197 else {
7135 inode->i_mapping->a_ops = &btrfs_aops; 7198 inode->i_mapping->a_ops = &btrfs_aops;
7136 inode->i_mapping->backing_dev_info = &root->fs_info->bdi; 7199 inode->i_mapping->backing_dev_info = &root->fs_info->bdi;
7137 inode->i_fop = &btrfs_file_operations;
7138 inode->i_op = &btrfs_file_inode_operations;
7139 BTRFS_I(inode)->io_tree.ops = &btrfs_extent_io_ops; 7200 BTRFS_I(inode)->io_tree.ops = &btrfs_extent_io_ops;
7140 } 7201 }
7141 if (drop_inode) 7202 if (drop_inode)
diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c
index dd8891662355..c04f02c7d5bb 100644
--- a/fs/btrfs/ioctl.c
+++ b/fs/btrfs/ioctl.c
@@ -252,11 +252,11 @@ static int btrfs_ioctl_setflags(struct file *file, void __user *arg)
252 trans = btrfs_join_transaction(root); 252 trans = btrfs_join_transaction(root);
253 BUG_ON(IS_ERR(trans)); 253 BUG_ON(IS_ERR(trans));
254 254
255 btrfs_update_iflags(inode);
256 inode->i_ctime = CURRENT_TIME;
255 ret = btrfs_update_inode(trans, root, inode); 257 ret = btrfs_update_inode(trans, root, inode);
256 BUG_ON(ret); 258 BUG_ON(ret);
257 259
258 btrfs_update_iflags(inode);
259 inode->i_ctime = CURRENT_TIME;
260 btrfs_end_transaction(trans, root); 260 btrfs_end_transaction(trans, root);
261 261
262 mnt_drop_write(file->f_path.mnt); 262 mnt_drop_write(file->f_path.mnt);
diff --git a/fs/btrfs/super.c b/fs/btrfs/super.c
index 05b40457e26c..34a8b6112ea4 100644
--- a/fs/btrfs/super.c
+++ b/fs/btrfs/super.c
@@ -1080,7 +1080,7 @@ static int btrfs_calc_avail_data_space(struct btrfs_root *root, u64 *free_bytes)
1080 u64 avail_space; 1080 u64 avail_space;
1081 u64 used_space; 1081 u64 used_space;
1082 u64 min_stripe_size; 1082 u64 min_stripe_size;
1083 int min_stripes = 1; 1083 int min_stripes = 1, num_stripes = 1;
1084 int i = 0, nr_devices; 1084 int i = 0, nr_devices;
1085 int ret; 1085 int ret;
1086 1086
@@ -1094,12 +1094,16 @@ static int btrfs_calc_avail_data_space(struct btrfs_root *root, u64 *free_bytes)
1094 1094
1095 /* calc min stripe number for data space alloction */ 1095 /* calc min stripe number for data space alloction */
1096 type = btrfs_get_alloc_profile(root, 1); 1096 type = btrfs_get_alloc_profile(root, 1);
1097 if (type & BTRFS_BLOCK_GROUP_RAID0) 1097 if (type & BTRFS_BLOCK_GROUP_RAID0) {
1098 min_stripes = 2; 1098 min_stripes = 2;
1099 else if (type & BTRFS_BLOCK_GROUP_RAID1) 1099 num_stripes = nr_devices;
1100 } else if (type & BTRFS_BLOCK_GROUP_RAID1) {
1100 min_stripes = 2; 1101 min_stripes = 2;
1101 else if (type & BTRFS_BLOCK_GROUP_RAID10) 1102 num_stripes = 2;
1103 } else if (type & BTRFS_BLOCK_GROUP_RAID10) {
1102 min_stripes = 4; 1104 min_stripes = 4;
1105 num_stripes = 4;
1106 }
1103 1107
1104 if (type & BTRFS_BLOCK_GROUP_DUP) 1108 if (type & BTRFS_BLOCK_GROUP_DUP)
1105 min_stripe_size = 2 * BTRFS_STRIPE_LEN; 1109 min_stripe_size = 2 * BTRFS_STRIPE_LEN;
@@ -1168,13 +1172,16 @@ static int btrfs_calc_avail_data_space(struct btrfs_root *root, u64 *free_bytes)
1168 i = nr_devices - 1; 1172 i = nr_devices - 1;
1169 avail_space = 0; 1173 avail_space = 0;
1170 while (nr_devices >= min_stripes) { 1174 while (nr_devices >= min_stripes) {
1175 if (num_stripes > nr_devices)
1176 num_stripes = nr_devices;
1177
1171 if (devices_info[i].max_avail >= min_stripe_size) { 1178 if (devices_info[i].max_avail >= min_stripe_size) {
1172 int j; 1179 int j;
1173 u64 alloc_size; 1180 u64 alloc_size;
1174 1181
1175 avail_space += devices_info[i].max_avail * min_stripes; 1182 avail_space += devices_info[i].max_avail * num_stripes;
1176 alloc_size = devices_info[i].max_avail; 1183 alloc_size = devices_info[i].max_avail;
1177 for (j = i + 1 - min_stripes; j <= i; j++) 1184 for (j = i + 1 - num_stripes; j <= i; j++)
1178 devices_info[j].max_avail -= alloc_size; 1185 devices_info[j].max_avail -= alloc_size;
1179 } 1186 }
1180 i--; 1187 i--;