Commit 441d3676 authored by Jeff Layton's avatar Jeff Layton Committed by Ilya Dryomov

iversion: add a routine to update a raw value with a larger one

Under ceph, clients can be independently updating iversion themselves,
while working under comprehensive sets of caps on an inode. In that
situation we always want to prefer the largest value of a change
attribute. Add a new function that will update a raw value with a larger
one, but otherwise leave it alone.
Signed-off-by: default avatarJeff Layton <jlayton@kernel.org>
Reviewed-by: default avatar"Yan, Zheng" <zyan@redhat.com>
Signed-off-by: default avatarIlya Dryomov <idryomov@gmail.com>
parent 58981784
...@@ -112,6 +112,30 @@ inode_peek_iversion_raw(const struct inode *inode) ...@@ -112,6 +112,30 @@ inode_peek_iversion_raw(const struct inode *inode)
return atomic64_read(&inode->i_version); return atomic64_read(&inode->i_version);
} }
/**
* 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_set_iversion - set i_version to a particular value
* @inode: inode to set * @inode: inode to set
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment