aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChao Yu <yuchao0@huawei.com>2016-05-09 19:56:33 +0800
committerMister Oyster <oysterized@gmail.com>2017-04-13 12:33:31 +0200
commitd46bc42cf8e4a25d84b5e2571851116d6e35008e (patch)
treec15012da8d43bf8f920d385b9abcbcb19bfdff1b
parentce5f5f66b68176c2672340a8cf99c3097635a52b (diff)
f2fs: make atomic/volatile operation exclusive
atomic/volatile ioctl interfaces are exposed to user like other file operation interface, it needs to make them getting exclusion against to each other to avoid potential conflict among these operations in concurrent scenario. Signed-off-by: Chao Yu <yuchao0@huawei.com> Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
-rw-r--r--fs/f2fs/file.c16
1 files changed, 16 insertions, 0 deletions
diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c
index df4e8c728..708d39c02 100644
--- a/fs/f2fs/file.c
+++ b/fs/f2fs/file.c
@@ -1391,6 +1391,8 @@ static int f2fs_ioc_start_atomic_write(struct file *filp)
if (ret)
return ret;
+ inode_lock(inode);
+
if (f2fs_is_atomic_file(inode))
goto out;
@@ -1411,6 +1413,7 @@ static int f2fs_ioc_start_atomic_write(struct file *filp)
if (ret)
clear_inode_flag(F2FS_I(inode), FI_ATOMIC_FILE);
out:
+ inode_unlock(inode);
mnt_drop_write_file(filp);
return ret;
}
@@ -1427,6 +1430,8 @@ static int f2fs_ioc_commit_atomic_write(struct file *filp)
if (ret)
return ret;
+ inode_lock(inode);
+
if (f2fs_is_volatile_file(inode))
goto err_out;
@@ -1441,6 +1446,7 @@ static int f2fs_ioc_commit_atomic_write(struct file *filp)
ret = f2fs_do_sync_file(filp, 0, LLONG_MAX, 0, true);
err_out:
+ inode_unlock(inode);
mnt_drop_write_file(filp);
return ret;
}
@@ -1457,6 +1463,8 @@ static int f2fs_ioc_start_volatile_write(struct file *filp)
if (ret)
return ret;
+ inode_lock(inode);
+
if (f2fs_is_volatile_file(inode))
goto out;
@@ -1467,6 +1475,7 @@ static int f2fs_ioc_start_volatile_write(struct file *filp)
set_inode_flag(F2FS_I(inode), FI_VOLATILE_FILE);
f2fs_update_time(F2FS_I_SB(inode), REQ_TIME);
out:
+ inode_unlock(inode);
mnt_drop_write_file(filp);
return ret;
}
@@ -1483,6 +1492,8 @@ static int f2fs_ioc_release_volatile_write(struct file *filp)
if (ret)
return ret;
+ inode_lock(inode);
+
if (!f2fs_is_volatile_file(inode))
goto out;
@@ -1493,6 +1504,7 @@ static int f2fs_ioc_release_volatile_write(struct file *filp)
ret = punch_hole(inode, 0, F2FS_BLKSIZE);
out:
+ inode_unlock(inode);
mnt_drop_write_file(filp);
return ret;
}
@@ -1509,6 +1521,8 @@ static int f2fs_ioc_abort_volatile_write(struct file *filp)
if (ret)
return ret;
+ inode_lock(inode);
+
if (f2fs_is_atomic_file(inode))
drop_inmem_pages(inode);
if (f2fs_is_volatile_file(inode)) {
@@ -1516,6 +1530,8 @@ static int f2fs_ioc_abort_volatile_write(struct file *filp)
ret = f2fs_do_sync_file(filp, 0, LLONG_MAX, 0, true);
}
+ inode_unlock(inode);
+
mnt_drop_write_file(filp);
f2fs_update_time(F2FS_I_SB(inode), REQ_TIME);
return ret;