diff options
author | Tejun Heo <tj@kernel.org> | 2010-02-02 00:38:15 -0500 |
---|---|---|
committer | Tejun Heo <tj@kernel.org> | 2010-02-02 00:38:15 -0500 |
commit | ab386128f20c44c458a90039ab1bdc265ac474c9 (patch) | |
tree | 2ad188744922b1bb951fd10ff50dc04c83acce22 /fs/btrfs/inode.c | |
parent | dbfc196a3cc1a2514ad0737a82f764de23bd65e6 (diff) | |
parent | ab658321f32770b903a4426e2a6fae0392757755 (diff) |
Merge branch 'master' into percpu
Diffstat (limited to 'fs/btrfs/inode.c')
-rw-r--r-- | fs/btrfs/inode.c | 22 |
1 files changed, 16 insertions, 6 deletions
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index 5440bab23635..8cd109972fa6 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c | |||
@@ -483,7 +483,8 @@ again: | |||
483 | nr_pages_ret = 0; | 483 | nr_pages_ret = 0; |
484 | 484 | ||
485 | /* flag the file so we don't compress in the future */ | 485 | /* flag the file so we don't compress in the future */ |
486 | BTRFS_I(inode)->flags |= BTRFS_INODE_NOCOMPRESS; | 486 | if (!btrfs_test_opt(root, FORCE_COMPRESS)) |
487 | BTRFS_I(inode)->flags |= BTRFS_INODE_NOCOMPRESS; | ||
487 | } | 488 | } |
488 | if (will_compress) { | 489 | if (will_compress) { |
489 | *num_added += 1; | 490 | *num_added += 1; |
@@ -3995,7 +3996,11 @@ skip: | |||
3995 | 3996 | ||
3996 | /* Reached end of directory/root. Bump pos past the last item. */ | 3997 | /* Reached end of directory/root. Bump pos past the last item. */ |
3997 | if (key_type == BTRFS_DIR_INDEX_KEY) | 3998 | if (key_type == BTRFS_DIR_INDEX_KEY) |
3998 | filp->f_pos = INT_LIMIT(off_t); | 3999 | /* |
4000 | * 32-bit glibc will use getdents64, but then strtol - | ||
4001 | * so the last number we can serve is this. | ||
4002 | */ | ||
4003 | filp->f_pos = 0x7fffffff; | ||
3999 | else | 4004 | else |
4000 | filp->f_pos++; | 4005 | filp->f_pos++; |
4001 | nopos: | 4006 | nopos: |
@@ -5789,7 +5794,7 @@ out_fail: | |||
5789 | } | 5794 | } |
5790 | 5795 | ||
5791 | static int prealloc_file_range(struct inode *inode, u64 start, u64 end, | 5796 | static int prealloc_file_range(struct inode *inode, u64 start, u64 end, |
5792 | u64 alloc_hint, int mode) | 5797 | u64 alloc_hint, int mode, loff_t actual_len) |
5793 | { | 5798 | { |
5794 | struct btrfs_trans_handle *trans; | 5799 | struct btrfs_trans_handle *trans; |
5795 | struct btrfs_root *root = BTRFS_I(inode)->root; | 5800 | struct btrfs_root *root = BTRFS_I(inode)->root; |
@@ -5798,6 +5803,7 @@ static int prealloc_file_range(struct inode *inode, u64 start, u64 end, | |||
5798 | u64 cur_offset = start; | 5803 | u64 cur_offset = start; |
5799 | u64 num_bytes = end - start; | 5804 | u64 num_bytes = end - start; |
5800 | int ret = 0; | 5805 | int ret = 0; |
5806 | u64 i_size; | ||
5801 | 5807 | ||
5802 | while (num_bytes > 0) { | 5808 | while (num_bytes > 0) { |
5803 | alloc_size = min(num_bytes, root->fs_info->max_extent); | 5809 | alloc_size = min(num_bytes, root->fs_info->max_extent); |
@@ -5836,8 +5842,12 @@ static int prealloc_file_range(struct inode *inode, u64 start, u64 end, | |||
5836 | BTRFS_I(inode)->flags |= BTRFS_INODE_PREALLOC; | 5842 | BTRFS_I(inode)->flags |= BTRFS_INODE_PREALLOC; |
5837 | if (!(mode & FALLOC_FL_KEEP_SIZE) && | 5843 | if (!(mode & FALLOC_FL_KEEP_SIZE) && |
5838 | cur_offset > inode->i_size) { | 5844 | cur_offset > inode->i_size) { |
5839 | i_size_write(inode, cur_offset); | 5845 | if (cur_offset > actual_len) |
5840 | btrfs_ordered_update_i_size(inode, cur_offset, NULL); | 5846 | i_size = actual_len; |
5847 | else | ||
5848 | i_size = cur_offset; | ||
5849 | i_size_write(inode, i_size); | ||
5850 | btrfs_ordered_update_i_size(inode, i_size, NULL); | ||
5841 | } | 5851 | } |
5842 | 5852 | ||
5843 | ret = btrfs_update_inode(trans, root, inode); | 5853 | ret = btrfs_update_inode(trans, root, inode); |
@@ -5930,7 +5940,7 @@ static long btrfs_fallocate(struct inode *inode, int mode, | |||
5930 | !test_bit(EXTENT_FLAG_PREALLOC, &em->flags))) { | 5940 | !test_bit(EXTENT_FLAG_PREALLOC, &em->flags))) { |
5931 | ret = prealloc_file_range(inode, | 5941 | ret = prealloc_file_range(inode, |
5932 | cur_offset, last_byte, | 5942 | cur_offset, last_byte, |
5933 | alloc_hint, mode); | 5943 | alloc_hint, mode, offset+len); |
5934 | if (ret < 0) { | 5944 | if (ret < 0) { |
5935 | free_extent_map(em); | 5945 | free_extent_map(em); |
5936 | break; | 5946 | break; |