From: Sage Weil Date: Thu, 3 Sep 2009 19:41:34 +0000 (-0700) Subject: kclient: fix bug in ESTALE handling in mdsc X-Git-Tag: v0.14~48 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=7043dec2aebb819b36ff555e9d2d913ddf4c9937;p=ceph.git kclient: fix bug in ESTALE handling in mdsc --- diff --git a/src/kernel/mds_client.c b/src/kernel/mds_client.c index 0a91a7003ad..e41eb71cf15 100644 --- a/src/kernel/mds_client.c +++ b/src/kernel/mds_client.c @@ -1671,6 +1671,24 @@ static void handle_reply(struct ceph_mds_session *session, struct ceph_msg *msg) goto out; } + result = le32_to_cpu(head->result); + + /* + * Tolerate 2 consecutive ESTALEs from the same mds. + * FIXME: we should be looking at the cap migrate_seq. + */ + if (result == -ESTALE) { + req->r_direct_mode = USE_AUTH_MDS; + req->r_num_stale++; + if (req->r_num_stale <= 2) { + __do_request(mdsc, req); + mutex_unlock(&mdsc->mutex); + goto out; + } + } else { + req->r_num_stale = 0; + } + if (head->safe) { req->r_got_safe = true; __unregister_request(mdsc, req); @@ -1702,38 +1720,16 @@ static void handle_reply(struct ceph_mds_session *session, struct ceph_msg *msg) list_add_tail(&req->r_unsafe_item, &req->r_session->s_unsafe); } + dout("handle_reply tid %lld result %d\n", tid, result); + rinfo = &req->r_reply_info; + err = parse_reply_info(msg, rinfo); mutex_unlock(&mdsc->mutex); mutex_lock(&session->s_mutex); - - /* parse */ - rinfo = &req->r_reply_info; - err = parse_reply_info(msg, rinfo); if (err < 0) { pr_err("ceph_mdsc_handle_reply got corrupt reply mds%d\n", mds); goto out_err; } - result = le32_to_cpu(rinfo->head->result); - dout("handle_reply tid %lld result %d\n", tid, result); - - /* - * Tolerate 2 consecutive ESTALEs from the same mds. - * FIXME: we should be looking at the cap migrate_seq. - */ - if (result == -ESTALE) { - req->r_direct_mode = USE_AUTH_MDS; - req->r_num_stale++; - if (req->r_num_stale <= 2) { - mutex_unlock(&req->r_session->s_mutex); - mutex_lock(&mdsc->mutex); - put_request_session(req); - __do_request(mdsc, req); - mutex_unlock(&mdsc->mutex); - goto out; - } - } else { - req->r_num_stale = 0; - } /* snap trace */ if (rinfo->snapblob_len) {