diff --git a/drivers/staging/lustre/lustre/include/lprocfs_status.h b/drivers/staging/lustre/lustre/include/lprocfs_status.h
index 2c6e5dc..c9b145f 100644
--- a/drivers/staging/lustre/lustre/include/lprocfs_status.h
+++ b/drivers/staging/lustre/lustre/include/lprocfs_status.h
@@ -596,9 +596,6 @@ extern void lprocfs_remove(proc_dir_entry_t **root);
 extern void lprocfs_remove_proc_entry(const char *name,
 				      struct proc_dir_entry *parent);
 
-extern proc_dir_entry_t *lprocfs_srch(proc_dir_entry_t *root,
-					  const char *name);
-
 extern int lprocfs_obd_setup(struct obd_device *obd, struct lprocfs_vars *list);
 extern int lprocfs_obd_cleanup(struct obd_device *obd);
 
@@ -924,9 +921,6 @@ static inline void lprocfs_remove(proc_dir_entry_t **root)
 static inline void lprocfs_remove_proc_entry(const char *name,
 					     struct proc_dir_entry *parent)
 { return; }
-static inline proc_dir_entry_t *lprocfs_srch(proc_dir_entry_t *head,
-						 const char *name)
-{ return 0; }
 static inline int lprocfs_obd_setup(struct obd_device *dev,
 				    struct lprocfs_vars *list)
 { return 0; }
diff --git a/drivers/staging/lustre/lustre/include/lustre_dlm.h b/drivers/staging/lustre/lustre/include/lustre_dlm.h
index f6eaed8..317f928 100644
--- a/drivers/staging/lustre/lustre/include/lustre_dlm.h
+++ b/drivers/staging/lustre/lustre/include/lustre_dlm.h
@@ -545,6 +545,9 @@ struct ldlm_namespace {
 	/** Client side original connect flags supported by server. */
 	__u64			ns_orig_connect_flags;
 
+	/* namespace proc dir entry */
+	struct proc_dir_entry	*ns_proc_dir_entry;
+
 	/**
 	 * Position in global namespace list linking all namespaces on
 	 * the node.
diff --git a/drivers/staging/lustre/lustre/include/obd.h b/drivers/staging/lustre/lustre/include/obd.h
index dade2fd..98fdb32 100644
--- a/drivers/staging/lustre/lustre/include/obd.h
+++ b/drivers/staging/lustre/lustre/include/obd.h
@@ -1060,6 +1060,7 @@ struct obd_device {
 	struct lprocfs_stats  *md_stats;
 
 	proc_dir_entry_t  *obd_proc_entry;
+	void		  *obd_proc_private; /* type private PDEs */
 	proc_dir_entry_t  *obd_proc_exports_entry;
 	proc_dir_entry_t  *obd_svc_procroot;
 	struct lprocfs_stats  *obd_svc_stats;
diff --git a/drivers/staging/lustre/lustre/ldlm/ldlm_pool.c b/drivers/staging/lustre/lustre/ldlm/ldlm_pool.c
index 8b575d2..99fd4d2 100644
--- a/drivers/staging/lustre/lustre/ldlm/ldlm_pool.c
+++ b/drivers/staging/lustre/lustre/ldlm/ldlm_pool.c
@@ -730,8 +730,7 @@ static int ldlm_pool_proc_init(struct ldlm_pool *pl)
 	if (!var_name)
 		RETURN(-ENOMEM);
 
-	parent_ns_proc = lprocfs_srch(ldlm_ns_proc_dir,
-				      ldlm_ns_name(ns));
+	parent_ns_proc = ns->ns_proc_dir_entry;
 	if (parent_ns_proc == NULL) {
 		CERROR("%s: proc entry is not initialized\n",
 		       ldlm_ns_name(ns));
diff --git a/drivers/staging/lustre/lustre/ldlm/ldlm_resource.c b/drivers/staging/lustre/lustre/ldlm/ldlm_resource.c
index 3bc7b25..8a89d64 100644
--- a/drivers/staging/lustre/lustre/ldlm/ldlm_resource.c
+++ b/drivers/staging/lustre/lustre/ldlm/ldlm_resource.c
@@ -301,15 +301,11 @@ LPROC_SEQ_FOPS(lprocfs_elc);
 
 void ldlm_namespace_proc_unregister(struct ldlm_namespace *ns)
 {
-	struct proc_dir_entry *dir;
-
-	dir = lprocfs_srch(ldlm_ns_proc_dir, ldlm_ns_name(ns));
-	if (dir == NULL) {
+	if (ns->ns_proc_dir_entry == NULL)
 		CERROR("dlm namespace %s has no procfs dir?\n",
 		       ldlm_ns_name(ns));
-	} else {
-		lprocfs_remove(&dir);
-	}
+	else
+		lprocfs_remove(&ns->ns_proc_dir_entry);
 
 	if (ns->ns_stats != NULL)
 		lprocfs_free_stats(&ns->ns_stats);
@@ -319,10 +315,20 @@ int ldlm_namespace_proc_register(struct ldlm_namespace *ns)
 {
 	struct lprocfs_vars lock_vars[2];
 	char lock_name[MAX_STRING_SIZE + 1];
+	proc_dir_entry_t *ns_pde;
 
 	LASSERT(ns != NULL);
 	LASSERT(ns->ns_rs_hash != NULL);
 
+	if (ns->ns_proc_dir_entry != NULL) {
+		ns_pde = ns->ns_proc_dir_entry;
+	} else {
+		ns_pde = proc_mkdir(ldlm_ns_name(ns), ldlm_ns_proc_dir);
+		if (ns_pde == NULL)
+			return -ENOMEM;
+		ns->ns_proc_dir_entry = ns_pde;
+	}
+
 	ns->ns_stats = lprocfs_alloc_stats(LDLM_NSS_LAST, 0);
 	if (ns->ns_stats == NULL)
 		return -ENOMEM;
@@ -335,78 +341,66 @@ int ldlm_namespace_proc_register(struct ldlm_namespace *ns)
 	memset(lock_vars, 0, sizeof(lock_vars));
 	lock_vars[0].name = lock_name;
 
-	snprintf(lock_name, MAX_STRING_SIZE, "%s/resource_count",
-		 ldlm_ns_name(ns));
+	snprintf(lock_name, MAX_STRING_SIZE, "resource_count");
 	lock_vars[0].data = ns;
 	lock_vars[0].fops = &lprocfs_ns_resources_fops;
-	lprocfs_add_vars(ldlm_ns_proc_dir, lock_vars, 0);
+	lprocfs_add_vars(ns_pde, lock_vars, 0);
 
-	snprintf(lock_name, MAX_STRING_SIZE, "%s/lock_count",
-		 ldlm_ns_name(ns));
+	snprintf(lock_name, MAX_STRING_SIZE, "lock_count");
 	lock_vars[0].data = ns;
 	lock_vars[0].fops = &lprocfs_ns_locks_fops;
-	lprocfs_add_vars(ldlm_ns_proc_dir, lock_vars, 0);
+	lprocfs_add_vars(ns_pde, lock_vars, 0);
 
 	if (ns_is_client(ns)) {
-		snprintf(lock_name, MAX_STRING_SIZE, "%s/lock_unused_count",
-			 ldlm_ns_name(ns));
+		snprintf(lock_name, MAX_STRING_SIZE, "lock_unused_count");
 		lock_vars[0].data = &ns->ns_nr_unused;
 		lock_vars[0].fops = &ldlm_uint_fops;
-		lprocfs_add_vars(ldlm_ns_proc_dir, lock_vars, 0);
+		lprocfs_add_vars(ns_pde, lock_vars, 0);
 
-		snprintf(lock_name, MAX_STRING_SIZE, "%s/lru_size",
-			 ldlm_ns_name(ns));
+		snprintf(lock_name, MAX_STRING_SIZE, "lru_size");
 		lock_vars[0].data = ns;
 		lock_vars[0].fops = &lprocfs_lru_size_fops;
-		lprocfs_add_vars(ldlm_ns_proc_dir, lock_vars, 0);
+		lprocfs_add_vars(ns_pde, lock_vars, 0);
 
-		snprintf(lock_name, MAX_STRING_SIZE, "%s/lru_max_age",
-			 ldlm_ns_name(ns));
+		snprintf(lock_name, MAX_STRING_SIZE, "lru_max_age");
 		lock_vars[0].data = &ns->ns_max_age;
 		lock_vars[0].fops = &ldlm_rw_uint_fops;
-		lprocfs_add_vars(ldlm_ns_proc_dir, lock_vars, 0);
+		lprocfs_add_vars(ns_pde, lock_vars, 0);
 
-		snprintf(lock_name, MAX_STRING_SIZE, "%s/early_lock_cancel",
-			 ldlm_ns_name(ns));
+		snprintf(lock_name, MAX_STRING_SIZE, "early_lock_cancel");
 		lock_vars[0].data = ns;
 		lock_vars[0].fops = &lprocfs_elc_fops;
-		lprocfs_add_vars(ldlm_ns_proc_dir, lock_vars, 0);
+		lprocfs_add_vars(ns_pde, lock_vars, 0);
 	} else {
-		snprintf(lock_name, MAX_STRING_SIZE, "%s/ctime_age_limit",
-			 ldlm_ns_name(ns));
+		snprintf(lock_name, MAX_STRING_SIZE, "ctime_age_limit");
 		lock_vars[0].data = &ns->ns_ctime_age_limit;
 		lock_vars[0].fops = &ldlm_rw_uint_fops;
-		lprocfs_add_vars(ldlm_ns_proc_dir, lock_vars, 0);
+		lprocfs_add_vars(ns_pde, lock_vars, 0);
 
-		snprintf(lock_name, MAX_STRING_SIZE, "%s/lock_timeouts",
-			 ldlm_ns_name(ns));
+		snprintf(lock_name, MAX_STRING_SIZE, "lock_timeouts");
 		lock_vars[0].data = &ns->ns_timeouts;
 		lock_vars[0].fops = &ldlm_uint_fops;
-		lprocfs_add_vars(ldlm_ns_proc_dir, lock_vars, 0);
+		lprocfs_add_vars(ns_pde, lock_vars, 0);
 
-		snprintf(lock_name, MAX_STRING_SIZE, "%s/max_nolock_bytes",
-			 ldlm_ns_name(ns));
+		snprintf(lock_name, MAX_STRING_SIZE, "max_nolock_bytes");
 		lock_vars[0].data = &ns->ns_max_nolock_size;
 		lock_vars[0].fops = &ldlm_rw_uint_fops;
-		lprocfs_add_vars(ldlm_ns_proc_dir, lock_vars, 0);
+		lprocfs_add_vars(ns_pde, lock_vars, 0);
 
-		snprintf(lock_name, MAX_STRING_SIZE, "%s/contention_seconds",
-			 ldlm_ns_name(ns));
+		snprintf(lock_name, MAX_STRING_SIZE, "contention_seconds");
 		lock_vars[0].data = &ns->ns_contention_time;
 		lock_vars[0].fops = &ldlm_rw_uint_fops;
-		lprocfs_add_vars(ldlm_ns_proc_dir, lock_vars, 0);
+		lprocfs_add_vars(ns_pde, lock_vars, 0);
 
-		snprintf(lock_name, MAX_STRING_SIZE, "%s/contended_locks",
-			 ldlm_ns_name(ns));
+		snprintf(lock_name, MAX_STRING_SIZE, "contended_locks");
 		lock_vars[0].data = &ns->ns_contended_locks;
 		lock_vars[0].fops = &ldlm_rw_uint_fops;
-		lprocfs_add_vars(ldlm_ns_proc_dir, lock_vars, 0);
+		lprocfs_add_vars(ns_pde, lock_vars, 0);
 
-		snprintf(lock_name, MAX_STRING_SIZE, "%s/max_parallel_ast",
-			 ldlm_ns_name(ns));
+		snprintf(lock_name, MAX_STRING_SIZE, "max_parallel_ast");
 		lock_vars[0].data = &ns->ns_max_parallel_ast;
 		lock_vars[0].fops = &ldlm_rw_uint_fops;
-		lprocfs_add_vars(ldlm_ns_proc_dir, lock_vars, 0);
+		lprocfs_add_vars(ns_pde, lock_vars, 0);
 	}
 	return 0;
 }
diff --git a/drivers/staging/lustre/lustre/llite/lproc_llite.c b/drivers/staging/lustre/lustre/llite/lproc_llite.c
index f4b8774..aca863e 100644
--- a/drivers/staging/lustre/lustre/llite/lproc_llite.c
+++ b/drivers/staging/lustre/lustre/llite/lproc_llite.c
@@ -870,6 +870,7 @@ int lprocfs_register_mountpoint(struct proc_dir_entry *parent,
 	struct lustre_sb_info *lsi = s2lsi(sb);
 	struct ll_sb_info *sbi = ll_s2sbi(sb);
 	struct obd_device *obd;
+	proc_dir_entry_t *dir;
 	char name[MAX_STRING_SIZE + 1], *ptr;
 	int err, id, len, rc;
 	ENTRY;
@@ -969,16 +970,19 @@ int lprocfs_register_mountpoint(struct proc_dir_entry *parent,
 	LASSERT(obd->obd_magic == OBD_DEVICE_MAGIC);
 	LASSERT(obd->obd_type->typ_name != NULL);
 
-	snprintf(name, MAX_STRING_SIZE, "%s/common_name",
-		 obd->obd_type->typ_name);
+	dir = proc_mkdir(obd->obd_type->typ_name, sbi->ll_proc_root);
+	if (dir == NULL)
+		GOTO(out, err = -ENOMEM);
+
+	snprintf(name, MAX_STRING_SIZE, "common_name");
 	lvars[0].fops = &llite_name_fops;
-	err = lprocfs_add_vars(sbi->ll_proc_root, lvars, obd);
+	err = lprocfs_add_vars(dir, lvars, obd);
 	if (err)
 		GOTO(out, err);
 
-	snprintf(name, MAX_STRING_SIZE, "%s/uuid", obd->obd_type->typ_name);
+	snprintf(name, MAX_STRING_SIZE, "uuid");
 	lvars[0].fops = &llite_uuid_fops;
-	err = lprocfs_add_vars(sbi->ll_proc_root, lvars, obd);
+	err = lprocfs_add_vars(dir, lvars, obd);
 	if (err)
 		GOTO(out, err);
 
@@ -989,16 +993,19 @@ int lprocfs_register_mountpoint(struct proc_dir_entry *parent,
 	LASSERT(obd->obd_magic == OBD_DEVICE_MAGIC);
 	LASSERT(obd->obd_type->typ_name != NULL);
 
-	snprintf(name, MAX_STRING_SIZE, "%s/common_name",
-		 obd->obd_type->typ_name);
+	dir = proc_mkdir(obd->obd_type->typ_name, sbi->ll_proc_root);
+	if (dir == NULL)
+		GOTO(out, err = -ENOMEM);
+
+	snprintf(name, MAX_STRING_SIZE, "common_name");
 	lvars[0].fops = &llite_name_fops;
-	err = lprocfs_add_vars(sbi->ll_proc_root, lvars, obd);
+	err = lprocfs_add_vars(dir, lvars, obd);
 	if (err)
 		GOTO(out, err);
 
-	snprintf(name, MAX_STRING_SIZE, "%s/uuid", obd->obd_type->typ_name);
+	snprintf(name, MAX_STRING_SIZE, "uuid");
 	lvars[0].fops = &llite_uuid_fops;
-	err = lprocfs_add_vars(sbi->ll_proc_root, lvars, obd);
+	err = lprocfs_add_vars(dir, lvars, obd);
 out:
 	if (err) {
 		lprocfs_remove(&sbi->ll_proc_root);
diff --git a/drivers/staging/lustre/lustre/lmv/lmv_obd.c b/drivers/staging/lustre/lustre/lmv/lmv_obd.c
index 41d0bb4..fbe9eed 100644
--- a/drivers/staging/lustre/lustre/lmv/lmv_obd.c
+++ b/drivers/staging/lustre/lustre/lmv/lmv_obd.c
@@ -230,12 +230,19 @@ static int lmv_connect(const struct lu_env *env,
 	if (data)
 		lmv->conn_data = *data;
 
-	lmv_proc_dir = lprocfs_register("target_obds", obd->obd_proc_entry,
-					NULL, NULL);
-	if (IS_ERR(lmv_proc_dir)) {
-		CERROR("could not register /proc/fs/lustre/%s/%s/target_obds.",
-		       obd->obd_type->typ_name, obd->obd_name);
-		lmv_proc_dir = NULL;
+	LASSERT(obd->obd_proc_private = NULL);
+
+	if (obd->obd_proc_private != NULL) {
+		lmv_proc_dir = obd->obd_proc_private;
+	} else {
+		lmv_proc_dir = lprocfs_register("target_obds", obd->obd_proc_entry,
+						NULL, NULL);
+		if (IS_ERR(lmv_proc_dir)) {
+			CERROR("could not register /proc/fs/lustre/%s/%s/target_obds.",
+			       obd->obd_type->typ_name, obd->obd_name);
+			lmv_proc_dir = NULL;
+		}
+		obd->obd_proc_private = lmv_proc_dir;
 	}
 
 	/*
@@ -247,9 +254,9 @@ static int lmv_connect(const struct lu_env *env,
 	if (data->ocd_connect_flags & OBD_CONNECT_REAL)
 		rc = lmv_check_connect(obd);
 
-	if (rc) {
-		if (lmv_proc_dir)
+	if (rc && lmv_proc_dir) {
 			lprocfs_remove(&lmv_proc_dir);
+			obd->obd_proc_private = NULL;
 	}
 
 	RETURN(rc);
@@ -408,7 +415,7 @@ int lmv_connect_mdc(struct obd_device *obd, struct lmv_tgt_desc *tgt)
 		mdc_obd->obd_name, mdc_obd->obd_uuid.uuid,
 		atomic_read(&obd->obd_refcount));
 
-	lmv_proc_dir = lprocfs_srch(obd->obd_proc_entry, "target_obds");
+	lmv_proc_dir = obd->obd_proc_private;
 	if (lmv_proc_dir) {
 		struct proc_dir_entry *mdc_symlink;
 
@@ -425,7 +432,7 @@ int lmv_connect_mdc(struct obd_device *obd, struct lmv_tgt_desc *tgt)
 			       obd->obd_type->typ_name, obd->obd_name,
 			       mdc_obd->obd_name);
 			lprocfs_remove(&lmv_proc_dir);
-			lmv_proc_dir = NULL;
+			obd->obd_proc_private = NULL;
 		}
 	}
 	RETURN(0);
@@ -626,19 +633,10 @@ static int lmv_disconnect_mdc(struct obd_device *obd, struct lmv_tgt_desc *tgt)
 		mdc_obd->obd_no_recov = obd->obd_no_recov;
 	}
 
-	lmv_proc_dir = lprocfs_srch(obd->obd_proc_entry, "target_obds");
-	if (lmv_proc_dir) {
-		struct proc_dir_entry *mdc_symlink;
+	lmv_proc_dir = obd->obd_proc_private;
+	if (lmv_proc_dir)
+		lprocfs_remove_proc_entry(mdc_obd->obd_name, lmv_proc_dir);
 
-		mdc_symlink = lprocfs_srch(lmv_proc_dir, mdc_obd->obd_name);
-		if (mdc_symlink) {
-			lprocfs_remove(&mdc_symlink);
-		} else {
-			CERROR("/proc/fs/lustre/%s/%s/target_obds/%s missing\n",
-			       obd->obd_type->typ_name, obd->obd_name,
-			       mdc_obd->obd_name);
-		}
-	}
 	rc = obd_fid_fini(tgt->ltd_exp->exp_obd);
 	if (rc)
 		CERROR("Can't finanize fids factory\n");
@@ -664,7 +662,6 @@ static int lmv_disconnect_mdc(struct obd_device *obd, struct lmv_tgt_desc *tgt)
 static int lmv_disconnect(struct obd_export *exp)
 {
 	struct obd_device     *obd = class_exp2obd(exp);
-	struct proc_dir_entry *lmv_proc_dir;
 	struct lmv_obd	*lmv = &obd->u.lmv;
 	int		    rc;
 	int		    i;
@@ -687,13 +684,11 @@ static int lmv_disconnect(struct obd_export *exp)
 		lmv_disconnect_mdc(obd, lmv->tgts[i]);
 	}
 
-	lmv_proc_dir = lprocfs_srch(obd->obd_proc_entry, "target_obds");
-	if (lmv_proc_dir) {
-		lprocfs_remove(&lmv_proc_dir);
-	} else {
+	if (obd->obd_proc_private)
+		lprocfs_remove((proc_dir_entry_t **)&obd->obd_proc_private);
+	else
 		CERROR("/proc/fs/lustre/%s/%s/target_obds missing\n",
 		       obd->obd_type->typ_name, obd->obd_name);
-	}
 
 out_local:
 	/*
diff --git a/drivers/staging/lustre/lustre/lov/lov_obd.c b/drivers/staging/lustre/lustre/lov/lov_obd.c
index 8089f03..5c7ab42 100644
--- a/drivers/staging/lustre/lustre/lov/lov_obd.c
+++ b/drivers/staging/lustre/lustre/lov/lov_obd.c
@@ -191,7 +191,7 @@ int lov_connect_obd(struct obd_device *obd, __u32 index, int activate,
 	CDEBUG(D_CONFIG, "Connected tgt idx %d %s (%s) %sactive\n", index,
 	       obd_uuid2str(tgt_uuid), tgt_obd->obd_name, activate ? "":"in");
 
-	lov_proc_dir = lprocfs_srch(obd->obd_proc_entry, "target_obds");
+	lov_proc_dir = obd->obd_proc_private;
 	if (lov_proc_dir) {
 		struct obd_device *osc_obd = lov->lov_tgts[index]->ltd_exp->exp_obd;
 		proc_dir_entry_t *osc_symlink;
@@ -211,6 +211,7 @@ int lov_connect_obd(struct obd_device *obd, __u32 index, int activate,
 				obd->obd_type->typ_name, obd->obd_name,
 				osc_obd->obd_name);
 			lprocfs_remove(&lov_proc_dir);
+			obd->obd_proc_private = NULL;
 		}
 	}
 
@@ -290,19 +291,9 @@ static int lov_disconnect_obd(struct obd_device *obd, struct lov_tgt_desc *tgt)
 		tgt->ltd_exp->exp_obd->obd_inactive = 1;
 	}
 
-	lov_proc_dir = lprocfs_srch(obd->obd_proc_entry, "target_obds");
-	if (lov_proc_dir) {
-		proc_dir_entry_t *osc_symlink;
-
-		osc_symlink = lprocfs_srch(lov_proc_dir, osc_obd->obd_name);
-		if (osc_symlink) {
-			lprocfs_remove(&osc_symlink);
-		} else {
-			CERROR("/proc/fs/lustre/%s/%s/target_obds/%s missing.",
-			       obd->obd_type->typ_name, obd->obd_name,
-			       osc_obd->obd_name);
-		}
-	}
+	lov_proc_dir = obd->obd_proc_private;
+	if (lov_proc_dir)
+		lprocfs_remove_proc_entry(osc_obd->obd_name, lov_proc_dir);
 
 	if (osc_obd) {
 		/* Pass it on to our clients.
diff --git a/drivers/staging/lustre/lustre/obdclass/lprocfs_status.c b/drivers/staging/lustre/lustre/obdclass/lprocfs_status.c
index 3893ded..5e43f4a 100644
--- a/drivers/staging/lustre/lustre/obdclass/lprocfs_status.c
+++ b/drivers/staging/lustre/lustre/obdclass/lprocfs_status.c
@@ -66,16 +66,6 @@ int lprocfs_seq_release(struct inode *inode, struct file *file)
 }
 EXPORT_SYMBOL(lprocfs_seq_release);
 
-struct proc_dir_entry *lprocfs_srch(struct proc_dir_entry *head,
-				    const char *name)
-{
-	if (head == NULL)
-		return NULL;
-
-	return proc_lookup_child_pde(head, name, strlen(name));
-}
-EXPORT_SYMBOL(lprocfs_srch);
-
 /* lprocfs API calls */
 
 proc_dir_entry_t *lprocfs_add_simple(struct proc_dir_entry *root,
@@ -125,15 +115,7 @@ struct proc_dir_entry *lprocfs_add_symlink(const char *name,
 }
 EXPORT_SYMBOL(lprocfs_add_symlink);
 
-static int lprocfs_generic_open(struct inode *inode, struct file *file)
-{
-	return -EIO;
-}
-
-static struct file_operations lprocfs_generic_fops = {
-	.owner = THIS_MODULE,
-	.open = lprocfs_generic_open,
-};
+static struct file_operations lprocfs_generic_fops = { };
 
 /**
  * Add /proc entries.
@@ -149,76 +131,36 @@ static struct file_operations lprocfs_generic_fops = {
 int lprocfs_add_vars(struct proc_dir_entry *root, struct lprocfs_vars *list,
 		     void *data)
 {
-	int rc = 0;
-
 	if (root == NULL || list == NULL)
 		return -EINVAL;
 
 	while (list->name != NULL) {
-		struct proc_dir_entry *cur_root, *proc;
-		char *pathcopy, *cur, *next, pathbuf[64];
-		int pathsize = strlen(list->name) + 1;
-
-		proc = NULL;
-		cur_root = root;
-
-		/* need copy of path for strsep */
-		if (strlen(list->name) > sizeof(pathbuf) - 1) {
-			OBD_ALLOC(pathcopy, pathsize);
-			if (pathcopy == NULL)
-				GOTO(out, rc = -ENOMEM);
-		} else {
-			pathcopy = pathbuf;
+		struct proc_dir_entry *proc;
+		mode_t mode = 0;
+
+		if (list->proc_mode != 0000) {
+			mode = list->proc_mode;
+		} else if (list->fops) {
+			if (list->fops->read)
+				mode = 0444;
+			if (list->fops->write)
+				mode |= 0200;
 		}
-
-		next = pathcopy;
-		strcpy(pathcopy, list->name);
-
-		while (cur_root != NULL && (cur = strsep(&next, "/"))) {
-			if (*cur =='\0') /* skip double/trailing "/" */
-				continue;
-
-			proc = proc_lookup_child_pde(cur_root, cur, strlen(cur));
-			CDEBUG(D_OTHER, "cur=%s, next=%s, (%s)\n",
-			       cur, next, (proc ? "exists" : "new"));
-			if (next != NULL) {
-				cur_root = (proc ? proc :
-					    proc_mkdir(cur, cur_root));
-			} else if (proc == NULL) {
-				mode_t mode = 0;
-				if (list->proc_mode != 0000) {
-					mode = list->proc_mode;
-				} else if (list->fops) {
-					if (list->fops->read)
-						mode = 0444;
-					if (list->fops->write)
-						mode |= 0200;
-				}
-				proc = proc_create_data(cur, mode, cur_root,
+		proc = proc_create_data(list->name, mode, root,
 					list->fops ?: &lprocfs_generic_fops,
 					list->data ?: data);
-			}
-		}
-
-		if (pathcopy != pathbuf)
-			OBD_FREE(pathcopy, pathsize);
-
-		if (cur_root == NULL || proc == NULL) {
-			CERROR("LprocFS: No memory to create /proc entry %s",
-			       list->name);
-			GOTO(out, rc = -ENOMEM);
-		}
-
+		if (proc == NULL)
+			return -ENOMEM;
 		list++;
 	}
-out:
-	return rc;
+	return 0;
 }
 EXPORT_SYMBOL(lprocfs_add_vars);
 
 void lprocfs_remove(struct proc_dir_entry **rooth)
 {
 	proc_remove(*rooth);
+	*rooth = NULL;
 }
 EXPORT_SYMBOL(lprocfs_remove);
 
@@ -235,13 +177,6 @@ struct proc_dir_entry *lprocfs_register(const char *name,
 {
 	struct proc_dir_entry *newchild;
 
-	newchild = lprocfs_srch(parent, name);
-	if (newchild != NULL) {
-		CERROR(" Lproc: Attempting to register %s more than once \n",
-		       name);
-		return ERR_PTR(-EALREADY);
-	}
-
 	newchild = proc_mkdir(name, parent);
 	if (newchild != NULL && list != NULL) {
 		int rc = lprocfs_add_vars(newchild, list, data);