summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSage Weil <sage@newdream.net>2010-08-22 21:33:32 -0700
committerSage Weil <sage@newdream.net>2010-08-22 21:33:32 -0700
commit124514918b030d74f1f3e15483b7bf3b85268082 (patch)
tree78f539354383bf0820dc1cb20fd752b63f74760c
parent679ceace848e9fd570678396ffe1ef034e00e82d (diff)
downloadlinux-stable-124514918b030d74f1f3e15483b7bf3b85268082.tar.gz
linux-stable-124514918b030d74f1f3e15483b7bf3b85268082.tar.bz2
linux-stable-124514918b030d74f1f3e15483b7bf3b85268082.zip
ceph: don't improperly set dir complete when holding EXCL cap
If we hold the EXCL cap, we cannot trust the dir stats from the MDS (num files, subdirs) and must not incorrectly conclude that the directory is empty. If we do, we get can bad results from lookup (bad ENOENT) and bad readdir results. Signed-off-by: Sage Weil <sage@newdream.net>
-rw-r--r--fs/ceph/inode.c1
1 files changed, 1 insertions, 0 deletions
diff --git a/fs/ceph/inode.c b/fs/ceph/inode.c
index 5d893d31e399..3e6b52cb5ee8 100644
--- a/fs/ceph/inode.c
+++ b/fs/ceph/inode.c
@@ -677,6 +677,7 @@ static int fill_inode(struct inode *inode,
if (ci->i_files == 0 && ci->i_subdirs == 0 &&
ceph_snap(inode) == CEPH_NOSNAP &&
(le32_to_cpu(info->cap.caps) & CEPH_CAP_FILE_SHARED) &&
+ (issued & CEPH_CAP_FILE_EXCL) == 0 &&
(ci->i_ceph_flags & CEPH_I_COMPLETE) == 0) {
dout(" marking %p complete (empty)\n", inode);
ci->i_ceph_flags |= CEPH_I_COMPLETE;