| From f5002433ebfd418670c0f5881e50f7c538aaace1 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Tue, 18 May 2021 17:54:58 +0800 |
| Subject: f2fs: compress: fix to disallow temp extension |
| |
| From: Chao Yu <yuchao0@huawei.com> |
| |
| [ Upstream commit 4a67d9b07ac8dce7f1034e0d887f2f4ee00fe118 ] |
| |
| This patch restricts to configure compress extension as format of: |
| |
| [filename + '.' + extension] |
| |
| rather than: |
| |
| [filename + '.' + extension + (optional: '.' + temp extension)] |
| |
| in order to avoid to enable compression incorrectly: |
| |
| 1. compress_extension=so |
| 2. touch file.soa |
| 3. touch file.so.tmp |
| |
| Fixes: 4c8ff7095bef ("f2fs: support data compression") |
| Signed-off-by: Chao Yu <yuchao0@huawei.com> |
| Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| fs/f2fs/namei.c | 16 ++++++++++++---- |
| 1 file changed, 12 insertions(+), 4 deletions(-) |
| |
| diff --git a/fs/f2fs/namei.c b/fs/f2fs/namei.c |
| index 17bd072a5d39..11aafe93180c 100644 |
| --- a/fs/f2fs/namei.c |
| +++ b/fs/f2fs/namei.c |
| @@ -153,7 +153,8 @@ fail_drop: |
| return ERR_PTR(err); |
| } |
| |
| -static inline int is_extension_exist(const unsigned char *s, const char *sub) |
| +static inline int is_extension_exist(const unsigned char *s, const char *sub, |
| + bool tmp_ext) |
| { |
| size_t slen = strlen(s); |
| size_t sublen = strlen(sub); |
| @@ -169,6 +170,13 @@ static inline int is_extension_exist(const unsigned char *s, const char *sub) |
| if (slen < sublen + 2) |
| return 0; |
| |
| + if (!tmp_ext) { |
| + /* file has no temp extension */ |
| + if (s[slen - sublen - 1] != '.') |
| + return 0; |
| + return !strncasecmp(s + slen - sublen, sub, sublen); |
| + } |
| + |
| for (i = 1; i < slen - sublen; i++) { |
| if (s[i] != '.') |
| continue; |
| @@ -194,7 +202,7 @@ static inline void set_file_temperature(struct f2fs_sb_info *sbi, struct inode * |
| hot_count = sbi->raw_super->hot_ext_count; |
| |
| for (i = 0; i < cold_count + hot_count; i++) { |
| - if (is_extension_exist(name, extlist[i])) |
| + if (is_extension_exist(name, extlist[i], true)) |
| break; |
| } |
| |
| @@ -295,7 +303,7 @@ static void set_compress_inode(struct f2fs_sb_info *sbi, struct inode *inode, |
| hot_count = sbi->raw_super->hot_ext_count; |
| |
| for (i = cold_count; i < cold_count + hot_count; i++) { |
| - if (is_extension_exist(name, extlist[i])) { |
| + if (is_extension_exist(name, extlist[i], false)) { |
| up_read(&sbi->sb_lock); |
| return; |
| } |
| @@ -306,7 +314,7 @@ static void set_compress_inode(struct f2fs_sb_info *sbi, struct inode *inode, |
| ext = F2FS_OPTION(sbi).extensions; |
| |
| for (i = 0; i < ext_cnt; i++) { |
| - if (!is_extension_exist(name, ext[i])) |
| + if (!is_extension_exist(name, ext[i], false)) |
| continue; |
| |
| set_compress_context(inode); |
| -- |
| 2.30.2 |
| |