]> Pileus Git - ~andy/linux/blobdiff - fs/ceph/inode.c
ceph: invalidate affected dentry leases on aborted requests
[~andy/linux] / fs / ceph / inode.c
index 85b4d2ffdeba933da4ac816663a04c3c9ed91924..220a2aec0545c4a25f61398fa5980cb609c2cebf 100644 (file)
@@ -938,8 +938,15 @@ int ceph_fill_trace(struct super_block *sb, struct ceph_mds_request *req,
                                ceph_inode(req->r_locked_dir);
                        dout(" clearing %p complete (empty trace)\n",
                             req->r_locked_dir);
+                       spin_lock(&req->r_locked_dir->i_lock);
                        ci->i_ceph_flags &= ~CEPH_I_COMPLETE;
                        ci->i_release_count++;
+                       spin_unlock(&req->r_locked_dir->i_lock);
+
+                       if (req->r_dentry)
+                               ceph_invalidate_dentry_lease(req->r_dentry);
+                       if (req->r_old_dentry)
+                               ceph_invalidate_dentry_lease(req->r_old_dentry);
                }
                return 0;
        }
@@ -1011,13 +1018,15 @@ 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;
+                       ceph_invalidate_dentry_lease(dn);
+
                        /* take overwritten dentry's readdir offset */
                        ceph_dentry(req->r_old_dentry)->offset =
                                ceph_dentry(dn)->offset;
+
                        dn = req->r_old_dentry;  /* use old_dentry */
                        in = dn->d_inode;
                }