f2fs: fix dropping inmemory pages in a wrong time
authorJaegeuk Kim <jaegeuk@kernel.org>
Mon, 11 Apr 2016 18:51:51 +0000 (11:51 -0700)
committerJaegeuk Kim <jaegeuk@kernel.org>
Fri, 15 Apr 2016 15:49:47 +0000 (08:49 -0700)
When one reader closes its file while the other writer is doing atomic writes,
f2fs_release_file drops atomic data resulting in an empty commit.
This patch fixes this wrong commit problem by checking openess of the file.

 Process0                       Process1
  open file
 start atomic write
 write data
 read data
close file
f2fs_release_file()
clear atomic data
 commit atomic write

Reported-by: Miao Xie <miaoxie@huawei.com>
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
fs/f2fs/file.c

index 90d1157a09f9b9b3dcc778d189a99d68c5512154..e10eb61d9f6270fe7444c028c113d34b40065620 100644 (file)
@@ -1254,6 +1254,14 @@ out:
 
 static int f2fs_release_file(struct inode *inode, struct file *filp)
 {
+       /*
+        * f2fs_relase_file is called at every close calls. So we should
+        * not drop any inmemory pages by close called by other process.
+        */
+       if (!(filp->f_mode & FMODE_WRITE) ||
+                       atomic_read(&inode->i_writecount) != 1)
+               return 0;
+
        /* some remained atomic pages should discarded */
        if (f2fs_is_atomic_file(inode))
                drop_inmem_pages(inode);