aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYan, Zheng <zyan@redhat.com>2016-02-26 17:16:32 +0800
committerIlya Dryomov <idryomov@gmail.com>2016-03-25 18:51:53 +0100
commita3d714c33632ef6bfdfaacc74ae6ba297b4c5820 (patch)
treec06a6b4821ea6f974b33d7e87e9aa952608e936a
parentaf5e5eb574776cdf1b756a27cc437bff257e22fe (diff)
downloadmd-a3d714c33632ef6bfdfaacc74ae6ba297b4c5820.tar.gz
ceph: avoid updating directory inode's i_size accidentally
Directory inode's i_size is used by readdir cache. Signed-off-by: Yan, Zheng <zyan@redhat.com>
-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 495decfc4b3484..66edef12c6f251 100644
--- a/fs/ceph/inode.c
+++ b/fs/ceph/inode.c
@@ -549,6 +549,10 @@ int ceph_fill_file_size(struct inode *inode, int issued,
if (ceph_seq_cmp(truncate_seq, ci->i_truncate_seq) > 0 ||
(truncate_seq == ci->i_truncate_seq && size > inode->i_size)) {
dout("size %lld -> %llu\n", inode->i_size, size);
+ if (size > 0 && S_ISDIR(inode->i_mode)) {
+ pr_err("fill_file_size non-zero size for directory\n");
+ size = 0;
+ }
i_size_write(inode, size);
inode->i_blocks = (size + (1<<9) - 1) >> 9;
ci->i_reported_size = size;