f2fs_update_inode_page(inode);
 
        /* 3: update and set xattr node page dirty */
-       if (page)
+       if (page) {
                memcpy(F2FS_NODE(xpage), F2FS_NODE(page),
                                VALID_XATTR_BLOCK_SIZE);
-
-       set_page_dirty(xpage);
+               set_page_dirty(xpage);
+       }
        f2fs_put_page(xpage, 1);
 
        return 0;
 
        here = __find_xattr(base_addr, last_base_addr, NULL, index, len, name);
        if (!here) {
                if (!F2FS_I(inode)->i_xattr_nid) {
+                       error = f2fs_recover_xattr_data(inode, NULL);
                        f2fs_notice(F2FS_I_SB(inode),
-                               "recover xattr in inode (%lu)", inode->i_ino);
-                       f2fs_recover_xattr_data(inode, NULL);
-                       kfree(base_addr);
-                       goto retry;
+                               "recover xattr in inode (%lu), error(%d)",
+                                       inode->i_ino, error);
+                       if (!error) {
+                               kfree(base_addr);
+                               goto retry;
+                       }
                }
                f2fs_err(F2FS_I_SB(inode), "set inode (%lu) has corrupted xattr",
                                                                inode->i_ino);