From decee631851c88ba161d7e1ec40f0d5ecd4ae051 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Thu, 1 May 2008 16:15:32 -0700 Subject: [PATCH] kclient: check caps outside mdsc spinlock --- src/kernel/file.c | 4 ++-- src/kernel/inode.c | 3 ++- src/kernel/mds_client.c | 10 +++++++--- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/src/kernel/file.c b/src/kernel/file.c index 06a2d5d140bcc..509b302afbe6a 100644 --- a/src/kernel/file.c +++ b/src/kernel/file.c @@ -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, diff --git a/src/kernel/inode.c b/src/kernel/inode.c index d2bd71123679b..159451ba20b58 100644 --- a/src/kernel/inode.c +++ b/src/kernel/inode.c @@ -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", diff --git a/src/kernel/mds_client.c b/src/kernel/mds_client.c index 9d506f5bb54aa..740e9a46c214f 100644 --- a/src/kernel/mds_client.c +++ b/src/kernel/mds_client.c @@ -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) -- 2.39.5