Index: /branches/rel_apv_10_7/usr/src/sys/click/netinet/click_input.c
===================================================================
--- /branches/rel_apv_10_7/usr/src/sys/click/netinet/click_input.c	(revision 40251)
+++ /branches/rel_apv_10_7/usr/src/sys/click/netinet/click_input.c	(working copy)
@@ -1794,47 +1794,61 @@
 	click_callout_reset(&app_visual_callout, hz, app_visual_l4_log_timer, NULL);
 }
 
-
-
 static void
-l7popen_delete(struct clickpcb * bound_pcb)
+l7popen_delete_without_lock(struct clickpcb * bound_pcb)
 {
 	/* do not need to cleanup bound_pcb */
-	uhi_rte_rwlock_write_lock(&l7popen_rwlock);
 	if (click_hash_delete(l7popen_hash_table, bound_pcb)) {
 		TIMER_STOP(bound_pcb, &l7popen_timh, app_timer);
 		l7popen_num--;
 		CLICKPCB_FREE(bound_pcb);
 	}
-	uhi_rte_rwlock_write_unlock(&l7popen_rwlock);
 }
 static void
-l7popen_delete6(struct clickpcb * bound_pcb)
+l7popen_delete6_without_lock(struct clickpcb * bound_pcb)
 {
-	uhi_rte_rwlock_write_lock(&l7popen_rwlock6);
 	if (click_hash_delete(l7popen_hash_table6, bound_pcb)) {
 		TIMER_STOP(bound_pcb, &l7popen_timh6, app_timer);
 		l7popen_num6--;
 		CLICKPCB_FREE(bound_pcb);
 	}
+}
+
+static void
+l7popen_delete(struct clickpcb * bound_pcb)
+{
+	uhi_rte_rwlock_write_lock(&l7popen_rwlock);
+	l7popen_delete_without_lock(bound_pcb);
+	uhi_rte_rwlock_write_unlock(&l7popen_rwlock);
+}
+static void
+l7popen_delete6(struct clickpcb * bound_pcb)
+{
+	uhi_rte_rwlock_write_lock(&l7popen_rwlock6);
+	l7popen_delete6_without_lock(bound_pcb);
 	uhi_rte_rwlock_write_unlock(&l7popen_rwlock6);
 }
+
 static void
 l7popen_slowtimo(void)
 {
 	struct clickpcb * bound_pcb;
+	uhi_rte_rwlock_write_lock(&l7popen_rwlock);
 	while (TIMER_EXPIRED(bound_pcb, &l7popen_timh, app_timer)) {
-		l7popen_delete(bound_pcb);
+		l7popen_delete_without_lock(bound_pcb);
 	}
+	uhi_rte_rwlock_write_unlock(&l7popen_rwlock);
 }
 
 static void
 l7popen_slowtimo6(void)
 {
 	struct clickpcb * bound_pcb;
+	uhi_rte_rwlock_write_lock(&l7popen_rwlock6);
 	while (TIMER_EXPIRED(bound_pcb, &l7popen_timh6, app_timer)) {
-		l7popen_delete6(bound_pcb);
+		l7popen_delete6_without_lock(bound_pcb);
 	}
+	uhi_rte_rwlock_write_unlock(&l7popen_rwlock6);
 }
 
 struct clickpcb *
@@ -1852,15 +1866,18 @@
 	hash_pcb.chp_localport = dport;
 	hash_pcb.chp_ip_p = proto;
 
-	uhi_rte_rwlock_read_lock(&l7popen_rwlock);
-	bound_pcb = click_hash_insearch(l7popen_hash_table, &hash_pcb, CLICK_HASH_NOINSERT, NULL, NULL, 0);
-	uhi_rte_rwlock_read_unlock(&l7popen_rwlock);
-
-	// update timer for ftp data channel.
-	if (sport == 0 && bound_pcb) {
+	if (sport != 0) {
 		uhi_rte_rwlock_read_lock(&l7popen_rwlock);
-		TIMER_RESET(bound_pcb, &l7popen_timh, app_timer);
+		bound_pcb = click_hash_insearch(l7popen_hash_table, &hash_pcb, CLICK_HASH_NOINSERT, NULL, NULL, 0);
 		uhi_rte_rwlock_read_unlock(&l7popen_rwlock);
+	} else {
+		uhi_rte_rwlock_write_lock(&l7popen_rwlock);
+		bound_pcb = click_hash_insearch(l7popen_hash_table, &hash_pcb, CLICK_HASH_NOINSERT, NULL, NULL, 0);
+		if (bound_pcb) {
+			/* update timer for ftp data channel. */
+			TIMER_RESET(bound_pcb, &l7popen_timh, app_timer);
+		}
+		uhi_rte_rwlock_write_unlock(&l7popen_rwlock);
 	}
 
 #if 0
@@ -1902,15 +1919,18 @@
 	hash_pcb.chp_localport = dport;
 	hash_pcb.chp_ip_p = proto;
 
-	uhi_rte_rwlock_read_lock(&l7popen_rwlock6);	
-	bound_pcb = click_hash_insearch(l7popen_hash_table6, &hash_pcb, CLICK_HASH_NOINSERT, NULL, NULL, 1);
-	uhi_rte_rwlock_read_unlock(&l7popen_rwlock6);
-
-	// update timer for ftp data channel.
-	if (sport == 0 && bound_pcb) {
+	if (sport != 0) {
 		uhi_rte_rwlock_read_lock(&l7popen_rwlock6);
-		TIMER_RESET(bound_pcb, &l7popen_timh6, app_timer);
+		bound_pcb = click_hash_insearch(l7popen_hash_table6, &hash_pcb, CLICK_HASH_NOINSERT, NULL, NULL, 1);
 		uhi_rte_rwlock_read_unlock(&l7popen_rwlock6);
+	} else {
+		uhi_rte_rwlock_write_lock(&l7popen_rwlock6);
+		bound_pcb = click_hash_insearch(l7popen_hash_table6, &hash_pcb, CLICK_HASH_NOINSERT, NULL, NULL, 1);
+		if (bound_pcb) {
+			/* update timer for ftp data channel. */
+			TIMER_RESET(bound_pcb, &l7popen_timh6, app_timer);
+		}
+		uhi_rte_rwlock_write_unlock(&l7popen_rwlock6);
 	}
 
 #if 0
