return;
dout("osd_reset osd%d\n", osd->o_osd);
osdc = osd->o_osdc;
+ osd->o_incarnation++;
down_read(&osdc->map_sem);
kick_requests(osdc, osd);
up_read(&osdc->map_sem);
atomic_set(&osd->o_ref, 1);
osd->o_osdc = osdc;
INIT_LIST_HEAD(&osd->o_requests);
+ osd->o_incarnation = 1;
ceph_con_init(osdc->client->msgr, &osd->o_con);
osd->o_con.private = osd;
} else {
ceph_con_close(&osd->o_con);
ceph_con_open(&osd->o_con, &osdc->osdmap->osd_addr[osd->o_osd]);
+ osd->o_incarnation++;
}
return ret;
}
{
if (req->r_sent) {
ceph_con_revoke(&req->r_osd->o_con, req->r_request);
- req->r_sent = false;
+ req->r_sent = 0;
}
}
pgid.pg64 = le64_to_cpu(reqhead->layout.ol_pgid);
o = ceph_calc_pg_primary(osdc->osdmap, pgid);
- if ((req->r_osd && req->r_osd->o_osd == o) ||
+ if ((req->r_osd && req->r_osd->o_osd == o &&
+ req->r_sent >= req->r_osd->o_incarnation) ||
(req->r_osd == NULL && o == -1))
return 0; /* no change */
ceph_msg_get(req->r_request); /* send consumes a ref */
ceph_con_send(&req->r_osd->o_con, req->r_request);
- req->r_sent = true;
+ req->r_sent = req->r_osd->o_incarnation;
return 0;
}
atomic_t o_ref;
struct ceph_osd_client *o_osdc;
int o_osd;
+ int o_incarnation;
struct rb_node o_node;
struct ceph_connection o_con;
struct list_head o_requests;
struct ceph_msg *r_request, *r_reply;
int r_result;
int r_flags; /* any additional flags for the osd */
- bool r_sent; /* true if r_request is sending/sent */
+ u32 r_sent; /* >0 if r_request is sending/sent */
int r_prepared_pages, r_got_reply;
struct ceph_osd_client *r_osdc;