@@ -265,6 +265,9 @@ spdk_nvmf_subsystem_create(struct spdk_nvmf_tgt *tgt,
265265 subsystem -> next_cntlid = 1 ;
266266 subsystem -> min_cntlid = NVMF_MIN_CNTLID ;
267267 subsystem -> max_cntlid = NVMF_MAX_CNTLID ;
268+ subsystem -> pause_timeout_sec = SPDK_NVMF_DEFAULT_PAUSE_TIMEOUT_SEC ;
269+ subsystem -> pause_flags = 0 ;
270+ subsystem -> pause_timer = NULL ;
268271 snprintf (subsystem -> subnqn , sizeof (subsystem -> subnqn ), "%s" , nqn );
269272 pthread_mutex_init (& subsystem -> mutex , NULL );
270273 TAILQ_INIT (& subsystem -> listeners );
@@ -400,6 +403,11 @@ _nvmf_subsystem_destroy(struct spdk_nvmf_subsystem *subsystem)
400403 return - EINPROGRESS ;
401404 }
402405
406+ if (subsystem -> pause_timer ) {
407+ spdk_poller_unregister (& subsystem -> pause_timer );
408+ subsystem -> pause_timer = NULL ;
409+ }
410+
403411 ns = spdk_nvmf_subsystem_get_first_ns (subsystem );
404412 while (ns != NULL ) {
405413 struct spdk_nvmf_ns * next_ns = spdk_nvmf_subsystem_get_next_ns (subsystem , ns );
@@ -813,6 +821,50 @@ spdk_nvmf_subsystem_stop(struct spdk_nvmf_subsystem *subsystem,
813821 return nvmf_subsystem_state_change (subsystem , 0 , SPDK_NVMF_SUBSYSTEM_INACTIVE , cb_fn , cb_arg );
814822}
815823
824+ static
825+ int nvmf_subsys_pause_timer_cb (void * arg )
826+ {
827+ struct spdk_nvmf_subsystem * subsystem = arg ;
828+ subsystem -> pause_flags = 0 ;
829+ if (subsystem -> pause_timer ) {
830+ spdk_poller_unregister (& subsystem -> pause_timer );
831+ subsystem -> pause_timer = NULL ;
832+ }
833+ return SPDK_POLLER_BUSY ;
834+ }
835+
836+ int
837+ spdk_nvmf_subsystem_pause_ext (struct spdk_nvmf_subsystem * subsystem ,
838+ uint32_t nsid ,
839+ uint32_t flags ,
840+ spdk_nvmf_subsystem_state_change_done cb_fn ,
841+ void * cb_arg )
842+ {
843+ subsystem -> pause_flags = flags ;
844+ if (subsystem -> pause_timer == NULL ) {
845+ subsystem -> pause_timer = spdk_poller_register (
846+ nvmf_subsys_pause_timer_cb ,
847+ subsystem ,
848+ subsystem -> pause_timeout_sec * 1000000ULL
849+ );
850+ }
851+ return spdk_nvmf_subsystem_pause (subsystem , nsid , cb_fn , cb_arg );
852+ }
853+
854+ int
855+ spdk_nvmf_subsystem_set_pause_timeout (struct spdk_nvmf_subsystem * subsystem ,
856+ uint32_t timeout_sec )
857+ {
858+ subsystem -> pause_timeout_sec = timeout_sec ;
859+ return 0 ;
860+ }
861+
862+ uint32_t
863+ spdk_nvmf_subsystem_get_pause_timeout (struct spdk_nvmf_subsystem * subsystem )
864+ {
865+ return subsystem -> pause_timeout_sec ;
866+ }
867+
816868int
817869spdk_nvmf_subsystem_pause (struct spdk_nvmf_subsystem * subsystem ,
818870 uint32_t nsid ,
@@ -822,6 +874,19 @@ spdk_nvmf_subsystem_pause(struct spdk_nvmf_subsystem *subsystem,
822874 return nvmf_subsystem_state_change (subsystem , nsid , SPDK_NVMF_SUBSYSTEM_PAUSED , cb_fn , cb_arg );
823875}
824876
877+ int
878+ spdk_nvmf_subsystem_resume_ext (struct spdk_nvmf_subsystem * subsystem ,
879+ spdk_nvmf_subsystem_state_change_done cb_fn ,
880+ void * cb_arg )
881+ {
882+ subsystem -> pause_flags = 0 ;
883+ if (subsystem -> pause_timer ) {
884+ spdk_poller_unregister (& subsystem -> pause_timer );
885+ subsystem -> pause_timer = NULL ;
886+ }
887+ return spdk_nvmf_subsystem_resume (subsystem , cb_fn , cb_arg );
888+ }
889+
825890int
826891spdk_nvmf_subsystem_resume (struct spdk_nvmf_subsystem * subsystem ,
827892 spdk_nvmf_subsystem_state_change_done cb_fn ,
0 commit comments