ceph: don't improperly set dir complete when holding EXCL cap
authorSage Weil <sage@newdream.net>
Mon, 23 Aug 2010 04:33:32 +0000 (21:33 -0700)
committerSage Weil <sage@newdream.net>
Mon, 23 Aug 2010 04:33:32 +0000 (21:33 -0700)
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>
fs/ceph/inode.c

index 5d893d31e399b81f57543ede560dc2258f7400da..3e6b52cb5ee85e58d58fc98dacc3c9e11242759f 100644 (file)
@@ -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;