@@ -836,6 +836,19 @@ static long f2fs_fallocate(struct file *file, int mode,
836
836
return ret ;
837
837
}
838
838
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
+
839
852
#define F2FS_REG_FLMASK (~(FS_DIRSYNC_FL | FS_TOPDIR_FL))
840
853
#define F2FS_OTHER_FLMASK (FS_NODUMP_FL | FS_NOATIME_FL)
841
854
@@ -909,26 +922,20 @@ static int f2fs_ioc_setflags(struct file *filp, unsigned long arg)
909
922
static int f2fs_ioc_start_atomic_write (struct file * filp )
910
923
{
911
924
struct inode * inode = file_inode (filp );
912
- struct f2fs_sb_info * sbi = F2FS_I_SB (inode );
913
925
914
926
if (!inode_owner_or_capable (inode ))
915
927
return - EACCES ;
916
928
917
- f2fs_balance_fs (sbi );
929
+ f2fs_balance_fs (F2FS_I_SB (inode ));
930
+
931
+ if (f2fs_is_atomic_file (inode ))
932
+ return 0 ;
918
933
919
934
set_inode_flag (F2FS_I (inode ), FI_ATOMIC_FILE );
920
935
921
936
return f2fs_convert_inline_inode (inode );
922
937
}
923
938
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
-
932
939
static int f2fs_ioc_commit_atomic_write (struct file * filp )
933
940
{
934
941
struct inode * inode = file_inode (filp );
@@ -949,6 +956,7 @@ static int f2fs_ioc_commit_atomic_write(struct file *filp)
949
956
950
957
ret = f2fs_sync_file (filp , 0 , LONG_MAX , 0 );
951
958
mnt_drop_write_file (filp );
959
+ clear_inode_flag (F2FS_I (inode ), FI_ATOMIC_FILE );
952
960
return ret ;
953
961
}
954
962
@@ -959,11 +967,56 @@ static int f2fs_ioc_start_volatile_write(struct file *filp)
959
967
if (!inode_owner_or_capable (inode ))
960
968
return - EACCES ;
961
969
970
+ if (f2fs_is_volatile_file (inode ))
971
+ return 0 ;
972
+
962
973
set_inode_flag (F2FS_I (inode ), FI_VOLATILE_FILE );
963
974
964
975
return f2fs_convert_inline_inode (inode );
965
976
}
966
977
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
+
967
1020
static int f2fs_ioc_fitrim (struct file * filp , unsigned long arg )
968
1021
{
969
1022
struct inode * inode = file_inode (filp );
@@ -1007,6 +1060,10 @@ long f2fs_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
1007
1060
return f2fs_ioc_commit_atomic_write (filp );
1008
1061
case F2FS_IOC_START_VOLATILE_WRITE :
1009
1062
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 );
1010
1067
case FITRIM :
1011
1068
return f2fs_ioc_fitrim (filp , arg );
1012
1069
default :
0 commit comments