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: [email protected]
Signed-off-by: Chao Yu <[email protected]>
---
 fs/f2fs/file.c | 13 +++++++++++++
 1 file changed, 13 insertions(+)

diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c
index 76a6043caf27..f2d0e0de775f 100644
--- a/fs/f2fs/file.c
+++ b/fs/f2fs/file.c
@@ -1056,6 +1056,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);
 
@@ -1892,6 +1899,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;
-- 
2.40.1



_______________________________________________
Linux-f2fs-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel

Reply via email to