* We lost i_pino from now on.
         */
        if (is_inode_flag_set(F2FS_I(inode), FI_INC_LINK)) {
-               set_cp_file(inode);
+               file_lost_pino(inode);
                inc_nlink(inode);
        }
        return page;
 
  * i_advise uses FADVISE_XXX_BIT. We can add additional hints later.
  */
 #define FADVISE_COLD_BIT       0x01
-#define FADVISE_CP_BIT         0x02
+#define FADVISE_LOST_PINO_BIT  0x02
 
 struct f2fs_inode_info {
        struct inode vfs_inode;         /* serve a vfs inode */
 
        .remap_pages    = generic_file_remap_pages,
 };
 
+static int get_parent_ino(struct inode *inode, nid_t *pino)
+{
+       struct dentry *dentry;
+
+       inode = igrab(inode);
+       dentry = d_find_any_alias(inode);
+       iput(inode);
+       if (!dentry)
+               return 0;
+
+       inode = igrab(dentry->d_parent->d_inode);
+       dput(dentry);
+
+       *pino = inode->i_ino;
+       iput(inode);
+       return 1;
+}
+
 int f2fs_sync_file(struct file *file, loff_t start, loff_t end, int datasync)
 {
        struct inode *inode = file->f_mapping->host;
 
        if (!S_ISREG(inode->i_mode) || inode->i_nlink != 1)
                need_cp = true;
-       else if (is_cp_file(inode))
+       else if (file_wrong_pino(inode))
                need_cp = true;
        else if (!space_for_roll_forward(sbi))
                need_cp = true;
                need_cp = true;
 
        if (need_cp) {
+               nid_t pino;
+
                /* all the dirty node pages should be flushed for POR */
                ret = f2fs_sync_fs(inode->i_sb, 1);
+               if (file_wrong_pino(inode) && inode->i_nlink == 1 &&
+                                       get_parent_ino(inode, &pino)) {
+                       F2FS_I(inode)->i_pino = pino;
+                       file_got_pino(inode);
+                       mark_inode_dirty_sync(inode);
+                       ret = f2fs_write_inode(inode, NULL);
+                       if (ret)
+                               goto out;
+               }
        } else {
                /* if there is no written node page, write its inode page */
                while (!sync_node_pages(sbi, inode->i_ino, &wbc)) {
 
        int count = le32_to_cpu(sbi->raw_super->extension_count);
        for (i = 0; i < count; i++) {
                if (is_multimedia_file(name, extlist[i])) {
-                       set_cold_file(inode);
+                       file_set_cold(inode);
                        break;
                }
        }
 
        F2FS_I(inode)->i_advise |= type;
 }
 
-#define is_cold_file(inode)    is_file(inode, FADVISE_COLD_BIT)
-#define is_cp_file(inode)      is_file(inode, FADVISE_CP_BIT)
-#define set_cold_file(inode)   set_file(inode, FADVISE_COLD_BIT)
-#define set_cp_file(inode)     set_file(inode, FADVISE_CP_BIT)
+static inline void clear_file(struct inode *inode, int type)
+{
+       F2FS_I(inode)->i_advise &= ~type;
+}
+
+#define file_is_cold(inode)    is_file(inode, FADVISE_COLD_BIT)
+#define file_wrong_pino(inode) is_file(inode, FADVISE_LOST_PINO_BIT)
+#define file_set_cold(inode)   set_file(inode, FADVISE_COLD_BIT)
+#define file_lost_pino(inode)  set_file(inode, FADVISE_LOST_PINO_BIT)
+#define file_clear_cold(inode) clear_file(inode, FADVISE_COLD_BIT)
+#define file_got_pino(inode)   clear_file(inode, FADVISE_LOST_PINO_BIT)
 
 static inline int is_cold_data(struct page *page)
 {
 
 
                if (S_ISDIR(inode->i_mode))
                        return CURSEG_HOT_DATA;
-               else if (is_cold_data(page) || is_cold_file(inode))
+               else if (is_cold_data(page) || file_is_cold(inode))
                        return CURSEG_COLD_DATA;
                else
                        return CURSEG_WARM_DATA;