From: Jaegeuk Kim Date: Wed, 15 Apr 2015 20:37:53 +0000 (-0700) Subject: f2fs: flush symlink path to avoid broken symlink after POR X-Git-Tag: v4.1-rc1~87^2~2 X-Git-Url: https://git.karo-electronics.de/?a=commitdiff_plain;h=d0cae97cb600d84a7e00df6f83ab3b2f60d8d7f7;p=karo-tx-linux.git f2fs: flush symlink path to avoid broken symlink after POR This patch tries to avoid broken symlink case after POR in best effort. This results in performance regression. But, if f2fs has inline_data and the target path is under 3KB-sized long, the page would be stored in its inode_block, so that there would be no performance regression. Note that, if user wants to keep this file atomically, it needs to trigger dir->fsync. And, there is still a hole to produce broken symlink. Signed-off-by: Jaegeuk Kim --- diff --git a/fs/f2fs/namei.c b/fs/f2fs/namei.c index 8055e30eb14d..9f0eec4677fe 100644 --- a/fs/f2fs/namei.c +++ b/fs/f2fs/namei.c @@ -324,6 +324,17 @@ static int f2fs_symlink(struct inode *dir, struct dentry *dentry, d_instantiate(dentry, inode); unlock_new_inode(inode); + /* + * Let's flush symlink data in order to avoid broken symlink as much as + * possible. Nevertheless, fsyncing is the best way, but there is no + * way to get a file descriptor in order to flush that. + * + * Note that, it needs to do dir->fsync to make this recoverable. + * If the symlink path is stored into inline_data, there is no + * performance regression. + */ + filemap_write_and_wait_range(inode->i_mapping, 0, symlen - 1); + if (IS_DIRSYNC(dir)) f2fs_sync_fs(sbi->sb, 1); return err;