Index: /branches/rel_apv_10_4_0_112_india/usr/click/lib/libparser/commands.pm
===================================================================
--- /branches/rel_apv_10_4_0_112_india/usr/click/lib/libparser/commands.pm	(revision 38312)
+++ /branches/rel_apv_10_4_0_112_india/usr/click/lib/libparser/commands.pm	(working copy)
@@ -18940,7 +18940,7 @@
 		name => "eroute",
 		help_string => "Configure extended routing table",
 		menu => "root_ip",
-		cmd_attribute => "CMD_ARRAYOS|CMD_SPROXY|CMD_NORMAL|CMD_GLOBAL|CMD_KERN_API",
+		cmd_attribute => "CMD_ARRAYOS|CMD_SPROXY|CMD_NORMAL|CMD_GLOBAL|CMD_KERN_API|CMD_KAPI_LOCK",
 		user_level => "CLI_LEVEL_CONFIG",
 		function_name => "eroute_add_cli_multitype",
 		function_args => [ {
@@ -19007,7 +19007,7 @@
 		obj_type => "ITEM",
 		name => "eroute",
 		help_string => "Remove extended routing policy",
-		cmd_attribute => "CMD_ARRAYOS|CMD_SPROXY|CMD_NORMAL|CMD_GLOBAL|CMD_KERN_API",
+		cmd_attribute => "CMD_ARRAYOS|CMD_SPROXY|CMD_NORMAL|CMD_GLOBAL|CMD_KERN_API|CMD_KAPI_LOCK",
 		user_level => "CLI_LEVEL_CONFIG",
 		menu => "root_no_ip",
 		function_name => "eroute_delete_cli",
@@ -19021,7 +19021,7 @@
 		obj_type => "ITEM",
 		name => "eroute",
 		help_string => "Remove all extended routing policies",
-		cmd_attribute => "CMD_ARRAYOS|CMD_SPROXY|CMD_NORMAL|CMD_GLOBAL|CMD_KERN_API",
+		cmd_attribute => "CMD_ARRAYOS|CMD_SPROXY|CMD_NORMAL|CMD_GLOBAL|CMD_KERN_API|CMD_KAPI_LOCK",
 		user_level => "CLI_LEVEL_CONFIG",
 		menu => "root_clear_ip",
 		function_name => "eroute_clear",
Index: /branches/rel_apv_10_4_0_112_india/usr/src/sys/click/netinet/click_eroute.h
===================================================================
--- /branches/rel_apv_10_4_0_112_india/usr/src/sys/click/netinet/click_eroute.h	(revision 38312)
+++ /branches/rel_apv_10_4_0_112_india/usr/src/sys/click/netinet/click_eroute.h	(working copy)
@@ -648,7 +648,8 @@
 		)
 
 #define EROUTE_RTS_NOT_BSD 0
-#define EROUTE_RTS_BSD 1 
+#define EROUTE_RTS_BSD 1
+#define EROUTE_RTS_UPDATE 2
 
 extern int llb_bw_priority;
 
Index: /branches/rel_apv_10_4_0_112_india/usr/src/sys/click/netinet/click_eroute.c
===================================================================
--- /branches/rel_apv_10_4_0_112_india/usr/src/sys/click/netinet/click_eroute.c	(revision 38312)
+++ /branches/rel_apv_10_4_0_112_india/usr/src/sys/click/netinet/click_eroute.c	(working copy)
@@ -1559,6 +1559,9 @@
 
 	while ((item = TAILQ_FIRST(&update_eroute_head)) != NULL){
 		TAILQ_REMOVE(&update_eroute_head, item, update_eroute_tuple_entry);
+                
+                MALLOC(item, update_eroute_tuple *, sizeof(update_eroute_tuple),
+                        M_DOMAIN_EROUTE, M_NOWAIT|M_SHARED|M_ZERO);
 		if (item->op == UPDATE_EROUTE_ADD){
 			ret = eroute_add(NULL, item->pol_name, item->priority, 
 					item->sip_str, item->smask, item->sport_begin, item->sport_end,
@@ -10579,8 +10582,13 @@
 	 * Note the insertion is done with temporary entry.  We *need* to
 	 * set hp->rec to a permanent entry if hp->new is true.
 	 */
-	hp = hashInSearch(table, ori_key, &tmp_rirtentry, HASH_INSERT);
+	hp = hashInSearch(table, ori_key, &tmp_rirtentry, (flag & EROUTE_RTS_UPDATE)? HASH_NOINSERT: HASH_INSERT);
 	if (NULL == hp) {
+                if (flag & EROUTE_RTS_UPDATE) {
+                        RIRT_TABLE_UNLOCK(RIRT_LI(ori_key));
+                        return;
+                }
+
 		/* out of memory, throw away oldest */
 		rirt = TIMER_FIRST(rts_lru[isipv6][RIRT_LI(ori_key)]);
 		if (rirt) {
