|
@@ -747,31 +747,35 @@ static void remove_old_osds(struct ceph_osd_client *osdc)
|
|
|
*/
|
|
|
static int __reset_osd(struct ceph_osd_client *osdc, struct ceph_osd *osd)
|
|
|
{
|
|
|
- struct ceph_osd_request *req;
|
|
|
- int ret = 0;
|
|
|
+ struct ceph_entity_addr *peer_addr;
|
|
|
|
|
|
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);
|
|
|
- ret = -ENODEV;
|
|
|
- } else if (memcmp(&osdc->osdmap->osd_addr[osd->o_osd],
|
|
|
- &osd->o_con.peer_addr,
|
|
|
- sizeof(osd->o_con.peer_addr)) == 0 &&
|
|
|
- !ceph_con_opened(&osd->o_con)) {
|
|
|
+
|
|
|
+ return -ENODEV;
|
|
|
+ }
|
|
|
+
|
|
|
+ peer_addr = &osdc->osdmap->osd_addr[osd->o_osd];
|
|
|
+ if (!memcmp(peer_addr, &osd->o_con.peer_addr, sizeof (*peer_addr)) &&
|
|
|
+ !ceph_con_opened(&osd->o_con)) {
|
|
|
+ struct ceph_osd_request *req;
|
|
|
+
|
|
|
dout(" osd addr hasn't changed and connection never opened,"
|
|
|
" letting msgr retry");
|
|
|
/* touch each r_stamp for handle_timeout()'s benfit */
|
|
|
list_for_each_entry(req, &osd->o_requests, r_osd_item)
|
|
|
req->r_stamp = jiffies;
|
|
|
- ret = -EAGAIN;
|
|
|
- } else {
|
|
|
- ceph_con_close(&osd->o_con);
|
|
|
- ceph_con_open(&osd->o_con, CEPH_ENTITY_TYPE_OSD, osd->o_osd,
|
|
|
- &osdc->osdmap->osd_addr[osd->o_osd]);
|
|
|
- osd->o_incarnation++;
|
|
|
+
|
|
|
+ return -EAGAIN;
|
|
|
}
|
|
|
- return ret;
|
|
|
+
|
|
|
+ ceph_con_close(&osd->o_con);
|
|
|
+ ceph_con_open(&osd->o_con, CEPH_ENTITY_TYPE_OSD, osd->o_osd, peer_addr);
|
|
|
+ osd->o_incarnation++;
|
|
|
+
|
|
|
+ return 0;
|
|
|
}
|
|
|
|
|
|
static void __insert_osd(struct ceph_osd_client *osdc, struct ceph_osd *new)
|