ping I think this patch should goes into 3.11 or fix the issue by other means On 06/24/2013 02:41 PM, Yan, Zheng wrote: > From: "Yan, Zheng" <zheng.z.yan@xxxxxxxxx> > > We can't use !req->r_sent to check if OSD request is sent for the > first time, this is because __cancel_request() zeros req->r_sent > when OSD map changes. Rather than adding a new variable to struct > ceph_osd_request to indicate if it's sent for the first time, We > can call the unsafe callback only when unsafe OSD reply is received. > If OSD's first reply is safe, just skip calling the unsafe callback. > > The purpose of unsafe callback is adding unsafe request to a list, > so that fsync(2) can wait for the safe reply. fsync(2) doesn't need > to wait for a write(2) that hasn't returned yet. So it's OK to add > request to the unsafe list when the first OSD reply is received. > (ceph_sync_write() returns after receiving the first OSD reply) > > Signed-off-by: Yan, Zheng <zheng.z.yan@xxxxxxxxx> > --- > net/ceph/osd_client.c | 14 +++++++------- > 1 file changed, 7 insertions(+), 7 deletions(-) > > diff --git a/net/ceph/osd_client.c b/net/ceph/osd_client.c > index 540dd29..dd47889 100644 > --- a/net/ceph/osd_client.c > +++ b/net/ceph/osd_client.c > @@ -1337,10 +1337,6 @@ static void __send_request(struct ceph_osd_client *osdc, > > ceph_msg_get(req->r_request); /* send consumes a ref */ > > - /* Mark the request unsafe if this is the first timet's being sent. */ > - > - if (!req->r_sent && req->r_unsafe_callback) > - req->r_unsafe_callback(req, true); > req->r_sent = req->r_osd->o_incarnation; > > ceph_con_send(&req->r_osd->o_con, req->r_request); > @@ -1431,8 +1427,6 @@ static void handle_osds_timeout(struct work_struct *work) > > static void complete_request(struct ceph_osd_request *req) > { > - if (req->r_unsafe_callback) > - req->r_unsafe_callback(req, false); > complete_all(&req->r_safe_completion); /* fsync waiter */ > } > > @@ -1559,14 +1553,20 @@ static void handle_reply(struct ceph_osd_client *osdc, struct ceph_msg *msg, > mutex_unlock(&osdc->request_mutex); > > if (!already_completed) { > + if (req->r_unsafe_callback && > + result >= 0 && !(flags & CEPH_OSD_FLAG_ONDISK)) > + req->r_unsafe_callback(req, true); > if (req->r_callback) > req->r_callback(req, msg); > else > complete_all(&req->r_completion); > } > > - if (flags & CEPH_OSD_FLAG_ONDISK) > + if (flags & CEPH_OSD_FLAG_ONDISK) { > + if (req->r_unsafe_callback && already_completed) > + req->r_unsafe_callback(req, false); > complete_request(req); > + } > > done: > dout("req=%p req->r_linger=%d\n", req, req->r_linger); > -- To unsubscribe from this list: send the line "unsubscribe ceph-devel" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html