mapping_set_error(inode->i_mapping, err);
 }
 
-void fuse_update_ctime(struct inode *inode)
+static void fuse_update_ctime_in_cache(struct inode *inode)
 {
-       fuse_invalidate_attr(inode);
        if (!IS_NOCMTIME(inode)) {
                inode->i_ctime = current_time(inode);
                mark_inode_dirty_sync(inode);
        }
 }
 
+void fuse_update_ctime(struct inode *inode)
+{
+       fuse_invalidate_attr(inode);
+       fuse_update_ctime_in_cache(inode);
+}
+
 static void fuse_entry_unlinked(struct dentry *entry)
 {
        struct inode *inode = d_inode(entry);
        args.in_args[1].size = newent->d_name.len + 1;
        args.in_args[1].value = newent->d_name.name;
        err = create_new_entry(fm, &args, newdir, newent, inode->i_mode);
-       /* Contrary to "normal" filesystems it can happen that link
-          makes two "logical" inodes point to the same "physical"
-          inode.  We invalidate the attributes of the old one, so it
-          will reflect changes in the backing inode (link count,
-          etc.)
-       */
-       if (!err) {
-               struct fuse_inode *fi = get_fuse_inode(inode);
-
-               spin_lock(&fi->lock);
-               fi->attr_version = atomic64_inc_return(&fm->fc->attr_version);
-               if (likely(inode->i_nlink < UINT_MAX))
-                       inc_nlink(inode);
-               spin_unlock(&fi->lock);
-               fuse_update_ctime(inode);
-       } else if (err == -EINTR) {
+       if (!err)
+               fuse_update_ctime_in_cache(inode);
+       else if (err == -EINTR)
                fuse_invalidate_attr(inode);
-       }
+
        return err;
 }