Btrfs: truncate: don't update inode->i_blocks when extent is a hole
authorYan <yanzheng@21cn.com>
Mon, 17 Sep 2007 15:13:11 +0000 (11:13 -0400)
committerChris Mason <chris.mason@oracle.com>
Thu, 25 Sep 2008 15:03:56 +0000 (11:03 -0400)
I think check whether extent is a hole before update 'inode->i_blocks'
is unconditional required. (original codes check it only when
del_item isn't equal to 0)

Signed-off-by: Chris Mason <chris.mason@oracle.com>
fs/btrfs/inode.c

index 192fdda0d56eddc2aa2668aba7c67cd414a7b418..43bf4337859cf12ea52fa781566c539f397f301a 100644 (file)
@@ -595,6 +595,7 @@ static int btrfs_truncate_in_trans(struct btrfs_trans_handle *trans,
                           btrfs_file_extent_type(fi) !=
                           BTRFS_FILE_EXTENT_INLINE) {
                        u64 num_dec;
+                       extent_start = btrfs_file_extent_disk_blocknr(fi);
                        if (!del_item) {
                                u64 orig_num_blocks =
                                        btrfs_file_extent_num_blocks(fi);
@@ -604,12 +605,13 @@ static int btrfs_truncate_in_trans(struct btrfs_trans_handle *trans,
                                extent_num_blocks >>= inode->i_blkbits;
                                btrfs_set_file_extent_num_blocks(fi,
                                                         extent_num_blocks);
-                               inode->i_blocks -= (orig_num_blocks -
-                                       extent_num_blocks) << 3;
+                               num_dec = (orig_num_blocks -
+                                          extent_num_blocks) << 3;
+                               if (extent_start != 0) {
+                                       inode->i_blocks -= num_dec;
+                               }
                                btrfs_mark_buffer_dirty(path->nodes[0]);
                        } else {
-                               extent_start =
-                                       btrfs_file_extent_disk_blocknr(fi);
                                extent_num_blocks =
                                        btrfs_file_extent_disk_num_blocks(fi);
                                /* FIXME blocksize != 4096 */