return &orangefs_inode->vfs_inode;
  }
  
 -static void orangefs_i_callback(struct rcu_head *head)
 +static void orangefs_free_inode(struct inode *inode)
  {
-       kmem_cache_free(orangefs_inode_cache, ORANGEFS_I(inode));
 -      struct inode *inode = container_of(head, struct inode, i_rcu);
+       struct orangefs_inode_s *orangefs_inode = ORANGEFS_I(inode);
+       struct orangefs_cached_xattr *cx;
+       struct hlist_node *tmp;
+       int i;
+ 
+       hash_for_each_safe(orangefs_inode->xattr_cache, i, tmp, cx, node) {
+               hlist_del(&cx->node);
+               kfree(cx);
+       }
+ 
+       kmem_cache_free(orangefs_inode_cache, orangefs_inode);
  }
  
  static void orangefs_destroy_inode(struct inode *inode)
        gossip_debug(GOSSIP_SUPER_DEBUG,
                        "%s: deallocated %p destroying inode %pU\n",
                        __func__, orangefs_inode, get_khandle_from_ino(inode));
 -
 -      call_rcu(&inode->i_rcu, orangefs_i_callback);
  }
  
+ static int orangefs_write_inode(struct inode *inode,
+                               struct writeback_control *wbc)
+ {
+       gossip_debug(GOSSIP_SUPER_DEBUG, "orangefs_write_inode\n");
+       return orangefs_inode_setattr(inode);
+ }
+ 
  /*
   * NOTE: information filled in here is typically reflected in the
   * output of the system command 'df'
  
  static const struct super_operations orangefs_s_ops = {
        .alloc_inode = orangefs_alloc_inode,
 +      .free_inode = orangefs_free_inode,
        .destroy_inode = orangefs_destroy_inode,
+       .write_inode = orangefs_write_inode,
        .drop_inode = generic_delete_inode,
        .statfs = orangefs_statfs,
        .remount_fs = orangefs_remount_fs,