mirror of
				https://github.com/torvalds/linux.git
				synced 2025-10-31 16:48:26 +02:00 
			
		
		
		
	f2fs: prevent atomic file from being dirtied before commit
Keep atomic file clean while updating and make it dirtied during commit
in order to avoid unnecessary and excessive inode updates in the previous
fix.
Fixes: 4bf7832234 ("f2fs: mark inode dirty for FI_ATOMIC_COMMITTED flag")
Signed-off-by: Daeho Jeong <daehojeong@google.com>
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
			
			
This commit is contained in:
		
							parent
							
								
									5697e94daa
								
							
						
					
					
						commit
						fccaa81de8
					
				
					 3 changed files with 14 additions and 1 deletions
				
			
		|  | @ -808,6 +808,7 @@ enum { | |||
| 	FI_ALIGNED_WRITE,	/* enable aligned write */ | ||||
| 	FI_COW_FILE,		/* indicate COW file */ | ||||
| 	FI_ATOMIC_COMMITTED,	/* indicate atomic commit completed except disk sync */ | ||||
| 	FI_ATOMIC_DIRTIED,	/* indicate atomic file is dirtied */ | ||||
| 	FI_ATOMIC_REPLACE,	/* indicate atomic replace */ | ||||
| 	FI_OPENED_FILE,		/* indicate file has been opened */ | ||||
| 	FI_MAX,			/* max flag, never be used */ | ||||
|  | @ -3067,7 +3068,6 @@ static inline void __mark_inode_dirty_flag(struct inode *inode, | |||
| 	case FI_INLINE_DOTS: | ||||
| 	case FI_PIN_FILE: | ||||
| 	case FI_COMPRESS_RELEASED: | ||||
| 	case FI_ATOMIC_COMMITTED: | ||||
| 		f2fs_mark_inode_dirty_sync(inode, true); | ||||
| 	} | ||||
| } | ||||
|  |  | |||
|  | @ -34,6 +34,11 @@ void f2fs_mark_inode_dirty_sync(struct inode *inode, bool sync) | |||
| 	if (f2fs_inode_dirtied(inode, sync)) | ||||
| 		return; | ||||
| 
 | ||||
| 	if (f2fs_is_atomic_file(inode)) { | ||||
| 		set_inode_flag(inode, FI_ATOMIC_DIRTIED); | ||||
| 		return; | ||||
| 	} | ||||
| 
 | ||||
| 	mark_inode_dirty_sync(inode); | ||||
| } | ||||
| 
 | ||||
|  |  | |||
|  | @ -199,6 +199,10 @@ void f2fs_abort_atomic_write(struct inode *inode, bool clean) | |||
| 	clear_inode_flag(inode, FI_ATOMIC_COMMITTED); | ||||
| 	clear_inode_flag(inode, FI_ATOMIC_REPLACE); | ||||
| 	clear_inode_flag(inode, FI_ATOMIC_FILE); | ||||
| 	if (is_inode_flag_set(inode, FI_ATOMIC_DIRTIED)) { | ||||
| 		clear_inode_flag(inode, FI_ATOMIC_DIRTIED); | ||||
| 		f2fs_mark_inode_dirty_sync(inode, true); | ||||
| 	} | ||||
| 	stat_dec_atomic_inode(inode); | ||||
| 
 | ||||
| 	F2FS_I(inode)->atomic_write_task = NULL; | ||||
|  | @ -366,6 +370,10 @@ static int __f2fs_commit_atomic_write(struct inode *inode) | |||
| 	} else { | ||||
| 		sbi->committed_atomic_block += fi->atomic_write_cnt; | ||||
| 		set_inode_flag(inode, FI_ATOMIC_COMMITTED); | ||||
| 		if (is_inode_flag_set(inode, FI_ATOMIC_DIRTIED)) { | ||||
| 			clear_inode_flag(inode, FI_ATOMIC_DIRTIED); | ||||
| 			f2fs_mark_inode_dirty_sync(inode, true); | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	__complete_revoke_list(inode, &revoke_list, ret ? true : false); | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Daeho Jeong
						Daeho Jeong