aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSage Weil <sage@newdream.net>2010-11-07 12:37:25 -0500
committerSage Weil <sage@newdream.net>2010-11-07 12:39:21 -0500
commit912a9b0319a8eb9e0834b19a25e01013ab2d6a9f (patch)
tree7b04fca1669f006c1a1f35da8d986ca8ad11161c
parent7421ab8041d98363edfb85955fa3b9849ffae366 (diff)
ceph: only let auth caps update max_size
Only the auth MDS has a meaningful max_size value for us, so only update it in fill_inode if we're being issued an auth cap. Otherwise, a random stat result from a non-auth MDS can clobber a meaningful max_size, get the client<->mds cap state out of sync, and make writes hang. Specifically, even if the client re-requests a larger max_size (which it will), the MDS won't respond because as far as it knows we already have a sufficiently large value. Signed-off-by: Sage Weil <sage@newdream.net>
-rw-r--r--fs/ceph/inode.c9
1 files changed, 8 insertions, 1 deletions
diff --git a/fs/ceph/inode.c b/fs/ceph/inode.c
index cd0432c03d2f..0a49ffde5bcb 100644
--- a/fs/ceph/inode.c
+++ b/fs/ceph/inode.c
@@ -606,7 +606,14 @@ static int fill_inode(struct inode *inode,
606 le32_to_cpu(info->time_warp_seq), 606 le32_to_cpu(info->time_warp_seq),
607 &ctime, &mtime, &atime); 607 &ctime, &mtime, &atime);
608 608
609 ci->i_max_size = le64_to_cpu(info->max_size); 609 /* only update max_size on auth cap */
610 if ((info->cap.flags & CEPH_CAP_FLAG_AUTH) &&
611 ci->i_max_size != le64_to_cpu(info->max_size)) {
612 dout("max_size %lld -> %llu\n", ci->i_max_size,
613 le64_to_cpu(info->max_size));
614 ci->i_max_size = le64_to_cpu(info->max_size);
615 }
616
610 ci->i_layout = info->layout; 617 ci->i_layout = info->layout;
611 inode->i_blkbits = fls(le32_to_cpu(info->layout.fl_stripe_unit)) - 1; 618 inode->i_blkbits = fls(le32_to_cpu(info->layout.fl_stripe_unit)) - 1;
612 619