History

ext4: atomically set inode->i_flags in ext4_set_inode_flags()

Use cmpxchg() to atomically set i_flags instead of clearing out the S_IMMUTABLE, S_APPEND, etc. flags and then setting them from the EXT4_IMMUTABLE_FL, EXT4_APPEND_FL flags, since this opens up a race where an immutable file has the immutable flag cleared for a brief window of time.

Theodore Ts'o committed 12 years ago

Commit 00a1a051 parent 981e8932 files · +24 −6Browse files

Showing the changes to include (1 of 2 files). Show all

Unified · Split

include/linux/bitops.h+15−0
@@ -196,6 +196,21 @@ static inline unsigned long __ffs64(u64 word) · 195 unmodified lines
196196
197197 #ifdef __KERNEL__
198198
199+#ifndef set_mask_bits
200+#define set_mask_bits(ptr, _mask, _bits) \
201+({ \
202+ const typeof(*ptr) mask = (_mask), bits = (_bits); \
203+ typeof(*ptr) old, new; \
204+ \
205+ do { \
206+ old = ACCESS_ONCE(*ptr); \
207+ new = (old & ~mask) | bits; \
208+ } while (cmpxchg(ptr, old, new) != old); \
209+ \
210+ new; \
211+})
212+#endif
213+
199214 #ifndef find_last_bit
200215 /**
201216 * find_last_bit - find the last set bit in a memory region