summaryrefslogtreecommitdiff
path: root/include/linux/iversion.h
diff options
context:
space:
mode:
authorAlex Deucher <alexander.deucher@amd.com>2019-08-09 13:07:28 -0500
committerAlex Deucher <alexander.deucher@amd.com>2019-08-09 13:07:28 -0500
commit3f61fd41f38328f0a585eaba2d72d339fe9aecda (patch)
tree4a6fe7dc98a44dec003833a7fa440daa6c304a28 /include/linux/iversion.h
parent6ca523d7eb198b78f79df882b7dc4a8c795d8777 (diff)
parente21a712a9685488f5ce80495b37b9fdbe96c230d (diff)
Merge tag 'v5.3-rc3' into drm-next-5.4
Linux 5.3-rc3 Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'include/linux/iversion.h')
-rw-r--r--include/linux/iversion.h24
1 files changed, 24 insertions, 0 deletions
diff --git a/include/linux/iversion.h b/include/linux/iversion.h
index be50ef7cedab..2917ef990d43 100644
--- a/include/linux/iversion.h
+++ b/include/linux/iversion.h
@@ -113,6 +113,30 @@ inode_peek_iversion_raw(const struct inode *inode)
}
/**
+ * inode_set_max_iversion_raw - update i_version new value is larger
+ * @inode: inode to set
+ * @val: new i_version to set
+ *
+ * Some self-managed filesystems (e.g Ceph) will only update the i_version
+ * value if the new value is larger than the one we already have.
+ */
+static inline void
+inode_set_max_iversion_raw(struct inode *inode, u64 val)
+{
+ u64 cur, old;
+
+ cur = inode_peek_iversion_raw(inode);
+ for (;;) {
+ if (cur > val)
+ break;
+ old = atomic64_cmpxchg(&inode->i_version, cur, val);
+ if (likely(old == cur))
+ break;
+ cur = old;
+ }
+}
+
+/**
* inode_set_iversion - set i_version to a particular value
* @inode: inode to set
* @val: new i_version value to set