f2fs: fix to wait dio completion
authorChao Yu <chao@kernel.org>
Thu, 27 Jun 2024 07:17:11 +0000 (15:17 +0800)
committerJaegeuk Kim <jaegeuk@kernel.org>
Thu, 15 Aug 2024 15:26:39 +0000 (15:26 +0000)
It should wait all existing dio write IOs before block removal,
otherwise, previous direct write IO may overwrite data in the
block which may be reused by other inode.

Cc: stable@vger.kernel.org
Signed-off-by: Chao Yu <chao@kernel.org>
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
fs/f2fs/file.c

index e3bea57..67e5c60 100644 (file)
@@ -1055,6 +1055,13 @@ int f2fs_setattr(struct mnt_idmap *idmap, struct dentry *dentry,
                                return err;
                }
 
+               /*
+                * wait for inflight dio, blocks should be removed after
+                * IO completion.
+                */
+               if (attr->ia_size < old_size)
+                       inode_dio_wait(inode);
+
                f2fs_down_write(&fi->i_gc_rwsem[WRITE]);
                filemap_invalidate_lock(inode->i_mapping);
 
@@ -1891,6 +1898,12 @@ static long f2fs_fallocate(struct file *file, int mode,
        if (ret)
                goto out;
 
+       /*
+        * wait for inflight dio, blocks should be removed after IO
+        * completion.
+        */
+       inode_dio_wait(inode);
+
        if (mode & FALLOC_FL_PUNCH_HOLE) {
                if (offset >= inode->i_size)
                        goto out;