From: Daniel McNeil This adds a sequence counter only version of the reader/writer consistent mechanism to seqlock.h This is used in the second part of this patch give atomic access to i_size. include/linux/seqlock.h | 51 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 51 insertions(+) diff -puN include/linux/seqlock.h~seqcount-locking include/linux/seqlock.h --- 25/include/linux/seqlock.h~seqcount-locking 2003-06-19 23:02:53.000000000 -0700 +++ 25-akpm/include/linux/seqlock.h 2003-06-19 23:02:53.000000000 -0700 @@ -94,6 +94,57 @@ static inline int read_seqretry(const se return (iv & 1) | (sl->sequence ^ iv); } + +/* + * Version using sequence counter only. + * This can be used when code has its own mutex protecting the + * updating starting before the write_seqcountbeqin() and ending + * after the write_seqcount_end(). + */ + +typedef struct seqcount { + unsigned sequence; +} seqcount_t; + +#define SEQCNT_ZERO { 0 } +#define seqcount_init(x) do { *(x) = (seqcount_t) SEQCNT_ZERO; } while (0) + +/* Start of read using pointer to a sequence counter only. */ +static inline unsigned read_seqcount_begin(const seqcount_t *s) +{ + unsigned ret = s->sequence; + smp_rmb(); + return ret; +} + +/* Test if reader processed invalid data. + * Equivalent to: iv is odd or sequence number has changed. + * (iv & 1) || (*s != iv) + * Using xor saves one conditional branch. + */ +static inline int read_seqcount_retry(const seqcount_t *s, unsigned iv) +{ + smp_rmb(); + return (iv & 1) | (s->sequence ^ iv); +} + + +/* + * Sequence counter only version assumes that callers are using their + * own mutexing. + */ +static inline void write_seqcount_begin(seqcount_t *s) +{ + s->sequence++; + smp_wmb(); +} + +static inline void write_seqcount_end(seqcount_t *s) +{ + smp_wmb(); + s->sequence++; +} + /* * Possible sw/hw IRQ protected versions of the interfaces. */ _