|
@@ -483,7 +483,8 @@ again:
|
|
|
nr_pages_ret = 0;
|
|
|
|
|
|
/* flag the file so we don't compress in the future */
|
|
|
- BTRFS_I(inode)->flags |= BTRFS_INODE_NOCOMPRESS;
|
|
|
+ if (!btrfs_test_opt(root, FORCE_COMPRESS))
|
|
|
+ BTRFS_I(inode)->flags |= BTRFS_INODE_NOCOMPRESS;
|
|
|
}
|
|
|
if (will_compress) {
|
|
|
*num_added += 1;
|
|
@@ -3796,12 +3797,6 @@ struct inode *btrfs_lookup_dentry(struct inode *dir, struct dentry *dentry)
|
|
|
|
|
|
if (location.type == BTRFS_INODE_ITEM_KEY) {
|
|
|
inode = btrfs_iget(dir->i_sb, &location, root);
|
|
|
- if (unlikely(root->clean_orphans) &&
|
|
|
- !(inode->i_sb->s_flags & MS_RDONLY)) {
|
|
|
- down_read(&root->fs_info->cleanup_work_sem);
|
|
|
- btrfs_orphan_cleanup(root);
|
|
|
- up_read(&root->fs_info->cleanup_work_sem);
|
|
|
- }
|
|
|
return inode;
|
|
|
}
|
|
|
|
|
@@ -5799,7 +5794,7 @@ out_fail:
|
|
|
}
|
|
|
|
|
|
static int prealloc_file_range(struct inode *inode, u64 start, u64 end,
|
|
|
- u64 alloc_hint, int mode)
|
|
|
+ u64 alloc_hint, int mode, loff_t actual_len)
|
|
|
{
|
|
|
struct btrfs_trans_handle *trans;
|
|
|
struct btrfs_root *root = BTRFS_I(inode)->root;
|
|
@@ -5808,6 +5803,7 @@ static int prealloc_file_range(struct inode *inode, u64 start, u64 end,
|
|
|
u64 cur_offset = start;
|
|
|
u64 num_bytes = end - start;
|
|
|
int ret = 0;
|
|
|
+ u64 i_size;
|
|
|
|
|
|
while (num_bytes > 0) {
|
|
|
alloc_size = min(num_bytes, root->fs_info->max_extent);
|
|
@@ -5846,8 +5842,12 @@ static int prealloc_file_range(struct inode *inode, u64 start, u64 end,
|
|
|
BTRFS_I(inode)->flags |= BTRFS_INODE_PREALLOC;
|
|
|
if (!(mode & FALLOC_FL_KEEP_SIZE) &&
|
|
|
cur_offset > inode->i_size) {
|
|
|
- i_size_write(inode, cur_offset);
|
|
|
- btrfs_ordered_update_i_size(inode, cur_offset, NULL);
|
|
|
+ if (cur_offset > actual_len)
|
|
|
+ i_size = actual_len;
|
|
|
+ else
|
|
|
+ i_size = cur_offset;
|
|
|
+ i_size_write(inode, i_size);
|
|
|
+ btrfs_ordered_update_i_size(inode, i_size, NULL);
|
|
|
}
|
|
|
|
|
|
ret = btrfs_update_inode(trans, root, inode);
|
|
@@ -5940,7 +5940,7 @@ static long btrfs_fallocate(struct inode *inode, int mode,
|
|
|
!test_bit(EXTENT_FLAG_PREALLOC, &em->flags))) {
|
|
|
ret = prealloc_file_range(inode,
|
|
|
cur_offset, last_byte,
|
|
|
- alloc_hint, mode);
|
|
|
+ alloc_hint, mode, offset+len);
|
|
|
if (ret < 0) {
|
|
|
free_extent_map(em);
|
|
|
break;
|