Commit a1a50f60a6bf4f861eb94793420274bc1ccd409a

Authored by Filipe Manana
Committed by Chris Mason
1 parent 7fb18a0664

Btrfs: read inode size after acquiring the mutex when punching a hole

In a previous change, commit 12870f1c9b2de7d475d22e73fd7db1b418599725,
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>

Showing 1 changed file with 2 additions and 1 deletions Side-by-side Diff

... ... @@ -2187,13 +2187,14 @@
2187 2187 bool same_page = ((offset >> PAGE_CACHE_SHIFT) ==
2188 2188 ((offset + len - 1) >> PAGE_CACHE_SHIFT));
2189 2189 bool no_holes = btrfs_fs_incompat(root->fs_info, NO_HOLES);
2190   - u64 ino_size = round_up(inode->i_size, PAGE_CACHE_SIZE);
  2190 + u64 ino_size;
2191 2191  
2192 2192 ret = btrfs_wait_ordered_range(inode, offset, len);
2193 2193 if (ret)
2194 2194 return ret;
2195 2195  
2196 2196 mutex_lock(&inode->i_mutex);
  2197 + ino_size = round_up(inode->i_size, PAGE_CACHE_SIZE);
2197 2198 /*
2198 2199 * We needn't truncate any page which is beyond the end of the file
2199 2200 * because we are sure there is no data there.