From 97e7e73276bb40fc8e1dc6e54340155ae725cda6 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Wed, 26 Mar 2008 20:52:28 -0700 Subject: [PATCH] kclient: fix inode revalidate --- src/kernel/dir.c | 2 +- src/kernel/inode.c | 22 ++++++++++++++-------- src/kernel/super.c | 3 +++ src/kernel/super.h | 2 -- 4 files changed, 18 insertions(+), 11 deletions(-) diff --git a/src/kernel/dir.c b/src/kernel/dir.c index 89738adc75686..64768f240791e 100644 --- a/src/kernel/dir.c +++ b/src/kernel/dir.c @@ -568,7 +568,7 @@ ceph_dir_create(struct inode *dir, struct dentry *dentry, int mode, static int ceph_d_revalidate(struct dentry *dentry, struct nameidata *nd) { dout(20, "d_revalidate ttl %lu now %lu\n", dentry->d_time, jiffies); - if (time_after(jiffies, dentry->d_time+CACHE_HZ)) { + if (time_after(jiffies, dentry->d_time)) { dout(20, "d_revalidate - dentry %p expired\n", dentry); d_drop(dentry); return 0; diff --git a/src/kernel/inode.c b/src/kernel/inode.c index 1697e0cbc04cc..a9ec887c68e7c 100644 --- a/src/kernel/inode.c +++ b/src/kernel/inode.c @@ -162,6 +162,7 @@ void ceph_update_inode_lease(struct inode *inode, do_div(ttl, 1000); ttl += from_time; + dout(10, "update_inode_lease %p mask %d duration %d ms ttl %llu\n", inode, le16_to_cpu(lease->mask), le32_to_cpu(lease->duration_ms), ttl); @@ -761,22 +762,27 @@ int ceph_setattr(struct dentry *dentry, struct iattr *attr) int ceph_inode_revalidate(struct inode *inode, int mask) { struct ceph_inode_info *ci = ceph_inode(inode); - int havemask = 0; + int havemask = ci->i_lease_mask; /* EXCL cap counts for an ICONTENT lease */ if (ceph_caps_issued(ci) & CEPH_CAP_EXCL) havemask |= CEPH_LOCK_ICONTENT; - - /* any bits implies all bits */ + /* any ICONTENT bits imply all bits */ if (havemask & CEPH_LOCK_ICONTENT) havemask |= CEPH_LOCK_ICONTENT; - if (time_before(jiffies, ci->i_lease_ttl+CACHE_HZ) && - (havemask & mask) == mask) { - dout(10, "revalidate %p mask %d still valid\n", inode, mask); - return 0; + if (time_before(jiffies, ci->i_lease_ttl)) { + if ((havemask & mask) == mask) { + dout(10, "inode_revalidate %p mask %d still valid\n", + inode, mask); + return 0; + } + dout(10, "inode_revalidate %p mask %d by only have %d\n", inode, + mask, havemask); + } else { + dout(10, "inode_revalidate %p have %d want %d, lease expired\n", + inode, havemask, mask); } - dout(10, "revalidate %p is old\n", inode); return ceph_do_lookup(inode->i_sb, d_find_alias(inode), mask); } diff --git a/src/kernel/super.c b/src/kernel/super.c index e02683561ad87..54fe405eb2d24 100644 --- a/src/kernel/super.c +++ b/src/kernel/super.c @@ -108,6 +108,9 @@ static struct inode *ceph_alloc_inode(struct super_block *sb) ci->i_symlink = 0; + ci->i_lease_mask = 0; + ci->i_lease_ttl = 0; + ci->i_fragtree = ci->i_fragtree_static; ci->i_fragtree->nsplits = 0; diff --git a/src/kernel/super.h b/src/kernel/super.h index ecc50821e75f9..d19ce506e5ffc 100644 --- a/src/kernel/super.h +++ b/src/kernel/super.h @@ -35,8 +35,6 @@ extern int ceph_lookup_cache; #define CEPH_SUPER_MAGIC 0xc364c0de /* whatev */ -#define CACHE_HZ (1*HZ) - #define IPQUADPORT(n) \ (unsigned int)((n.sin_addr.s_addr)) & 0xFF, \ (unsigned int)((n.sin_addr.s_addr)>>8) & 0xFF, \ -- 2.39.5