summaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
authorSage Weil <sage@newdream.net>2010-04-16 21:56:11 +0200
committerSage Weil <sage@newdream.net>2010-05-03 19:49:22 +0200
commitc10f5e12bafde7f7a2f9b75d76f7a68d62154e91 (patch)
tree422e4a5898dea5fddaa4b6b73379b9ac4db230b5 /fs
parentLinux 2.6.34-rc6 (diff)
downloadlinux-c10f5e12bafde7f7a2f9b75d76f7a68d62154e91.tar.xz
linux-c10f5e12bafde7f7a2f9b75d76f7a68d62154e91.zip
ceph: clear dir complete on d_move
d_move() reorders the d_subdirs list, breaking the readdir result caching. Unless/until d_move preserves that ordering, clear CEPH_I_COMPLETE on rename. Signed-off-by: Sage Weil <sage@newdream.net>
Diffstat (limited to 'fs')
-rw-r--r--fs/ceph/inode.c4
1 files changed, 4 insertions, 0 deletions
diff --git a/fs/ceph/inode.c b/fs/ceph/inode.c
index 26f883c275e8..261f3e6c0bcf 100644
--- a/fs/ceph/inode.c
+++ b/fs/ceph/inode.c
@@ -997,6 +997,10 @@ int ceph_fill_trace(struct super_block *sb, struct ceph_mds_request *req,
dn, dn->d_name.len, dn->d_name.name);
dout("fill_trace doing d_move %p -> %p\n",
req->r_old_dentry, dn);
+
+ /* d_move screws up d_subdirs order */
+ ceph_i_clear(dir, CEPH_I_COMPLETE);
+
d_move(req->r_old_dentry, dn);
dout(" src %p '%.*s' dst %p '%.*s'\n",
req->r_old_dentry,