|
|
@@ -1048,14 +1048,24 @@ static void put_osd(struct ceph_osd *osd)
|
|
|
*/
|
|
|
static void __remove_osd(struct ceph_osd_client *osdc, struct ceph_osd *osd)
|
|
|
{
|
|
|
- dout("__remove_osd %p\n", osd);
|
|
|
+ dout("%s %p osd%d\n", __func__, osd, osd->o_osd);
|
|
|
WARN_ON(!list_empty(&osd->o_requests));
|
|
|
WARN_ON(!list_empty(&osd->o_linger_requests));
|
|
|
|
|
|
- rb_erase(&osd->o_node, &osdc->osds);
|
|
|
list_del_init(&osd->o_osd_lru);
|
|
|
- ceph_con_close(&osd->o_con);
|
|
|
- put_osd(osd);
|
|
|
+ rb_erase(&osd->o_node, &osdc->osds);
|
|
|
+ RB_CLEAR_NODE(&osd->o_node);
|
|
|
+}
|
|
|
+
|
|
|
+static void remove_osd(struct ceph_osd_client *osdc, struct ceph_osd *osd)
|
|
|
+{
|
|
|
+ dout("%s %p osd%d\n", __func__, osd, osd->o_osd);
|
|
|
+
|
|
|
+ if (!RB_EMPTY_NODE(&osd->o_node)) {
|
|
|
+ ceph_con_close(&osd->o_con);
|
|
|
+ __remove_osd(osdc, osd);
|
|
|
+ put_osd(osd);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
static void remove_all_osds(struct ceph_osd_client *osdc)
|
|
|
@@ -1065,7 +1075,7 @@ static void remove_all_osds(struct ceph_osd_client *osdc)
|
|
|
while (!RB_EMPTY_ROOT(&osdc->osds)) {
|
|
|
struct ceph_osd *osd = rb_entry(rb_first(&osdc->osds),
|
|
|
struct ceph_osd, o_node);
|
|
|
- __remove_osd(osdc, osd);
|
|
|
+ remove_osd(osdc, osd);
|
|
|
}
|
|
|
mutex_unlock(&osdc->request_mutex);
|
|
|
}
|
|
|
@@ -1106,7 +1116,7 @@ static void remove_old_osds(struct ceph_osd_client *osdc)
|
|
|
list_for_each_entry_safe(osd, nosd, &osdc->osd_lru, o_osd_lru) {
|
|
|
if (time_before(jiffies, osd->lru_ttl))
|
|
|
break;
|
|
|
- __remove_osd(osdc, osd);
|
|
|
+ remove_osd(osdc, osd);
|
|
|
}
|
|
|
mutex_unlock(&osdc->request_mutex);
|
|
|
}
|
|
|
@@ -1121,8 +1131,7 @@ static int __reset_osd(struct ceph_osd_client *osdc, struct ceph_osd *osd)
|
|
|
dout("__reset_osd %p osd%d\n", osd, osd->o_osd);
|
|
|
if (list_empty(&osd->o_requests) &&
|
|
|
list_empty(&osd->o_linger_requests)) {
|
|
|
- __remove_osd(osdc, osd);
|
|
|
-
|
|
|
+ remove_osd(osdc, osd);
|
|
|
return -ENODEV;
|
|
|
}
|
|
|
|
|
|
@@ -1926,6 +1935,7 @@ static void reset_changed_osds(struct ceph_osd_client *osdc)
|
|
|
{
|
|
|
struct rb_node *p, *n;
|
|
|
|
|
|
+ dout("%s %p\n", __func__, osdc);
|
|
|
for (p = rb_first(&osdc->osds); p; p = n) {
|
|
|
struct ceph_osd *osd = rb_entry(p, struct ceph_osd, o_node);
|
|
|
|