aboutsummaryrefslogtreecommitdiffstats
path: root/fs/ceph
diff options
context:
space:
mode:
authorSage Weil <sage@newdream.net>2010-11-08 12:23:12 -0500
committerSage Weil <sage@newdream.net>2010-11-08 12:23:12 -0500
commit8bd59e0188c04f6540f00e13f633f22e4804ce06 (patch)
tree7f311b4fc75dea4fcd71aedbfa85ce7b6cfd712d /fs/ceph
parentcb4276cca4695670916a82e359f2e3776f0a9138 (diff)
ceph: fix version check on racing inode updates
We may get updates on the same inode from multiple MDSs; generally we only pay attention if the update is newer than what we already have. The exception is when an MDS sense unstable information, in which case we always update. The old > check got this wrong when our version was odd (e.g. 3) and the reply version was even (e.g. 2): the older stale (v2) info would be applied. Fixed and clarified the comment. Signed-off-by: Sage Weil <sage@newdream.net>
Diffstat (limited to 'fs/ceph')
-rw-r--r--fs/ceph/inode.c13
1 files changed, 9 insertions, 4 deletions
diff --git a/fs/ceph/inode.c b/fs/ceph/inode.c
index 5a9f907b805e..425c5b1f944e 100644
--- a/fs/ceph/inode.c
+++ b/fs/ceph/inode.c
@@ -567,12 +567,17 @@ static int fill_inode(struct inode *inode,
567 567
568 /* 568 /*
569 * provided version will be odd if inode value is projected, 569 * provided version will be odd if inode value is projected,
570 * even if stable. skip the update if we have a newer info 570 * even if stable. skip the update if we have newer stable
571 * (e.g., due to inode info racing form multiple MDSs), or if 571 * info (ours>=theirs, e.g. due to racing mds replies), unless
572 * we are getting projected (unstable) inode info. 572 * we are getting projected (unstable) info (in which case the
573 * version is odd, and we want ours>theirs).
574 * us them
575 * 2 2 skip
576 * 3 2 skip
577 * 3 3 update
573 */ 578 */
574 if (le64_to_cpu(info->version) > 0 && 579 if (le64_to_cpu(info->version) > 0 &&
575 (ci->i_version & ~1) > le64_to_cpu(info->version)) 580 (ci->i_version & ~1) >= le64_to_cpu(info->version))
576 goto no_change; 581 goto no_change;
577 582
578 issued = __ceph_caps_issued(ci, &implemented); 583 issued = __ceph_caps_issued(ci, &implemented);