From 94d6645f77cec8e1d0559faa88995f9a89e29021 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Wed, 18 Jun 2008 14:44:55 -0700 Subject: [PATCH] kclient: use d_time to track dir version --- src/kernel/dir.c | 3 ++- src/kernel/inode.c | 11 ++++++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/kernel/dir.c b/src/kernel/dir.c index e1328df605c1b..3cb236a6bf615 100644 --- a/src/kernel/dir.c +++ b/src/kernel/dir.c @@ -629,7 +629,8 @@ static int ceph_dentry_revalidate(struct dentry *dentry, struct nameidata *nd) dout(10, "d_revalidate %p '%.*s' inode %p\n", dentry, dentry->d_name.len, dentry->d_name.name, dentry->d_inode); - if (ceph_inode_lease_valid(dir, CEPH_LOCK_ICONTENT)) { + if (ceph_inode(dir)->i_version == dentry->d_time && + ceph_inode_lease_valid(dir, CEPH_LOCK_ICONTENT)) { dout(20, "dentry_revalidate %p have ICONTENT on dir inode %p\n", dentry, dir); return 1; diff --git a/src/kernel/inode.c b/src/kernel/inode.c index d01386e65f552..003051edd3c8f 100644 --- a/src/kernel/inode.c +++ b/src/kernel/inode.c @@ -531,8 +531,17 @@ void ceph_update_dentry_lease(struct dentry *dentry, dout(10, "update_dentry_lease %p mask %d duration %lu ms ttl %lu\n", dentry, le16_to_cpu(lease->mask), duration, ttl); - if (lease->mask == 0) + if (lease->mask == 0) { + /* + * no per-dentry lease. so, set d_time to match + * parent directory version. if/when we get an + * ICONTENT cap (implicit directory-wide lease), we'll + * know whether it covers this dentry. + */ + struct inode *dir = dentry->d_parent->d_inode; + dentry->d_time = ceph_inode(dir)->i_version; return; + } spin_lock(&dentry->d_lock); di = ceph_dentry(dentry); -- 2.39.5