]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
kclient: check caps outside mdsc spinlock
authorSage Weil <sage@newdream.net>
Thu, 1 May 2008 23:15:32 +0000 (16:15 -0700)
committerSage Weil <sage@newdream.net>
Thu, 1 May 2008 23:15:32 +0000 (16:15 -0700)
src/kernel/file.c
src/kernel/inode.c
src/kernel/mds_client.c

index 06a2d5d140bcc09830af13824bcbb0dd2ad6e024..509b302afbe6a0a495273bb2b48a807590cf3869 100644 (file)
@@ -249,8 +249,8 @@ ssize_t ceph_read(struct file *filp, char __user *buf, size_t len, loff_t *ppos)
        ssize_t ret;
        int got = 0;
 
-       dout(10, "read %llx %llu~%u trying to get caps\n",
-            ceph_ino(inode), *ppos, (unsigned)len);
+       dout(10, "read %llx %llu~%u trying to get caps on %p\n",
+            ceph_ino(inode), *ppos, (unsigned)len, inode);
        ret = wait_event_interruptible(ci->i_cap_wq,
                                       ceph_get_cap_refs(ci, CEPH_CAP_RD,
                                                         CEPH_CAP_RDCACHE,
index d2bd71123679b088ae62408c37d5c2dd82f7d8fb..159451ba20b583e66036d1206570ccaecac4be7f 100644 (file)
@@ -708,7 +708,8 @@ int __ceph_caps_issued(struct ceph_inode_info *ci)
 
                if (cap->gen < gen || time_after_eq(jiffies, ttl)) {
                        dout(30, "__ceph_caps_issued %p cap %p issued %d "
-                            "but STALE\n", &ci->vfs_inode, cap, cap->issued);
+                            "but STALE (gen %llu vs %llu)\n", &ci->vfs_inode,
+                            cap, cap->issued, cap->gen, gen);
                        continue;
                }
                dout(30, "__ceph_caps_issued %p cap %p issued %d\n",
index 9d506f5bb54aa1bf8890895bda434053acd02214..740e9a46c214f46f264aa19c0b7138a897aa2753 100644 (file)
@@ -697,6 +697,7 @@ static void wake_up_session_caps(struct ceph_mds_session *session)
        dout(10, "wake_up_session_caps %p mds%d\n", session, session->s_mds);
        list_for_each(p, &session->s_caps) {
                cap = list_entry(p, struct ceph_inode_cap, session_caps);
+               dout(20, "waking up waiters on %p\n", &cap->ci->vfs_inode);
                wake_up(&cap->ci->i_cap_wq);
        }
 }
@@ -1542,6 +1543,9 @@ int __ceph_mdsc_send_cap(struct ceph_mds_client *mdsc,
        spin_unlock(&inode->i_lock);
 
        if (dropping & CEPH_CAP_RDCACHE) {
+               /*
+                * FIXME: this will block if there is a locked page..
+                */
                dout(20, "invalidating pages on %p\n", inode);
                invalidate_mapping_pages(&inode->i_data, 0, -1);
                dout(20, "done invalidating pages on %p\n", inode);
@@ -1804,18 +1808,18 @@ static void delayed_work(struct work_struct *work)
        int i;
        struct ceph_mds_client *mdsc =
                container_of(work, struct ceph_mds_client, delayed_work.work);
-       int renew_interval = mdsc->mdsmap->m_cap_bit_timeout >> 1;
+       int renew_interval = mdsc->mdsmap->m_cap_bit_timeout >> 2;
        int renew_caps = time_after_eq(jiffies, HZ*renew_interval + 
                                       mdsc->last_renew_caps);
 
        dout(10, "delayed_work on %p renew_caps=%d\n", mdsc, renew_caps);
 
+       check_delayed_caps(mdsc);
+
        spin_lock(&mdsc->lock);
        if (renew_caps)
                mdsc->last_renew_caps = jiffies;
 
-       check_delayed_caps(mdsc);
-
        for (i = 0; i < mdsc->max_sessions; i++) {
                struct ceph_mds_session *session = __get_session(mdsc, i);
                if (session == 0)