]> git.baikalelectronics.ru Git - kernel.git/commitdiff
Btrfs: read inode size after acquiring the mutex when punching a hole
authorFilipe Manana <fdmanana@gmail.com>
Sat, 26 Apr 2014 00:35:31 +0000 (01:35 +0100)
committerChris Mason <clm@fb.com>
Tue, 10 Jun 2014 00:20:24 +0000 (17:20 -0700)
In a previous change, commit fa1650f1c3ceced9426b770d0752d63ffcd8ae27,
I accidentally moved the roundup of inode->i_size to outside of the
critical section delimited by the inode mutex, which is not atomic and
not correct since the size can be changed by other task before we acquire
the mutex. Therefore fix it.

Signed-off-by: Filipe David Borba Manana <fdmanana@gmail.com>
Signed-off-by: Chris Mason <clm@fb.com>
fs/btrfs/file.c

index ae6af072b635e195e26f3199c3aabd427964881f..e4ff2d52ea2307aabc77817e7720cbd20c7b0fda 100644 (file)
@@ -2187,13 +2187,14 @@ static int btrfs_punch_hole(struct inode *inode, loff_t offset, loff_t len)
        bool same_page = ((offset >> PAGE_CACHE_SHIFT) ==
                          ((offset + len - 1) >> PAGE_CACHE_SHIFT));
        bool no_holes = btrfs_fs_incompat(root->fs_info, NO_HOLES);
-       u64 ino_size = round_up(inode->i_size, PAGE_CACHE_SIZE);
+       u64 ino_size;
 
        ret = btrfs_wait_ordered_range(inode, offset, len);
        if (ret)
                return ret;
 
        mutex_lock(&inode->i_mutex);
+       ino_size = round_up(inode->i_size, PAGE_CACHE_SIZE);
        /*
         * We needn't truncate any page which is beyond the end of the file
         * because we are sure there is no data there.