diff options
author | Sage Weil <sage@newdream.net> | 2010-04-16 15:56:11 -0400 |
---|---|---|
committer | Sage Weil <sage@newdream.net> | 2010-05-03 13:49:22 -0400 |
commit | c10f5e12bafde7f7a2f9b75d76f7a68d62154e91 (patch) | |
tree | 422e4a5898dea5fddaa4b6b73379b9ac4db230b5 | |
parent | 66f41d4c5c8a5deed66fdcc84509376c9a0bf9d8 (diff) |
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>
-rw-r--r-- | fs/ceph/inode.c | 4 |
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, | |||
997 | dn, dn->d_name.len, dn->d_name.name); | 997 | dn, dn->d_name.len, dn->d_name.name); |
998 | dout("fill_trace doing d_move %p -> %p\n", | 998 | dout("fill_trace doing d_move %p -> %p\n", |
999 | req->r_old_dentry, dn); | 999 | req->r_old_dentry, dn); |
1000 | |||
1001 | /* d_move screws up d_subdirs order */ | ||
1002 | ceph_i_clear(dir, CEPH_I_COMPLETE); | ||
1003 | |||
1000 | d_move(req->r_old_dentry, dn); | 1004 | d_move(req->r_old_dentry, dn); |
1001 | dout(" src %p '%.*s' dst %p '%.*s'\n", | 1005 | dout(" src %p '%.*s' dst %p '%.*s'\n", |
1002 | req->r_old_dentry, | 1006 | req->r_old_dentry, |