aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJaegeuk Kim <jaegeuk@kernel.org>2016-04-11 11:51:51 -0700
committerMister Oyster <oysterized@gmail.com>2017-04-13 12:33:18 +0200
commitfde8f351fc1cfc4e2b3d88083d1de5851a86bdf0 (patch)
tree0b52f26b1f1995cea440e2065f03e47c91d63e96
parentb7f097e5b6cd77d3145c95493f7d8057c22e82dd (diff)
f2fs: fix dropping inmemory pages in a wrong time
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>
-rw-r--r--fs/f2fs/file.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c
index 353b2fa27..dd376f18a 100644
--- a/fs/f2fs/file.c
+++ b/fs/f2fs/file.c
@@ -1282,6 +1282,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);