.. | .. |
---|
113 | 113 | } |
---|
114 | 114 | |
---|
115 | 115 | /** |
---|
| 116 | + * inode_set_max_iversion_raw - update i_version new value is larger |
---|
| 117 | + * @inode: inode to set |
---|
| 118 | + * @val: new i_version to set |
---|
| 119 | + * |
---|
| 120 | + * Some self-managed filesystems (e.g Ceph) will only update the i_version |
---|
| 121 | + * value if the new value is larger than the one we already have. |
---|
| 122 | + */ |
---|
| 123 | +static inline void |
---|
| 124 | +inode_set_max_iversion_raw(struct inode *inode, u64 val) |
---|
| 125 | +{ |
---|
| 126 | + u64 cur, old; |
---|
| 127 | + |
---|
| 128 | + cur = inode_peek_iversion_raw(inode); |
---|
| 129 | + for (;;) { |
---|
| 130 | + if (cur > val) |
---|
| 131 | + break; |
---|
| 132 | + old = atomic64_cmpxchg(&inode->i_version, cur, val); |
---|
| 133 | + if (likely(old == cur)) |
---|
| 134 | + break; |
---|
| 135 | + cur = old; |
---|
| 136 | + } |
---|
| 137 | +} |
---|
| 138 | + |
---|
| 139 | +/** |
---|
116 | 140 | * inode_set_iversion - set i_version to a particular value |
---|
117 | 141 | * @inode: inode to set |
---|
118 | 142 | * @val: new i_version value to set |
---|