@@ -760,6 +760,20 @@ void xprt_disconnect_done(struct rpc_xprt *xprt)
760
760
}
761
761
EXPORT_SYMBOL_GPL (xprt_disconnect_done );
762
762
763
+ /**
764
+ * xprt_schedule_autoclose_locked - Try to schedule an autoclose RPC call
765
+ * @xprt: transport to disconnect
766
+ */
767
+ static void xprt_schedule_autoclose_locked (struct rpc_xprt * xprt )
768
+ {
769
+ set_bit (XPRT_CLOSE_WAIT , & xprt -> state );
770
+ if (test_and_set_bit (XPRT_LOCKED , & xprt -> state ) == 0 )
771
+ queue_work (xprtiod_workqueue , & xprt -> task_cleanup );
772
+ else if (xprt -> snd_task && !test_bit (XPRT_SND_IS_COOKIE , & xprt -> state ))
773
+ rpc_wake_up_queued_task_set_status (& xprt -> pending ,
774
+ xprt -> snd_task , - ENOTCONN );
775
+ }
776
+
763
777
/**
764
778
* xprt_force_disconnect - force a transport to disconnect
765
779
* @xprt: transport to disconnect
@@ -771,13 +785,7 @@ void xprt_force_disconnect(struct rpc_xprt *xprt)
771
785
772
786
/* Don't race with the test_bit() in xprt_clear_locked() */
773
787
spin_lock (& xprt -> transport_lock );
774
- set_bit (XPRT_CLOSE_WAIT , & xprt -> state );
775
- /* Try to schedule an autoclose RPC call */
776
- if (test_and_set_bit (XPRT_LOCKED , & xprt -> state ) == 0 )
777
- queue_work (xprtiod_workqueue , & xprt -> task_cleanup );
778
- else if (xprt -> snd_task && !test_bit (XPRT_SND_IS_COOKIE , & xprt -> state ))
779
- rpc_wake_up_queued_task_set_status (& xprt -> pending ,
780
- xprt -> snd_task , - ENOTCONN );
788
+ xprt_schedule_autoclose_locked (xprt );
781
789
spin_unlock (& xprt -> transport_lock );
782
790
}
783
791
EXPORT_SYMBOL_GPL (xprt_force_disconnect );
@@ -817,11 +825,7 @@ void xprt_conditional_disconnect(struct rpc_xprt *xprt, unsigned int cookie)
817
825
goto out ;
818
826
if (test_bit (XPRT_CLOSING , & xprt -> state ))
819
827
goto out ;
820
- set_bit (XPRT_CLOSE_WAIT , & xprt -> state );
821
- /* Try to schedule an autoclose RPC call */
822
- if (test_and_set_bit (XPRT_LOCKED , & xprt -> state ) == 0 )
823
- queue_work (xprtiod_workqueue , & xprt -> task_cleanup );
824
- xprt_wake_pending_tasks (xprt , - EAGAIN );
828
+ xprt_schedule_autoclose_locked (xprt );
825
829
out :
826
830
spin_unlock (& xprt -> transport_lock );
827
831
}
0 commit comments