Commit e9b94f6a authored by Andrew Morton's avatar Andrew Morton Committed by Linus Torvalds

[PATCH] i_size atomic access: infrastructure

From: Daniel McNeil <daniel@osdl.org>

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.
parent 1ac38088
...@@ -94,6 +94,57 @@ static inline int read_seqretry(const seqlock_t *sl, unsigned iv) ...@@ -94,6 +94,57 @@ static inline int read_seqretry(const seqlock_t *sl, unsigned iv)
return (iv & 1) | (sl->sequence ^ iv); 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. * Possible sw/hw IRQ protected versions of the interfaces.
*/ */
......
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