f2fs: unset atomic/volatile flag in f2fs_release_file
authorJaegeuk Kim <jaegeuk@kernel.org>
Mon, 11 Apr 2016 20:15:10 +0000 (13:15 -0700)
committerJaegeuk Kim <jaegeuk@kernel.org>
Fri, 15 Apr 2016 15:49:47 +0000 (08:49 -0700)
The atomic/volatile operation should be done in pair of start and commit
ioctl.
For example, if a killed process remains open-ended atomic operation, we should
drop its flag as well as its atomic data. Otherwise, if sqlite initiates another
operation which doesn't require atomic writes, it will lose every data, since
f2fs still treats with them as atomic writes; nobody will trigger its commit.

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

index e10eb61d9f6270fe7444c028c113d34b40065620..ed389f6a37b482a12891d57216e1f79312bae63b 100644 (file)
@@ -1266,6 +1266,7 @@ static int f2fs_release_file(struct inode *inode, struct file *filp)
        if (f2fs_is_atomic_file(inode))
                drop_inmem_pages(inode);
        if (f2fs_is_volatile_file(inode)) {
+               clear_inode_flag(F2FS_I(inode), FI_VOLATILE_FILE);
                set_inode_flag(F2FS_I(inode), FI_DROP_CACHE);
                filemap_fdatawrite(inode->i_mapping);
                clear_inode_flag(F2FS_I(inode), FI_DROP_CACHE);
@@ -1449,10 +1450,8 @@ static int f2fs_ioc_abort_volatile_write(struct file *filp)
        if (ret)
                return ret;
 
-       if (f2fs_is_atomic_file(inode)) {
-               clear_inode_flag(F2FS_I(inode), FI_ATOMIC_FILE);
+       if (f2fs_is_atomic_file(inode))
                drop_inmem_pages(inode);
-       }
        if (f2fs_is_volatile_file(inode)) {
                clear_inode_flag(F2FS_I(inode), FI_VOLATILE_FILE);
                ret = f2fs_sync_file(filp, 0, LLONG_MAX, 0);
index 540669d6978e69f7b1bcf27f479ef961e1eabde0..299c784f5b61e777d0897bc83b87926688779774 100644 (file)
@@ -239,6 +239,8 @@ void drop_inmem_pages(struct inode *inode)
 {
        struct f2fs_inode_info *fi = F2FS_I(inode);
 
+       clear_inode_flag(F2FS_I(inode), FI_ATOMIC_FILE);
+
        mutex_lock(&fi->inmem_lock);
        __revoke_inmem_pages(inode, &fi->inmem_pages, true, false);
        mutex_unlock(&fi->inmem_lock);