f2fs: flush symlink path to avoid broken symlink after POR
authorJaegeuk Kim <jaegeuk@kernel.org>
Wed, 15 Apr 2015 20:37:53 +0000 (13:37 -0700)
committerJaegeuk Kim <jaegeuk@kernel.org>
Thu, 16 Apr 2015 16:45:35 +0000 (09:45 -0700)
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 <jaegeuk@kernel.org>
fs/f2fs/namei.c

index 8055e30..9f0eec4 100644 (file)
@@ -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;