@@ -685,6 +685,18 @@ static void __remove_osd(struct ceph_osd_client *osdc, struct ceph_osd *osd)
685
685
put_osd (osd );
686
686
}
687
687
688
+ static void remove_all_osds (struct ceph_osd_client * osdc )
689
+ {
690
+ dout ("__remove_old_osds %p\n" , osdc );
691
+ mutex_lock (& osdc -> request_mutex );
692
+ while (!RB_EMPTY_ROOT (& osdc -> osds )) {
693
+ struct ceph_osd * osd = rb_entry (rb_first (& osdc -> osds ),
694
+ struct ceph_osd , o_node );
695
+ __remove_osd (osdc , osd );
696
+ }
697
+ mutex_unlock (& osdc -> request_mutex );
698
+ }
699
+
688
700
static void __move_osd_to_lru (struct ceph_osd_client * osdc ,
689
701
struct ceph_osd * osd )
690
702
{
@@ -701,14 +713,14 @@ static void __remove_osd_from_lru(struct ceph_osd *osd)
701
713
list_del_init (& osd -> o_osd_lru );
702
714
}
703
715
704
- static void remove_old_osds (struct ceph_osd_client * osdc , int remove_all )
716
+ static void remove_old_osds (struct ceph_osd_client * osdc )
705
717
{
706
718
struct ceph_osd * osd , * nosd ;
707
719
708
720
dout ("__remove_old_osds %p\n" , osdc );
709
721
mutex_lock (& osdc -> request_mutex );
710
722
list_for_each_entry_safe (osd , nosd , & osdc -> osd_lru , o_osd_lru ) {
711
- if (! remove_all && time_before (jiffies , osd -> lru_ttl ))
723
+ if (time_before (jiffies , osd -> lru_ttl ))
712
724
break ;
713
725
__remove_osd (osdc , osd );
714
726
}
@@ -751,6 +763,7 @@ static void __insert_osd(struct ceph_osd_client *osdc, struct ceph_osd *new)
751
763
struct rb_node * parent = NULL ;
752
764
struct ceph_osd * osd = NULL ;
753
765
766
+ dout ("__insert_osd %p osd%d\n" , new , new -> o_osd );
754
767
while (* p ) {
755
768
parent = * p ;
756
769
osd = rb_entry (parent , struct ceph_osd , o_node );
@@ -1144,7 +1157,7 @@ static void handle_osds_timeout(struct work_struct *work)
1144
1157
1145
1158
dout ("osds timeout\n" );
1146
1159
down_read (& osdc -> map_sem );
1147
- remove_old_osds (osdc , 0 );
1160
+ remove_old_osds (osdc );
1148
1161
up_read (& osdc -> map_sem );
1149
1162
1150
1163
schedule_delayed_work (& osdc -> osds_timeout_work ,
@@ -1862,8 +1875,7 @@ void ceph_osdc_stop(struct ceph_osd_client *osdc)
1862
1875
ceph_osdmap_destroy (osdc -> osdmap );
1863
1876
osdc -> osdmap = NULL ;
1864
1877
}
1865
- remove_old_osds (osdc , 1 );
1866
- WARN_ON (!RB_EMPTY_ROOT (& osdc -> osds ));
1878
+ remove_all_osds (osdc );
1867
1879
mempool_destroy (osdc -> req_mempool );
1868
1880
ceph_msgpool_destroy (& osdc -> msgpool_op );
1869
1881
ceph_msgpool_destroy (& osdc -> msgpool_op_reply );
0 commit comments