[PATCH] f2fs: change the way of handling range.len in F2FS_IOC_SEC_TRIM_FILE

From: Daeho Jeong
Date: Thu Jul 09 2020 - 22:15:15 EST


From: Daeho Jeong <daehojeong@xxxxxxxxxx>

Changed the way of handling range.len of F2FS_IOC_SEC_TRIM_FILE.
1. Added -1 value support for range.len to signify the end of file.
2. If the end of the range passes over the end of file, it means until
the end of file.
3. ignored the case of that range.len is zero to prevent the function
from making end_addr zero and triggering different behaviour of
the function.

Signed-off-by: Daeho Jeong <daehojeong@xxxxxxxxxx>
---
fs/f2fs/file.c | 16 +++++++---------
1 file changed, 7 insertions(+), 9 deletions(-)

diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c
index 368c80f8e2a1..1c4601f99326 100644
--- a/fs/f2fs/file.c
+++ b/fs/f2fs/file.c
@@ -3813,21 +3813,19 @@ static int f2fs_sec_trim_file(struct file *filp, unsigned long arg)
file_start_write(filp);
inode_lock(inode);

- if (f2fs_is_atomic_file(inode) || f2fs_compressed_file(inode)) {
+ if (f2fs_is_atomic_file(inode) || f2fs_compressed_file(inode) ||
+ range.start >= inode->i_size) {
ret = -EINVAL;
goto err;
}

- if (range.start >= inode->i_size) {
- ret = -EINVAL;
+ if (range.len == 0)
goto err;
- }

- if (inode->i_size - range.start < range.len) {
- ret = -E2BIG;
- goto err;
- }
- end_addr = range.start + range.len;
+ if (range.len == (u64)-1 || inode->i_size - range.start < range.len)
+ end_addr = inode->i_size;
+ else
+ end_addr = range.start + range.len;

to_end = (end_addr == inode->i_size);
if (!IS_ALIGNED(range.start, F2FS_BLKSIZE) ||
--
2.27.0.383.g050319c2ae-goog