Btrfs: add missing inode version, ctime and mtime updates when punching hole
[sfrench/cifs-2.6.git] / fs / btrfs / file.c
index 89f5be2bfb432c64f50aefea1cefec60277de58e..b455bdf46faa9e4ddc765f97e15a0c85366bf443 100644 (file)
@@ -1550,30 +1550,20 @@ static noinline int check_can_nocow(struct btrfs_inode *inode, loff_t pos,
 {
        struct btrfs_fs_info *fs_info = inode->root->fs_info;
        struct btrfs_root *root = inode->root;
-       struct btrfs_ordered_extent *ordered;
        u64 lockstart, lockend;
        u64 num_bytes;
        int ret;
 
        ret = btrfs_start_write_no_snapshotting(root);
        if (!ret)
-               return -ENOSPC;
+               return -EAGAIN;
 
        lockstart = round_down(pos, fs_info->sectorsize);
        lockend = round_up(pos + *write_bytes,
                           fs_info->sectorsize) - 1;
 
-       while (1) {
-               lock_extent(&inode->io_tree, lockstart, lockend);
-               ordered = btrfs_lookup_ordered_range(inode, lockstart,
-                                                    lockend - lockstart + 1);
-               if (!ordered) {
-                       break;
-               }
-               unlock_extent(&inode->io_tree, lockstart, lockend);
-               btrfs_start_ordered_extent(&inode->vfs_inode, ordered, 1);
-               btrfs_put_ordered_extent(ordered);
-       }
+       btrfs_lock_and_flush_ordered_range(&inode->io_tree, inode, lockstart,
+                                          lockend, NULL);
 
        num_bytes = lockend - lockstart + 1;
        ret = can_nocow_extent(&inode->vfs_inode, lockstart, &num_bytes,
@@ -2721,6 +2711,11 @@ out_only_mutex:
                 * for detecting, at fsync time, if the inode isn't yet in the
                 * log tree or it's there but not up to date.
                 */
+               struct timespec64 now = current_time(inode);
+
+               inode_inc_iversion(inode);
+               inode->i_mtime = now;
+               inode->i_ctime = now;
                trans = btrfs_start_transaction(root, 1);
                if (IS_ERR(trans)) {
                        err = PTR_ERR(trans);