summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSage Weil <sage@newdream.net>2010-11-08 18:23:12 +0100
committerSage Weil <sage@newdream.net>2010-11-08 18:23:12 +0100
commit8bd59e0188c04f6540f00e13f633f22e4804ce06 (patch)
tree7f311b4fc75dea4fcd71aedbfa85ce7b6cfd712d
parentceph: fix uid/gid on resent mds requests (diff)
downloadlinux-8bd59e0188c04f6540f00e13f633f22e4804ce06.tar.xz
linux-8bd59e0188c04f6540f00e13f633f22e4804ce06.zip
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>
-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,
/*
* provided version will be odd if inode value is projected,
- * even if stable. skip the update if we have a newer info
- * (e.g., due to inode info racing form multiple MDSs), or if
- * we are getting projected (unstable) inode info.
+ * even if stable. skip the update if we have newer stable
+ * info (ours>=theirs, e.g. due to racing mds replies), unless
+ * we are getting projected (unstable) info (in which case the
+ * version is odd, and we want ours>theirs).
+ * us them
+ * 2 2 skip
+ * 3 2 skip
+ * 3 3 update
*/
if (le64_to_cpu(info->version) > 0 &&
- (ci->i_version & ~1) > le64_to_cpu(info->version))
+ (ci->i_version & ~1) >= le64_to_cpu(info->version))
goto no_change;
issued = __ceph_caps_issued(ci, &implemented);