@@ -836,6 +836,19 @@ static long f2fs_fallocate(struct file *file, int mode,
836836 return ret ;
837837}
838838
839+ static int f2fs_release_file (struct inode * inode , struct file * filp )
840+ {
841+ /* some remained atomic pages should discarded */
842+ if (f2fs_is_atomic_file (inode ))
843+ commit_inmem_pages (inode , true);
844+ if (f2fs_is_volatile_file (inode )) {
845+ set_inode_flag (F2FS_I (inode ), FI_DROP_CACHE );
846+ filemap_fdatawrite (inode -> i_mapping );
847+ clear_inode_flag (F2FS_I (inode ), FI_DROP_CACHE );
848+ }
849+ return 0 ;
850+ }
851+
839852#define F2FS_REG_FLMASK (~(FS_DIRSYNC_FL | FS_TOPDIR_FL))
840853#define F2FS_OTHER_FLMASK (FS_NODUMP_FL | FS_NOATIME_FL)
841854
@@ -909,26 +922,20 @@ static int f2fs_ioc_setflags(struct file *filp, unsigned long arg)
909922static int f2fs_ioc_start_atomic_write (struct file * filp )
910923{
911924 struct inode * inode = file_inode (filp );
912- struct f2fs_sb_info * sbi = F2FS_I_SB (inode );
913925
914926 if (!inode_owner_or_capable (inode ))
915927 return - EACCES ;
916928
917- f2fs_balance_fs (sbi );
929+ f2fs_balance_fs (F2FS_I_SB (inode ));
930+
931+ if (f2fs_is_atomic_file (inode ))
932+ return 0 ;
918933
919934 set_inode_flag (F2FS_I (inode ), FI_ATOMIC_FILE );
920935
921936 return f2fs_convert_inline_inode (inode );
922937}
923938
924- static int f2fs_release_file (struct inode * inode , struct file * filp )
925- {
926- /* some remained atomic pages should discarded */
927- if (f2fs_is_atomic_file (inode ) || f2fs_is_volatile_file (inode ))
928- commit_inmem_pages (inode , true);
929- return 0 ;
930- }
931-
932939static int f2fs_ioc_commit_atomic_write (struct file * filp )
933940{
934941 struct inode * inode = file_inode (filp );
@@ -949,6 +956,7 @@ static int f2fs_ioc_commit_atomic_write(struct file *filp)
949956
950957 ret = f2fs_sync_file (filp , 0 , LONG_MAX , 0 );
951958 mnt_drop_write_file (filp );
959+ clear_inode_flag (F2FS_I (inode ), FI_ATOMIC_FILE );
952960 return ret ;
953961}
954962
@@ -959,11 +967,56 @@ static int f2fs_ioc_start_volatile_write(struct file *filp)
959967 if (!inode_owner_or_capable (inode ))
960968 return - EACCES ;
961969
970+ if (f2fs_is_volatile_file (inode ))
971+ return 0 ;
972+
962973 set_inode_flag (F2FS_I (inode ), FI_VOLATILE_FILE );
963974
964975 return f2fs_convert_inline_inode (inode );
965976}
966977
978+ static int f2fs_ioc_release_volatile_write (struct file * filp )
979+ {
980+ struct inode * inode = file_inode (filp );
981+
982+ if (!inode_owner_or_capable (inode ))
983+ return - EACCES ;
984+
985+ if (!f2fs_is_volatile_file (inode ))
986+ return 0 ;
987+
988+ punch_hole (inode , 0 , F2FS_BLKSIZE );
989+ return 0 ;
990+ }
991+
992+ static int f2fs_ioc_abort_volatile_write (struct file * filp )
993+ {
994+ struct inode * inode = file_inode (filp );
995+ int ret ;
996+
997+ if (!inode_owner_or_capable (inode ))
998+ return - EACCES ;
999+
1000+ ret = mnt_want_write_file (filp );
1001+ if (ret )
1002+ return ret ;
1003+
1004+ f2fs_balance_fs (F2FS_I_SB (inode ));
1005+
1006+ if (f2fs_is_atomic_file (inode )) {
1007+ commit_inmem_pages (inode , false);
1008+ clear_inode_flag (F2FS_I (inode ), FI_ATOMIC_FILE );
1009+ }
1010+
1011+ if (f2fs_is_volatile_file (inode )) {
1012+ clear_inode_flag (F2FS_I (inode ), FI_VOLATILE_FILE );
1013+ filemap_fdatawrite (inode -> i_mapping );
1014+ set_inode_flag (F2FS_I (inode ), FI_VOLATILE_FILE );
1015+ }
1016+ mnt_drop_write_file (filp );
1017+ return ret ;
1018+ }
1019+
9671020static int f2fs_ioc_fitrim (struct file * filp , unsigned long arg )
9681021{
9691022 struct inode * inode = file_inode (filp );
@@ -1007,6 +1060,10 @@ long f2fs_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
10071060 return f2fs_ioc_commit_atomic_write (filp );
10081061 case F2FS_IOC_START_VOLATILE_WRITE :
10091062 return f2fs_ioc_start_volatile_write (filp );
1063+ case F2FS_IOC_RELEASE_VOLATILE_WRITE :
1064+ return f2fs_ioc_release_volatile_write (filp );
1065+ case F2FS_IOC_ABORT_VOLATILE_WRITE :
1066+ return f2fs_ioc_abort_volatile_write (filp );
10101067 case FITRIM :
10111068 return f2fs_ioc_fitrim (filp , arg );
10121069 default :
0 commit comments