diff options
| author | Sage Weil <sage@newdream.net> | 2010-11-07 12:37:25 -0500 | 
|---|---|---|
| committer | Sage Weil <sage@newdream.net> | 2010-11-07 12:39:21 -0500 | 
| commit | 912a9b0319a8eb9e0834b19a25e01013ab2d6a9f (patch) | |
| tree | 7b04fca1669f006c1a1f35da8d986ca8ad11161c | |
| parent | 7421ab8041d98363edfb85955fa3b9849ffae366 (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.c | 9 | 
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 | ||
