--- ./source/private_module/smb2/smb2_connect.c	2018-08-18 07:43:06.000000000 +0000
+++ ./source/private_module/smb2/smb2_connect.c.hotpatch	2018-09-21 09:53:47.000000000 +0000
@@ -41,10 +41,10 @@
 static atomic_t g_async_rqstp_get_total;
 static atomic_t g_async_rqstp_put_total;
 static u16  g_credit_num = SMB2_MAX_CREDITS;
-
+atomic_t g_cancel_synreq_node_count;
 static bool smb2_connect_sock_chk(struct svc_sock* sock, void* data);
 static void smb2_connect_destroy_session(smb2_transport_connection_t* pConnection, boolean_t force_close);
-
+void smb2_connect_add_cancel_synreq_node_to_list(struct smb2_transport_connection * connection, struct smb2_canceled_sync_request_node* node);
 ssize_t smb2_pum_get_credit_num(char *buf, size_t len)
 {
     int used_len = 0;
@@ -534,11 +534,12 @@
 
         LIST_FOR_EACH_ENTRY_SAFE(node, struct smb2_canceled_sync_request_node,
             node_temp, &connection->CanceledSyncRequestList, list_node)
-        {
+        {          
+			if (atomic_read(&g_cancel_synreq_node_count) > 0){atomic_dec(&g_cancel_synreq_node_count);} 
             list_del_init(&node->list_node);
             nas_free(node);
         }
-
+		connection->lastActive = 0;
         //the async and sync request list should be empty.
         NAS_CHECK_BUG(list_empty(&connection->RequestList));
         NAS_CHECK_BUG(list_empty(&connection->AsyncCommandList.l_list));
@@ -549,8 +550,7 @@
         list_del_init(&(connection->other_list));
         atomic_dec(&g_OtherConnectionList.total);
         write_unlock(&g_OtherConnectionList.rw_lock);
-        
-        
+           
         if(NULL != connection->rw_delay_info)
         {
             smb_rw_info_node_put(connection->rw_delay_info);
@@ -708,7 +708,7 @@
         }   
     }
     
-    list_add_tail(&node->list_node, &connection->CanceledSyncRequestList);
+	smb2_connect_add_cancel_synreq_node_to_list(connection, node);
     write_unlock(&connection->AsyncCommandList.rwlock);
    
     return NULL;
@@ -741,16 +741,16 @@
         if (node && node->sync_message_id == request->Header.MessageId)
         {
             NAS_DBG(MOD_NAS_PROTO, LOG_DEBUG, "find sync cancel rquest, conn: %p, mid: %llu", connection, request->Header.MessageId);
+			if (atomic_read(&g_cancel_synreq_node_count) > 0){ atomic_dec(&g_cancel_synreq_node_count);}
+            if (connection->lastActive > 0){(connection->lastActive)--;}	
             list_del_init(&node->list_node);
             nas_free(node);
             return true;
         }
-    }
-    
+    } 
     NAS_DBG(MOD_NAS_PROTO, LOG_DEBUG, "not find sync cancel rquest, conn: %p, mid: %llu", connection, request->Header.MessageId);
     return false;
 }
-
 /**************************************************************************
   Namesmb2_connect_add_async_request
   Description: add request to connection's async requestlist,used for cancel cmd. maybe the request has
@@ -1763,4 +1763,66 @@
     return 0;
 }
 
+void smb2_connect_add_cancel_synreq_node_to_list(struct smb2_transport_connection * connection, struct smb2_canceled_sync_request_node* node)
+{
+	struct smb2_canceled_sync_request_node* node_del = NULL;	
+	
+	/*
+	 * connction->lastactiveֶθã52000ʱʾlastactiveСڱʾconnectioncancel_syncnode.
+	 * ¸ֵΪ0ʾתconnection->lastactiveĺΪcancel_synnodeޡ
+	 * ȲʱlasteractiveѾֵҪתΪ0
+	 */
+    if (connection->lastActive > 52000)
+    {
+        connection->lastActive = 0;
+		NAS_DBG(MOD_NAS_PROTO, LOG_DEBUG, "Trans the lastactive meaning.");
+    }
+
+	NAS_DBG(MOD_NAS_PROTO, LOG_DEBUG, "Canceled_synreq_node count before on list, global: %llu, on_connection: %llu, ConnId: %llu.", 
+		atomic_read(&g_cancel_synreq_node_count), connection->lastActive, connection->ConnectionId);
+	
+    if (atomic_read(&g_cancel_synreq_node_count) >= 16000)
+    {
+        if (0 == connection->lastActive)
+        {
+            atomic_inc(&g_cancel_synreq_node_count);
+            (connection->lastActive)++;
+        }
+        else
+        {
+        
+            /*ɾϵĵһnodenode*/
+            node_del = list_first_entry(&connection->CanceledSyncRequestList, smb2_canceled_sync_request_node_t, list_node);
+
+			NAS_DBG(MOD_NAS_PROTO, LOG_DEBUG, "Canceled_synreq_node to del via g_cancel_synreq_node_count full, sync_message_id: %llu.",node_del->sync_message_id);
+            list_del_init(&node_del->list_node);
+            nas_free(node_del);
+        }
+    }
+    else
+    {
+        if (connection->lastActive >= 1000)
+        {
+         	/*ɾϵĵһnodenode*/
+            node_del = list_first_entry(&connection->CanceledSyncRequestList, smb2_canceled_sync_request_node_t, list_node);
+
+			NAS_DBG(MOD_NAS_PROTO, LOG_DEBUG, "Canceled_synreq_node to del via per connection full, sync_message_id: %llu.",node_del->sync_message_id);
+            list_del_init(&node_del->list_node);
+            nas_free(node_del);
+        }
+        else
+        {
+            atomic_inc(&g_cancel_synreq_node_count);
+            (connection->lastActive)++;
+
+        }
+    }
+	
+	NAS_DBG(MOD_NAS_PROTO, LOG_DEBUG, "Canceled_synreq_node count after on list, global: %llu, on_connection: %llu, ConnId: %llu.", 
+		atomic_read(&g_cancel_synreq_node_count), connection->lastActive, connection->ConnectionId);
+	
+    list_add_tail(&node->list_node, &connection->CanceledSyncRequestList);
+	
+	return;
+}
 
--- ./source/private_module/smb2/smb2_proc.c	2018-08-18 07:43:06.000000000 +0000
+++ ./source/private_module/smb2/smb2_proc.c.hotpatch	2018-09-21 09:53:47.000000000 +0000
@@ -291,7 +291,7 @@
 
     pConnection = (struct smb2_transport_connection*)sock_info->user_data;
     CHECK_ERROR_CONDITION_EVAL_GOTO(!smb2_connect_is_valid(pConnection), IOD_RESULT(pReq), NAS_DROP, done);
-    pConnection->lastActive = jiffies;
+    //pConnection->lastActive = jiffies;
 
     NAS_DBG(MOD_NAS_PROTO, LOG_DEBUG, "pConnection->tenant_id:%d", pConnection->tenant_id);
     tenant_cfg = pConnection->tenant_cfg;
