[sheepdog] [PATCH] sheep: set bit in vdi_inuse in atomic manner

Hitoshi Mitake mitake.hitoshi at lab.ntt.co.jp
Wed Aug 28 04:49:46 CEST 2013


sys->vdi_inuse must be operated in atomic manner because it is
manipulated by multiple threads. This patch implements a new bit
operator atomic_set_bit() and let get_vdis_from() use this.

Signed-off-by: Hitoshi Mitake <mitake.hitoshi at lab.ntt.co.jp>
---
 include/bitops.h |    6 ++++++
 sheep/group.c    |    2 +-
 2 files changed, 7 insertions(+), 1 deletion(-)

diff --git a/include/bitops.h b/include/bitops.h
index c4e8f74..8eb5d53 100644
--- a/include/bitops.h
+++ b/include/bitops.h
@@ -135,6 +135,12 @@ static inline void set_bit(int nr, unsigned long *addr)
 	addr[nr / BITS_PER_LONG] |= 1UL << (nr % BITS_PER_LONG);
 }
 
+static inline void atomic_set_bit(int nr, unsigned long *addr)
+{
+	unsigned long val = 1UL << (nr % BITS_PER_LONG);
+	uatomic_or(addr + nr / BITS_PER_LONG, val);
+}
+
 static inline int test_bit(unsigned int nr, const unsigned long *addr)
 {
 	return ((1UL << (nr % BITS_PER_LONG)) &
diff --git a/sheep/group.c b/sheep/group.c
index cd56cb6..44e4058 100644
--- a/sheep/group.c
+++ b/sheep/group.c
@@ -445,7 +445,7 @@ static int get_vdis_from(struct sd_node *node)
 
 	count = rsp->data_length / sizeof(*vs);
 	for (i = 0; i < count; i++) {
-		set_bit(vs[i].vid, sys->vdi_inuse);
+		atomic_set_bit(vs[i].vid, sys->vdi_inuse);
 		add_vdi_state(vs[i].vid, vs[i].nr_copies, vs[i].snapshot);
 	}
 out:
-- 
1.7.10.4




More information about the sheepdog mailing list