]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
kclient: use d_time to track dir version
authorSage Weil <sage@newdream.net>
Wed, 18 Jun 2008 21:44:55 +0000 (14:44 -0700)
committerSage Weil <sage@newdream.net>
Wed, 18 Jun 2008 21:44:55 +0000 (14:44 -0700)
src/kernel/dir.c
src/kernel/inode.c

index e1328df605c1b9c50f4996e5e83f5d693b80634f..3cb236a6bf6158a4036f1e9c60e1f4d1544d4e06 100644 (file)
@@ -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;
index d01386e65f552f56ba253dca121010f3aa7be648..003051edd3c8f1c3657397b4f5d935b8d2cde433 100644 (file)
@@ -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);