diff options
Diffstat (limited to 'fs/f2fs/inode.c')
| -rw-r--r-- | fs/f2fs/inode.c | 22 | 
1 files changed, 18 insertions, 4 deletions
diff --git a/fs/f2fs/inode.c b/fs/f2fs/inode.c index 0f8b2df3e1e0..0ec8e32a00b4 100644 --- a/fs/f2fs/inode.c +++ b/fs/f2fs/inode.c @@ -8,8 +8,8 @@  #include <linux/fs.h>  #include <linux/f2fs_fs.h>  #include <linux/buffer_head.h> -#include <linux/backing-dev.h>  #include <linux/writeback.h> +#include <linux/sched/mm.h>  #include "f2fs.h"  #include "node.h" @@ -516,6 +516,11 @@ make_now:  	} else if (ino == F2FS_COMPRESS_INO(sbi)) {  #ifdef CONFIG_F2FS_FS_COMPRESSION  		inode->i_mapping->a_ops = &f2fs_compress_aops; +		/* +		 * generic_error_remove_page only truncates pages of regular +		 * inode +		 */ +		inode->i_mode |= S_IFREG;  #endif  		mapping_set_gfp_mask(inode->i_mapping,  			GFP_NOFS | __GFP_HIGHMEM | __GFP_MOVABLE); @@ -544,6 +549,14 @@ make_now:  		goto bad_inode;  	}  	f2fs_set_inode_flags(inode); + +	if (file_should_truncate(inode)) { +		ret = f2fs_truncate(inode); +		if (ret) +			goto bad_inode; +		file_dont_truncate(inode); +	} +  	unlock_new_inode(inode);  	trace_f2fs_iget(inode);  	return inode; @@ -562,7 +575,7 @@ retry:  	inode = f2fs_iget(sb, ino);  	if (IS_ERR(inode)) {  		if (PTR_ERR(inode) == -ENOMEM) { -			congestion_wait(BLK_RW_ASYNC, DEFAULT_IO_TIMEOUT); +			memalloc_retry_wait(GFP_NOFS);  			goto retry;  		}  	} @@ -738,7 +751,8 @@ void f2fs_evict_inode(struct inode *inode)  	trace_f2fs_evict_inode(inode);  	truncate_inode_pages_final(&inode->i_data); -	if (test_opt(sbi, COMPRESS_CACHE) && f2fs_compressed_file(inode)) +	if ((inode->i_nlink || is_bad_inode(inode)) && +		test_opt(sbi, COMPRESS_CACHE) && f2fs_compressed_file(inode))  		f2fs_invalidate_compress_pages(sbi, inode->i_ino);  	if (inode->i_ino == F2FS_NODE_INO(sbi) || @@ -868,7 +882,7 @@ void f2fs_handle_failed_inode(struct inode *inode)  	 * so we can prevent losing this orphan when encoutering checkpoint  	 * and following suddenly power-off.  	 */ -	err = f2fs_get_node_info(sbi, inode->i_ino, &ni); +	err = f2fs_get_node_info(sbi, inode->i_ino, &ni, false);  	if (err) {  		set_sbi_flag(sbi, SBI_NEED_FSCK);  		f2fs_warn(sbi, "May loss orphan inode, run fsck to fix.");  |