diff options
author | Sage Weil <sage@newdream.net> | 2010-08-22 21:33:32 -0700 |
---|---|---|
committer | Sage Weil <sage@newdream.net> | 2010-08-22 21:33:32 -0700 |
commit | 124514918b030d74f1f3e15483b7bf3b85268082 (patch) | |
tree | 78f539354383bf0820dc1cb20fd752b63f74760c /fs/ceph | |
parent | 679ceace848e9fd570678396ffe1ef034e00e82d (diff) | |
download | op-kernel-dev-124514918b030d74f1f3e15483b7bf3b85268082.zip op-kernel-dev-124514918b030d74f1f3e15483b7bf3b85268082.tar.gz |
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>
Diffstat (limited to 'fs/ceph')
-rw-r--r-- | fs/ceph/inode.c | 1 |
1 files changed, 1 insertions, 0 deletions
diff --git a/fs/ceph/inode.c b/fs/ceph/inode.c index 5d893d3..3e6b52c 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; |