From: Sage Weil Date: Wed, 18 Jun 2008 21:44:55 +0000 (-0700) Subject: kclient: use d_time to track dir version X-Git-Tag: v0.3~81 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=94d6645f77cec8e1d0559faa88995f9a89e29021;p=ceph.git kclient: use d_time to track dir version --- 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);