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>
This commit is contained in:
parent
7421ab8041
commit
912a9b0319
|
@ -606,7 +606,14 @@ static int fill_inode(struct inode *inode,
|
||||||
le32_to_cpu(info->time_warp_seq),
|
le32_to_cpu(info->time_warp_seq),
|
||||||
&ctime, &mtime, &atime);
|
&ctime, &mtime, &atime);
|
||||||
|
|
||||||
ci->i_max_size = le64_to_cpu(info->max_size);
|
/* only update max_size on auth cap */
|
||||||
|
if ((info->cap.flags & CEPH_CAP_FLAG_AUTH) &&
|
||||||
|
ci->i_max_size != le64_to_cpu(info->max_size)) {
|
||||||
|
dout("max_size %lld -> %llu\n", ci->i_max_size,
|
||||||
|
le64_to_cpu(info->max_size));
|
||||||
|
ci->i_max_size = le64_to_cpu(info->max_size);
|
||||||
|
}
|
||||||
|
|
||||||
ci->i_layout = info->layout;
|
ci->i_layout = info->layout;
|
||||||
inode->i_blkbits = fls(le32_to_cpu(info->layout.fl_stripe_unit)) - 1;
|
inode->i_blkbits = fls(le32_to_cpu(info->layout.fl_stripe_unit)) - 1;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue