diff options
Diffstat (limited to 'fs/btrfs')
-rw-r--r-- | fs/btrfs/async-thread.c | 2 | ||||
-rw-r--r-- | fs/btrfs/delayed-inode.c | 4 | ||||
-rw-r--r-- | fs/btrfs/inode.c | 85 | ||||
-rw-r--r-- | fs/btrfs/ioctl.c | 4 | ||||
-rw-r--r-- | fs/btrfs/super.c | 19 |
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 | ||
3379 | static int btrfs_setsize(struct inode *inode, loff_t newsize) | 3414 | static 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 | } |
4672 | out_unlock: | 4726 | out_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--; |