]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
kclient: properly maintain mds_wanted value
authorSage Weil <sage@newdream.net>
Tue, 24 Mar 2009 18:17:16 +0000 (11:17 -0700)
committerSage Weil <sage@newdream.net>
Tue, 24 Mar 2009 18:19:26 +0000 (11:19 -0700)
Keep track of what wanted caps we have registered with the mds.

src/kernel/caps.c

index b1e2b60308d4bb6f2afc56ae1cd6ab2f6ee77551..88415e449e8bb72d79db01982c8a8403c0828045 100644 (file)
@@ -262,6 +262,7 @@ int ceph_add_cap(struct inode *inode,
        int mds = session->s_mds;
        int is_first = 0;
        unsigned long duration;
+       int all_wanted;
 
        dout(10, "add_cap %p mds%d cap %llx %s seq %d\n", inode,
             session->s_mds, cap_id, ceph_cap_string(issued), seq);
@@ -291,8 +292,8 @@ retry:
                cap->issued = 0;
                cap->implemented = 0;
                cap->flushing = 0;
-               cap->mds_wanted = wanted;
                cap->mds = mds;
+               cap->mds_wanted = 0;
 
                is_first = RB_EMPTY_ROOT(&ci->i_caps);  /* grab inode later */
                cap->ci = ci;
@@ -312,9 +313,6 @@ retry:
                INIT_LIST_HEAD(&cap->session_rdcaps);
        }
 
-       wanted |= __ceph_caps_wanted(ci);  /* newly and previously wanted... */
-       __adjust_cap_rdcaps_listing(ci, cap, wanted);
-
        if (!ci->i_snap_realm) {
                struct ceph_snap_realm *realm = ceph_lookup_snap_realm(mdsc,
                                                               realmino);
@@ -342,12 +340,18 @@ retry:
        }
 
        /*
-        * if we were just issued un-wanted, un-EXPIREABLE caps,
+        * Ensure our rdcaps status is correct
+        */
+       all_wanted = wanted | __ceph_caps_wanted(ci);
+       __adjust_cap_rdcaps_listing(ci, cap, all_wanted);
+
+       /*
+        * If we were just issued un-wanted, un-EXPIREABLE caps,
         * schedule a delayed cap check, so that they can be released
         * if necessary.
         */
-       if ((issued & ~CEPH_CAP_EXPIREABLE & ~wanted) &&
-           (cap->issued & ~CEPH_CAP_EXPIREABLE & ~wanted) == 0)
+       if ((issued & ~CEPH_CAP_EXPIREABLE & ~all_wanted) &&
+           (cap->issued & ~CEPH_CAP_EXPIREABLE & ~all_wanted) == 0)
                __cap_delay_requeue(mdsc, ci);
 
        dout(10, "add_cap inode %p (%llx.%llx) cap %p %s now %s seq %d mds%d\n",
@@ -356,6 +360,7 @@ retry:
        cap->cap_id = cap_id;
        cap->issued = issued;
        cap->implemented |= issued;
+       cap->mds_wanted |= wanted;
        cap->seq = seq;
        cap->mseq = mseq;
        cap->gen = session->s_cap_gen;