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
196 196
197#ifdef __KERNEL__197#ifdef __KERNEL__
198 198
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
199#ifndef find_last_bit214#ifndef find_last_bit
200/**215/**
201 * find_last_bit - find the last set bit in a memory region216 * find_last_bit - find the last set bit in a memory region