]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: be sure to issue new caps _without revocation_ from encode_indoestat
authorSage Weil <sage@newdream.net>
Wed, 18 Mar 2009 23:25:39 +0000 (16:25 -0700)
committerSage Weil <sage@newdream.net>
Wed, 18 Mar 2009 23:25:51 +0000 (16:25 -0700)
Only explicit GRANT caps messages (via issue_caps) can revoke caps.
Thus, be sure to only _add_ bits to _pending.  Otherwise our
revocation logic (in issue_caps) gets confused, expecting to see
a revocation ack when a lock state changes.

src/mds/CInode.cc
src/mds/Capability.h

index b937feff94d9430608dc506436547bbbc58d7816..ae99aaef962b008f3840aaa899232a955f04218d 100644 (file)
@@ -1454,7 +1454,7 @@ bool CInode::encode_inodestat(bufferlist& bl, Session *session,
        dout(10) << " incorporating cap reconnect wanted " << ccap_string(rc->wanted)
                 << " issue " << ccap_string(rc->issued) << " on " << *this << dendl;
        cap->set_wanted(rc->wanted);
-       cap->issue(rc->issued);
+       cap->issue_norevoke(rc->issued);
        mdcache->remove_replay_cap_reconnect(pi->ino, client);
       }
     }
@@ -1470,7 +1470,7 @@ bool CInode::encode_inodestat(bufferlist& bl, Session *session,
       int likes = get_caps_liked();
       bool loner = (get_loner() == client);
       int issue = (cap->wanted() | likes) & get_caps_allowed(loner);
-      cap->issue(issue);
+      cap->issue_norevoke(issue);
       cap->set_last_issue_stamp(g_clock.recent_now());
       cap->touch();   // move to back of session cap LRU
       e.cap.caps = issue;
index ed9dbfd6b509250e8f71e042ae7a9400e09c30d4..ff2cba388ca3d19aa292c3975871577a10686af8 100644 (file)
@@ -165,6 +165,12 @@ public:
     ++last_sent;
     return last_sent;
   }
+  ceph_seq_t issue_norevoke(int c) {
+    _pending |= c;
+    check_rdcaps_list();
+    ++last_sent;
+    return last_sent;
+  }
   void confirm_receipt(ceph_seq_t seq, int caps) {
     _issued = caps;
     if (seq == last_sent) {