It needs to call f2fs_disable_compressed_file() to disable
compression on directory.
Signed-off-by: Chao Yu <[email protected]>
---
fs/f2fs/f2fs.h | 10 ++++++----
fs/f2fs/file.c | 2 +-
2 files changed, 7 insertions(+), 5 deletions(-)
diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h
index 9274399d9505..4e80cbe130d9 100644
--- a/fs/f2fs/f2fs.h
+++ b/fs/f2fs/f2fs.h
@@ -3850,10 +3850,12 @@ static inline u64 f2fs_disable_compressed_file(struct inode *inode)
if (!f2fs_compressed_file(inode))
return 0;
- if (get_dirty_pages(inode))
- return 1;
- if (fi->i_compr_blocks)
- return fi->i_compr_blocks;
+ if (S_ISREG(inode->i_mode)) {
+ if (get_dirty_pages(inode))
+ return 1;
+ if (fi->i_compr_blocks)
+ return fi->i_compr_blocks;
+ }
fi->i_flags &= ~F2FS_COMPR_FL;
stat_dec_compr_inode(inode);
diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c
index 1476a3bc6317..6cb3c6cae7cd 100644
--- a/fs/f2fs/file.c
+++ b/fs/f2fs/file.c
@@ -1815,7 +1815,7 @@ static int f2fs_setflags_common(struct inode *inode, u32 iflags, u32 mask)
}
if ((iflags ^ masked_flags) & F2FS_COMPR_FL) {
- if (S_ISREG(inode->i_mode) && (masked_flags & F2FS_COMPR_FL)) {
+ if (masked_flags & F2FS_COMPR_FL) {
if (f2fs_disable_compressed_file(inode))
return -EINVAL;
}
--
2.18.0.rc1
We can keep compressed inode's data inline before inline conversion.
Signed-off-by: Chao Yu <[email protected]>
---
fs/f2fs/file.c | 5 -----
1 file changed, 5 deletions(-)
diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c
index 6cb3c6cae7cd..21f7108ca2ba 100644
--- a/fs/f2fs/file.c
+++ b/fs/f2fs/file.c
@@ -1822,11 +1822,6 @@ static int f2fs_setflags_common(struct inode *inode, u32 iflags, u32 mask)
if (iflags & F2FS_NOCOMP_FL)
return -EINVAL;
if (iflags & F2FS_COMPR_FL) {
- int err = f2fs_convert_inline_inode(inode);
-
- if (err)
- return err;
-
if (!f2fs_may_compress(inode))
return -EINVAL;
--
2.18.0.rc1
Otherwise, for compressed inode, returned physical block address
may be wrong.
Signed-off-by: Chao Yu <[email protected]>
---
fs/f2fs/data.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c
index 24643680489b..f22f3ba10a48 100644
--- a/fs/f2fs/data.c
+++ b/fs/f2fs/data.c
@@ -3591,6 +3591,8 @@ static sector_t f2fs_bmap(struct address_space *mapping, sector_t block)
if (f2fs_has_inline_data(inode))
return 0;
+ if (f2fs_compressed_file(inode))
+ return 0;
/* make sure allocating whole blocks */
if (mapping_tagged(mapping, PAGECACHE_TAG_DIRTY))
--
2.18.0.rc1
On 03/27, Chao Yu wrote:
> Otherwise, for compressed inode, returned physical block address
> may be wrong.
We can use bmap to check the allocated (non)compressed blocks.
>
> Signed-off-by: Chao Yu <[email protected]>
> ---
> fs/f2fs/data.c | 2 ++
> 1 file changed, 2 insertions(+)
>
> diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c
> index 24643680489b..f22f3ba10a48 100644
> --- a/fs/f2fs/data.c
> +++ b/fs/f2fs/data.c
> @@ -3591,6 +3591,8 @@ static sector_t f2fs_bmap(struct address_space *mapping, sector_t block)
>
> if (f2fs_has_inline_data(inode))
> return 0;
> + if (f2fs_compressed_file(inode))
> + return 0;
>
> /* make sure allocating whole blocks */
> if (mapping_tagged(mapping, PAGECACHE_TAG_DIRTY))
> --
> 2.18.0.rc1
On 2020/3/28 3:32, Jaegeuk Kim wrote:
> On 03/27, Chao Yu wrote:
>> Otherwise, for compressed inode, returned physical block address
>> may be wrong.
>
> We can use bmap to check the allocated (non)compressed blocks.
Sure, I've updated it in v2.
Thanks,
>
>>
>> Signed-off-by: Chao Yu <[email protected]>
>> ---
>> fs/f2fs/data.c | 2 ++
>> 1 file changed, 2 insertions(+)
>>
>> diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c
>> index 24643680489b..f22f3ba10a48 100644
>> --- a/fs/f2fs/data.c
>> +++ b/fs/f2fs/data.c
>> @@ -3591,6 +3591,8 @@ static sector_t f2fs_bmap(struct address_space *mapping, sector_t block)
>>
>> if (f2fs_has_inline_data(inode))
>> return 0;
>> + if (f2fs_compressed_file(inode))
>> + return 0;
>>
>> /* make sure allocating whole blocks */
>> if (mapping_tagged(mapping, PAGECACHE_TAG_DIRTY))
>> --
>> 2.18.0.rc1
> .
>