]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
kclient: set/verify seq in renew caps messages
authorSage Weil <sage@newdream.net>
Thu, 10 Sep 2009 23:36:55 +0000 (16:36 -0700)
committerSage Weil <sage@newdream.net>
Thu, 10 Sep 2009 23:36:55 +0000 (16:36 -0700)
src/kernel/mds_client.c
src/kernel/mds_client.h

index 63af4ed0f7e76dd62b6c6e3f85626a16c64ef788..b83fe942000badbe3b1f6b06325a1a9a3b96e609 100644 (file)
@@ -332,6 +332,7 @@ static struct ceph_mds_session *register_session(struct ceph_mds_client *mdsc,
        s->s_cap_gen = 0;
        s->s_cap_ttl = 0;
        s->s_renew_requested = 0;
+       s->s_renew_seq = 0;
        INIT_LIST_HEAD(&s->s_caps);
        s->s_nr_caps = 0;
        atomic_set(&s->s_ref, 1);
@@ -782,7 +783,8 @@ static int send_renew_caps(struct ceph_mds_client *mdsc,
        dout("send_renew_caps to mds%d (%s)\n", session->s_mds,
                ceph_mds_state_name(state));
        session->s_renew_requested = jiffies;
-       msg = create_session_msg(CEPH_SESSION_REQUEST_RENEWCAPS, 0);
+       msg = create_session_msg(CEPH_SESSION_REQUEST_RENEWCAPS,
+                                ++session->s_renew_seq);
        if (IS_ERR(msg))
                return PTR_ERR(msg);
        ceph_con_send(&session->s_con, msg);
@@ -1880,7 +1882,8 @@ static void handle_session(struct ceph_mds_session *session,
                break;
 
        case CEPH_SESSION_RENEWCAPS:
-               renewed_caps(mdsc, session, 1);
+               if (session->s_renew_seq == seq)
+                       renewed_caps(mdsc, session, 1);
                break;
 
        case CEPH_SESSION_CLOSE:
index 18a2932dc12d638938e65ff7a564598a7f366128..f566e9c842958eb42b683a5f158b1e2f590ae5af 100644 (file)
@@ -114,6 +114,7 @@ struct ceph_mds_session {
        struct list_head  s_cap_flushing;     /* inodes w/ flushing caps */
        struct list_head  s_cap_snaps_flushing;
        unsigned long     s_renew_requested; /* last time we sent a renew req */
+       u64               s_renew_seq;
 
        atomic_t          s_ref;
        struct list_head  s_waiting;  /* waiting requests */