f2fs: implement -o dirsync
Subsystems (2)
Jaegeuk Kim
maintainerPATCH 1/1 f2fs: implement -o dirsync
If a mount option has dirsync, we should call checkpoint for all the directory operations.
--- fs/f2fs/namei.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+)
fs/f2fs/namei.c +24 -0
@@ -138,6 +138,9 @@ static int f2fs_create(struct inode *dir, struct dentry *dentry, umode_t mode,stat_inc_inline_inode (inode);d_instantiate (dentry, inode);unlock_new_inode (inode); + +if (IS_DIRSYNC (dir)) +f2fs_sync_fs (sbi->sb,1 );return 0 ; out:handle_failed_inode (inode);
@@ -164,6 +167,9 @@ static int f2fs_link(struct dentry *old_dentry, struct inode *dir,f2fs_unlock_op (sbi);d_instantiate (dentry, inode); + +if (IS_DIRSYNC (dir)) +f2fs_sync_fs (sbi->sb,1 );return 0 ; out:clear_inode_flag (F2FS_I (inode),FI_INC_LINK );
@@ -233,6 +239,9 @@ static int f2fs_unlink(struct inode *dir, struct dentry *dentry)f2fs_delete_entry (de, page, dir, inode);f2fs_unlock_op (sbi); +if (IS_DIRSYNC (dir)) +f2fs_sync_fs (sbi->sb,1 ); +/* In order to evict this inode, we set it dirty */ mark_inode_dirty (inode); fail:
@@ -268,6 +277,9 @@ static int f2fs_symlink(struct inode *dir, struct dentry *dentry,d_instantiate (dentry, inode);unlock_new_inode (inode); + +if (IS_DIRSYNC (dir)) +f2fs_sync_fs (sbi->sb,1 );return err; out:handle_failed_inode (inode);
@@ -304,6 +316,8 @@ static int f2fs_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode)d_instantiate (dentry, inode);unlock_new_inode (inode); +if (IS_DIRSYNC (dir)) +f2fs_sync_fs (sbi->sb,1 );return 0 ; out_fail:
@@ -346,8 +360,12 @@ static int f2fs_mknod(struct inode *dir, struct dentry *dentry,f2fs_unlock_op (sbi);alloc_nid_done (sbi, inode->i_ino); +d_instantiate (dentry, inode);unlock_new_inode (inode); + +if (IS_DIRSYNC (dir)) +f2fs_sync_fs (sbi->sb,1 );return 0 ; out:handle_failed_inode (inode);
@@ -461,6 +479,9 @@ static int f2fs_rename(struct inode *old_dir, struct dentry *old_dentry, }f2fs_unlock_op (sbi); + +if (IS_DIRSYNC (old_dir) ||IS_DIRSYNC (new_dir)) +f2fs_sync_fs (sbi->sb,1 );return 0 ; put_out_dir:
@@ -600,6 +621,9 @@ static int f2fs_cross_rename(struct inode *old_dir, struct dentry *old_dentry,update_inode_page (new_dir);f2fs_unlock_op (sbi); + +if (IS_DIRSYNC (old_dir) ||IS_DIRSYNC (new_dir)) +f2fs_sync_fs (sbi->sb,1 );return 0 ; out_undo:/* Still we may fail to recover name info of f2fs_inode here */
Signature · 4 lines
2.1.1 ------------------------------------------------------------------------------
Quoted 33 lines · Jaegeuk Kim
If a mount option has dirsync, we should call checkpoint for all the directory operations.
Signed-off-by Jaegeuk Kim <[email protected]>--- fs/f2fs/namei.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+)fs/f2fs/namei.c +6
-0@@ -138,6 +138,9 @@ static int f2fs_create(struct inode *dir, struct dentry *dentry, umode_t mode,stat_inc_inline_inode (inode);d_instantiate (dentry, inode);unlock_new_inode (inode); + +if (IS_DIRSYNC (dir)) +f2fs_sync_fs (sbi->sb,1 );return 0 ; out:handle_failed_inode (inode);@@ -164,6 +167,9 @@ static int f2fs_link(struct dentry *old_dentry, struct inode *dir,f2fs_unlock_op (sbi);d_instantiate (dentry, inode); + +if (IS_DIRSYNC (dir)) +f2fs_sync_fs (sbi->sb,1 );return 0 ; out:clear_inode_flag (F2FS_I (inode),FI_INC_LINK );
fs/f2fs/namei.c static int f2fs_unlink(struct inode *dir, struct dentry *dentry) · line 246
Quoted 8 lines
fs/f2fs/namei.c +3
-0@@ -233,6 +239,9 @@ static int f2fs_unlink(struct inode *dir, struct dentry *dentry)f2fs_delete_entry (de, page, dir, inode);f2fs_unlock_op (sbi); +if (IS_DIRSYNC (dir)) +f2fs_sync_fs (sbi->sb,1 ); +/* In order to evict this inode, we set it dirty */ mark_inode_dirty (inode);
Let's move it below mark_inode_dirty.
After sync, it's unnecessary inserting inode into dirty_list.
Quoted 62 lines
fs/f2fs/namei.c +15
-0fail:@@ -268,6 +277,9 @@ static int f2fs_symlink(struct inode *dir, struct dentry *dentry,d_instantiate (dentry, inode);unlock_new_inode (inode); + +if (IS_DIRSYNC (dir)) +f2fs_sync_fs (sbi->sb,1 );return err; out:handle_failed_inode (inode);@@ -304,6 +316,8 @@ static int f2fs_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode)d_instantiate (dentry, inode);unlock_new_inode (inode); +if (IS_DIRSYNC (dir)) +f2fs_sync_fs (sbi->sb,1 );return 0 ; out_fail:@@ -346,8 +360,12 @@ static int f2fs_mknod(struct inode *dir, struct dentry *dentry,f2fs_unlock_op (sbi);alloc_nid_done (sbi, inode->i_ino); +d_instantiate (dentry, inode);unlock_new_inode (inode); + +if (IS_DIRSYNC (dir)) +f2fs_sync_fs (sbi->sb,1 );return 0 ; out:handle_failed_inode (inode);@@ -461,6 +479,9 @@ static int f2fs_rename(struct inode *old_dir, struct dentry *old_dentry, }f2fs_unlock_op (sbi); + +if (IS_DIRSYNC (old_dir) ||IS_DIRSYNC (new_dir)) +f2fs_sync_fs (sbi->sb,1 );return 0 ; put_out_dir:@@ -600,6 +621,9 @@ static int f2fs_cross_rename(struct inode *old_dir, struct dentry *old_dentry,update_inode_page (new_dir);f2fs_unlock_op (sbi); + +if (IS_DIRSYNC (old_dir) ||IS_DIRSYNC (new_dir)) +f2fs_sync_fs (sbi->sb,1 );return 0 ; out_undo:/* Still we may fail to recover name info of f2fs_inode here */ Signature · 8 lines
2.1.1 ------------------------------------------------------------------------------ _______________________________________________ Linux-f2fs-devel mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel
------------------------------------------------------------------------------
Thanks Kim and Lee, I will try as soon I can.
Thanks for support
Paolo
------------------------------------------------------------------------------
Jaegeuk Kim
maintainerChange log from v1:
o call sync after mark_inode_dirty
If a mount option has dirsync, we should call checkpoint for all the directory operations.
--- fs/f2fs/namei.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+)
fs/f2fs/namei.c +24 -0
@@ -138,6 +138,9 @@ static int f2fs_create(struct inode *dir, struct dentry *dentry, umode_t mode,stat_inc_inline_inode (inode);d_instantiate (dentry, inode);unlock_new_inode (inode); + +if (IS_DIRSYNC (dir)) +f2fs_sync_fs (sbi->sb,1 );return 0 ; out:handle_failed_inode (inode);
@@ -164,6 +167,9 @@ static int f2fs_link(struct dentry *old_dentry, struct inode *dir,f2fs_unlock_op (sbi);d_instantiate (dentry, inode); + +if (IS_DIRSYNC (dir)) +f2fs_sync_fs (sbi->sb,1 );return 0 ; out:clear_inode_flag (F2FS_I (inode),FI_INC_LINK );
@@ -235,6 +241,9 @@ static int f2fs_unlink(struct inode *dir, struct dentry *dentry)/* In order to evict this inode, we set it dirty */ mark_inode_dirty (inode); + +if (IS_DIRSYNC (dir)) +f2fs_sync_fs (sbi->sb,1 ); fail:trace_f2fs_unlink_exit (inode, err);return err;
@@ -268,6 +277,9 @@ static int f2fs_symlink(struct inode *dir, struct dentry *dentry,d_instantiate (dentry, inode);unlock_new_inode (inode); + +if (IS_DIRSYNC (dir)) +f2fs_sync_fs (sbi->sb,1 );return err; out:handle_failed_inode (inode);
@@ -304,6 +316,8 @@ static int f2fs_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode)d_instantiate (dentry, inode);unlock_new_inode (inode); +if (IS_DIRSYNC (dir)) +f2fs_sync_fs (sbi->sb,1 );return 0 ; out_fail:
@@ -346,8 +360,12 @@ static int f2fs_mknod(struct inode *dir, struct dentry *dentry,f2fs_unlock_op (sbi);alloc_nid_done (sbi, inode->i_ino); +d_instantiate (dentry, inode);unlock_new_inode (inode); + +if (IS_DIRSYNC (dir)) +f2fs_sync_fs (sbi->sb,1 );return 0 ; out:handle_failed_inode (inode);
@@ -461,6 +479,9 @@ static int f2fs_rename(struct inode *old_dir, struct dentry *old_dentry, }f2fs_unlock_op (sbi); + +if (IS_DIRSYNC (old_dir) ||IS_DIRSYNC (new_dir)) +f2fs_sync_fs (sbi->sb,1 );return 0 ; put_out_dir:
@@ -600,6 +621,9 @@ static int f2fs_cross_rename(struct inode *old_dir, struct dentry *old_dentry,update_inode_page (new_dir);f2fs_unlock_op (sbi); + +if (IS_DIRSYNC (old_dir) ||IS_DIRSYNC (new_dir)) +f2fs_sync_fs (sbi->sb,1 );return 0 ; out_undo:/* Still we may fail to recover name info of f2fs_inode here */
Signature · 1 line
2.1.1
I tried the patches (fastboot and dirsync) with user mode linux (3.0.101). It seems works.
Only 2 points :
1) The -o fastboot seems necessary to avoid the recovery at mount. I agree.
2) If I use
mount -o sync ...
IS_DIRSYNC(...) is always true! It seems that I do not need -o
dirsync (-o sync seems enough).
Do you agree ?
So, finally, it seems to me that if I use
mount -o sync,fastboot
I mount in synced mode, that is good gor power cut-off.
Now I will investigate stressing my ARM system with power cut-off. Thanks,
Paolo
Il 10/11/2014 15:49, Jaegeuk Kim ha scritto:
Quoted 88 lines
Change log from v1:
o call sync aftermark_inode_dirtyIf a mount option has dirsync, we should call checkpoint for all the directory operations.
Signed-off-by Jaegeuk Kim <[email protected]>--- fs/f2fs/namei.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+)fs/f2fs/namei.c +21
-0@@ -138,6 +138,9 @@ static int f2fs_create(struct inode *dir, struct dentry *dentry, umode_t mode,stat_inc_inline_inode (inode);d_instantiate (dentry, inode);unlock_new_inode (inode); + +if (IS_DIRSYNC (dir)) +f2fs_sync_fs (sbi->sb,1 );return 0 ; out:handle_failed_inode (inode);@@ -164,6 +167,9 @@ static int f2fs_link(struct dentry *old_dentry, struct inode *dir,f2fs_unlock_op (sbi);d_instantiate (dentry, inode); + +if (IS_DIRSYNC (dir)) +f2fs_sync_fs (sbi->sb,1 );return 0 ; out:clear_inode_flag (F2FS_I (inode),FI_INC_LINK );@@ -235,6 +241,9 @@ static int f2fs_unlink(struct inode *dir, struct dentry *dentry)/* In order to evict this inode, we set it dirty */ mark_inode_dirty (inode); + +if (IS_DIRSYNC (dir)) +f2fs_sync_fs (sbi->sb,1 ); fail:trace_f2fs_unlink_exit (inode, err);return err;@@ -268,6 +277,9 @@ static int f2fs_symlink(struct inode *dir, struct dentry *dentry,d_instantiate (dentry, inode);unlock_new_inode (inode); + +if (IS_DIRSYNC (dir)) +f2fs_sync_fs (sbi->sb,1 );return err; out:handle_failed_inode (inode);@@ -304,6 +316,8 @@ static int f2fs_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode)d_instantiate (dentry, inode);unlock_new_inode (inode); +if (IS_DIRSYNC (dir)) +f2fs_sync_fs (sbi->sb,1 );return 0 ; out_fail:@@ -346,8 +360,12 @@ static int f2fs_mknod(struct inode *dir, struct dentry *dentry,f2fs_unlock_op (sbi);alloc_nid_done (sbi, inode->i_ino); +d_instantiate (dentry, inode);unlock_new_inode (inode); + +if (IS_DIRSYNC (dir)) +f2fs_sync_fs (sbi->sb,1 );return 0 ; out:handle_failed_inode (inode);@@ -461,6 +479,9 @@ static int f2fs_rename(struct inode *old_dir, struct dentry *old_dentry, }f2fs_unlock_op (sbi); + +if (IS_DIRSYNC (old_dir) ||IS_DIRSYNC (new_dir)) +f2fs_sync_fs (sbi->sb,1 );return 0 ; put_out_dir:
fs/f2fs/namei.c static int f2fs_cross_rename(struct inode *old_dir, struct dentry *old_dentry, · line 629
Quoted 9 lines
fs/f2fs/namei.c +3
-0@@ -600,6 +621,9 @@ static int f2fs_cross_rename(struct inode *old_dir, struct dentry *old_dentry,update_inode_page (new_dir);f2fs_unlock_op (sbi); + +if (IS_DIRSYNC (old_dir) ||IS_DIRSYNC (new_dir)) +f2fs_sync_fs (sbi->sb,1 );return 0 ; out_undo:/* Still we may fail to recover name info of f2fs_inode here */
------------------------------------------------------------------------------
Comprehensive Server Monitoring with Site24x7.
Monitor 10 servers for $9/Month.
Get alerted through email, SMS, voice calls or mobile push notifications. Take corrective actions from your mobile device.
http://pubads.g.doubleclick.net/gampad/clk?id=154624111&iu=/4140/ostg.clktrk