ceph: ensure rename target dentry fails revalidation
authorSage Weil <sage@newdream.net>
Mon, 21 Dec 2009 19:42:18 +0000 (11:42 -0800)
committerSage Weil <sage@newdream.net>
Tue, 22 Dec 2009 00:39:57 +0000 (16:39 -0800)
This works around a bug in vfs_rename_dir() that rehashes the target
dentry.  Ensure such dentries always fail revalidation by timing out the
dentry lease and kicking it out of the current directory lease gen.

This can be reverted when the vfs bug is fixed.

Signed-off-by: Sage Weil <sage@newdream.net>
fs/ceph/inode.c

index db684686f48aac7765e6186fb836e8418421d225..8774b28115970b538fa2af043eb7e2ac84aa2570 100644 (file)
@@ -939,6 +939,10 @@ int ceph_fill_trace(struct super_block *sb, struct ceph_mds_request *req,
                             req->r_old_dentry->d_name.len,
                             req->r_old_dentry->d_name.name,
                             dn, dn->d_name.len, dn->d_name.name);
+                       /* ensure target dentry is invalidated, despite
+                          rehashing bug in vfs_rename_dir */
+                       dn->d_time = jiffies;
+                       ceph_dentry(dn)->lease_shared_gen = 0;
                        /* take overwritten dentry's readdir offset */
                        ceph_dentry(req->r_old_dentry)->offset =
                                ceph_dentry(dn)->offset;