return 0;
 }
 
-static void
-acpi_sbs_remove_fs(struct proc_dir_entry **dir,
-                          struct proc_dir_entry *parent_dir)
-{
-       if (*dir) {
-               remove_proc_entry(ACPI_SBS_FILE_INFO, *dir);
-               remove_proc_entry(ACPI_SBS_FILE_STATE, *dir);
-               remove_proc_entry(ACPI_SBS_FILE_ALARM, *dir);
-               remove_proc_entry((*dir)->name, parent_dir);
-               *dir = NULL;
-       }
-}
-
 /* Smart Battery Interface */
 static struct proc_dir_entry *acpi_battery_dir = NULL;
 
                power_supply_unregister(&battery->bat);
        }
 #ifdef CONFIG_ACPI_PROCFS_POWER
-       if (battery->proc_entry)
-               acpi_sbs_remove_fs(&battery->proc_entry, acpi_battery_dir);
+       proc_remove(battery->proc_entry);
+       battery->proc_entry = NULL;
 #endif
 }
 
        if (sbs->charger.dev)
                power_supply_unregister(&sbs->charger);
 #ifdef CONFIG_ACPI_PROCFS_POWER
-       if (sbs->charger_entry)
-               acpi_sbs_remove_fs(&sbs->charger_entry, acpi_ac_dir);
+       proc_remove(sbs->charger_entry);
+       sbs->charger_entry = NULL;
 #endif
 }
 
 
        del_timer_sync(&ipmi_timer);
 
 #ifdef CONFIG_PROC_FS
-       remove_proc_entry(proc_ipmi_root->name, NULL);
+       proc_remove(proc_ipmi_root);
 #endif /* CONFIG_PROC_FS */
 
        driver_unregister(&ipmidriver.driver);
 
                for (p = proc_files; p->name; p++)
                        if (p->entry)
                                remove_proc_entry(p->name, proc_gru);
-               remove_proc_entry("gru", proc_gru->parent);
+               proc_remove(proc_gru);
        }
 }
 
 
 #ifdef CONFIG_PROC_DEVICETREE
 static void of_remove_proc_dt_entry(struct device_node *dn)
 {
-       struct device_node *parent = dn->parent;
-       struct property *prop = dn->properties;
-
-       while (prop) {
-               remove_proc_entry(prop->name, dn->pde);
-               prop = prop->next;
-       }
-
-       if (dn->pde)
-               remove_proc_entry(dn->pde->name, parent->pde);
+       proc_remove(dn->pde);
 }
 #else
 static void of_remove_proc_dt_entry(struct device_node *dn)
 
 
 int pci_proc_detach_device(struct pci_dev *dev)
 {
-       struct proc_dir_entry *e;
-
-       if ((e = dev->procent)) {
-               remove_proc_entry(e->name, dev->bus->procdir);
-               dev->procent = NULL;
-       }
+       proc_remove(dev->procent);
+       dev->procent = NULL;
        return 0;
 }
 
 int pci_proc_detach_bus(struct pci_bus* bus)
 {
-       struct proc_dir_entry *de = bus->procdir;
-       if (de)
-               remove_proc_entry(de->name, proc_bus_pci_dir);
+       proc_remove(bus->procdir);
        return 0;
 }
 
 
        return de->parent->data;
 }
 EXPORT_SYMBOL_GPL(proc_get_parent_data);
+
+void proc_remove(struct proc_dir_entry *de)
+{
+       if (de)
+               remove_proc_subtree(de->name, de->parent);
+}
+EXPORT_SYMBOL(proc_remove);
 
        struct list_head *pos, *next;
 
        if (proc_vmcore) {
-               remove_proc_entry(proc_vmcore->name, proc_vmcore->parent);
+               proc_remove(proc_vmcore);
                proc_vmcore = NULL;
        }
 
 
                                struct proc_dir_entry *parent,
                                const struct file_operations *proc_fops,
                                void *data);
+extern void proc_remove(struct proc_dir_entry *);
 extern void remove_proc_entry(const char *name, struct proc_dir_entry *parent);
 extern int remove_proc_subtree(const char *name, struct proc_dir_entry *parent);
 
 {
        return NULL;
 }
+static inline void proc_remove(struct proc_dir_entry *de) {}
 #define remove_proc_entry(name, parent) do {} while (0)
 #define remove_proc_subtree(name, parent) do {} while (0)
 
 
 
 void unregister_handler_proc(unsigned int irq, struct irqaction *action)
 {
-       if (action->dir) {
-               struct irq_desc *desc = irq_to_desc(irq);
-
-               remove_proc_entry(action->dir->name, desc->dir);
-       }
+       proc_remove(action->dir);
 }
 
 static void register_default_affinity_proc(void)
 
  */
 int vlan_proc_rem_dev(struct net_device *vlandev)
 {
-       struct vlan_net *vn = net_generic(dev_net(vlandev), vlan_net_id);
-
        /** NOTE:  This will consume the memory pointed to by dent, it seems. */
-       if (vlan_dev_priv(vlandev)->dent) {
-               remove_proc_entry(vlan_dev_priv(vlandev)->dent->name,
-                                 vn->proc_vlan_dir);
-               vlan_dev_priv(vlandev)->dent = NULL;
-       }
+       proc_remove(vlan_dev_priv(vlandev)->dent);
+       vlan_dev_priv(vlandev)->dent = NULL;
        return 0;
 }
 
 
                        if (pkt_dev->odev != dev)
                                continue;
 
-                       remove_proc_entry(pkt_dev->entry->name, pn->proc_dir);
+                       proc_remove(pkt_dev->entry);
 
                        pkt_dev->entry = proc_create_data(dev->name, 0600,
                                                          pn->proc_dir,
 static int pktgen_remove_device(struct pktgen_thread *t,
                                struct pktgen_dev *pkt_dev)
 {
-       struct pktgen_net *pn = t->net;
-
        pr_debug("remove_device pkt_dev=%p\n", pkt_dev);
 
        if (pkt_dev->running) {
        _rem_dev_from_if_list(t, pkt_dev);
 
        if (pkt_dev->entry)
-               remove_proc_entry(pkt_dev->entry->name, pn->proc_dir);
+               proc_remove(pkt_dev->entry);
 
 #ifdef CONFIG_XFRM
        free_SAs(pkt_dev);
 
                 * functions are also incrementing the refcount on their own,
                 * so it's safe to remove the entry even if it's in use. */
 #ifdef CONFIG_PROC_FS
-               remove_proc_entry(c->pde->name, c->pde->parent);
+               proc_remove(c->pde);
 #endif
                return;
        }
 {
        pr_info("ClusterIP Version %s unloading\n", CLUSTERIP_VERSION);
 #ifdef CONFIG_PROC_FS
-       remove_proc_entry(clusterip_procdir->name, clusterip_procdir->parent);
+       proc_remove(clusterip_procdir);
 #endif
        nf_unregister_hook(&cip_arp_ops);
        xt_unregister_target(&clusterip_tg_reg);
 
                return -ENOENT;
        if (!idev->stats.proc_dir_entry)
                return -EINVAL;
-       remove_proc_entry(idev->stats.proc_dir_entry->name,
-                         net->mib.proc_net_devsnmp6);
+       proc_remove(idev->stats.proc_dir_entry);
        idev->stats.proc_dir_entry = NULL;
        return 0;
 }
 
 struct snd_info_entry *snd_oss_root;
 #endif
 
-static void snd_remove_proc_entry(struct proc_dir_entry *parent,
-                                 struct proc_dir_entry *de)
-{
-       if (de)
-               remove_proc_entry(de->name, parent);
-}
-
 static loff_t snd_info_entry_llseek(struct file *file, loff_t offset, int orig)
 {
        struct snd_info_private_data *data;
 #ifdef CONFIG_SND_OSSEMUL
                snd_info_free_entry(snd_oss_root);
 #endif
-               snd_remove_proc_entry(NULL, snd_proc_root);
+               proc_remove(snd_proc_root);
        }
        return 0;
 }
 {
        mutex_lock(&info_mutex);
        if (card->proc_root_link) {
-               snd_remove_proc_entry(snd_proc_root, card->proc_root_link);
+               proc_remove(card->proc_root_link);
                card->proc_root_link = NULL;
        }
        if (strcmp(card->id, card->proc_root->name))
        if (!card)
                return;
        mutex_lock(&info_mutex);
-       if (card->proc_root_link) {
-               snd_remove_proc_entry(snd_proc_root, card->proc_root_link);
-               card->proc_root_link = NULL;
-       }
+       proc_remove(card->proc_root_link);
+       card->proc_root_link = NULL;
        if (card->proc_root)
                snd_info_disconnect(card->proc_root);
        mutex_unlock(&info_mutex);
        list_del_init(&entry->list);
        root = entry->parent == NULL ? snd_proc_root : entry->parent->p;
        snd_BUG_ON(!root);
-       snd_remove_proc_entry(root, entry->p);
+       proc_remove(entry->p);
        entry->p = NULL;
 }