Commit f83a3788 authored by Philipp Reisner's avatar Philipp Reisner

Cleanups triggered by the comments of Nikanth Karthikesan and Sam Ravnborg.

Signed-off-by: default avatarPhilipp Reisner <philipp.reisner@linbit.com>
Signed-off-by: default avatarLars Ellenberg <lars.ellenberg@linbit.com>
parent 64189e31
#
# DRBD device driver configuration
#
comment "DRBD disabled because PROC_FS, INET or CONNECTOR not selected"
depends on !PROC_FS || !INET || !CONNECTOR
config BLK_DEV_DRBD
tristate "DRBD Distributed Replicated Block Device support"
select INET
select PROC_FS
select CONNECTOR
select CRYPTO
select CRYPTO_HMAC
---help---
DRBD is a block device which is designed to build high availability
clusters. This is done by mirroring a whole block device via (a
dedicated) network. You could see it as a network RAID 1.
Each minor device has a state, which can be 'primary' or 'secondary'.
depends on PROC_FS && INET && CONNECTOR
help
NOTE: In order to authenticate connections you have to select
CRYPTO_HMAC and a hash function as well.
DRBD is a shared-nothing, synchronously replicated block device. It
is designed to serve as a building block for high availability
clusters and in this context, is a "drop-in" replacement for shared
storage. Simplistically, you could see it as a network RAID 1.
Each minor device has a role, which can be 'primary' or 'secondary'.
On the node with the primary device the application is supposed to
run and to access the device (/dev/drbdX). Every write is sent to the
local 'lower level block device' and via network to the node with the
device in 'secondary' state.
The secondary device simply writes the data to its lower level block
device. Currently no read-balancing via the network is done.
run and to access the device (/dev/drbdX). Every write is sent to
the local 'lower level block device' and, across the network, to the
node with the device in 'secondary' state. The secondary device
simply writes the data to its lower level block device.
DRBD can also be used with "shared-disk semantics" (primary-primary),
even though it is a "shared-nothing cluster". You'd need to use a
cluster file system on top of that for cache coherency.
DRBD can also be used in dual-Primary mode (device writable on both
nodes), which means it can exhibit shared disk semantics in a
shared-nothing cluster. Needless to say, on top of dual-Primary
DRBD utilizing a cluster file system is necessary to maintain for
cache coherency.
DRBD management is done through user-space tools.
For automatic failover you need a cluster manager (e.g. heartbeat).
See also: http://www.drbd.org/, http://www.linux-ha.org
......
#CFLAGS_drbd_sizeof_sanity_check.o = -Wpadded # -Werror
drbd-objs := drbd_buildtag.o drbd_bitmap.o drbd_proc.o \
drbd_worker.o drbd_receiver.o drbd_req.o drbd_actlog.o \
lru_cache.o drbd_main.o drbd_strings.o drbd_nl.o
drbd-y := drbd_buildtag.o drbd_bitmap.o drbd_proc.o
drbd-y += drbd_worker.o drbd_receiver.o drbd_req.o drbd_actlog.o
drbd-y += lru_cache.o drbd_main.o drbd_strings.o drbd_nl.o
obj-$(CONFIG_BLK_DEV_DRBD) += drbd.o
......@@ -78,8 +78,8 @@ struct drbd_bitmap {
};
/* definition of bits in bm_flags */
#define BM_LOCKED 0
#define BM_MD_IO_ERROR (BITS_PER_LONG-1) /* 31? 63? */
#define BM_LOCKED 0
#define BM_MD_IO_ERROR 1
static inline int bm_is_locked(struct drbd_bitmap *b)
{
......@@ -148,23 +148,6 @@ void drbd_bm_unlock(struct drbd_conf *mdev)
up(&b->bm_change);
}
#define bm_end_info(ignored...) ((void)(0))
#if 0
#define catch_oob_access_start() do { \
do { \
if ((bm-p_addr) >= PAGE_SIZE/sizeof(long)) { \
printk(KERN_ALERT "drbd_bitmap.c:%u %s: p_addr:%p bm:%p %d\n", \
__LINE__ , __func__ , p_addr, bm, (bm-p_addr)); \
break; \
}
#define catch_oob_access_end() \
} while (0); } while (0)
#else
#define catch_oob_access_start() do {
#define catch_oob_access_end() } while (0)
#endif
/* word offset to long pointer */
STATIC unsigned long *__bm_map_paddr(struct drbd_bitmap *b, unsigned long offset, const enum km_type km)
{
......@@ -345,18 +328,14 @@ STATIC int bm_clear_surplus(struct drbd_bitmap *b)
p_addr = bm_map_paddr(b, w);
bm = p_addr + MLPP(w);
if (w < b->bm_words) {
catch_oob_access_start();
cleared = hweight_long(*bm & ~mask);
*bm &= mask;
catch_oob_access_end();
w++; bm++;
}
if (w < b->bm_words) {
catch_oob_access_start();
cleared += hweight_long(*bm);
*bm = 0;
catch_oob_access_end();
}
bm_unmap(p_addr);
return cleared;
......@@ -371,16 +350,12 @@ STATIC void bm_set_surplus(struct drbd_bitmap *b)
p_addr = bm_map_paddr(b, w);
bm = p_addr + MLPP(w);
if (w < b->bm_words) {
catch_oob_access_start();
*bm |= ~mask;
bm++; w++;
catch_oob_access_end();
}
if (w < b->bm_words) {
catch_oob_access_start();
*bm = ~(0UL);
catch_oob_access_end();
}
bm_unmap(p_addr);
}
......@@ -396,13 +371,11 @@ STATIC unsigned long __bm_count_bits(struct drbd_bitmap *b, const int swap_endia
p_addr = bm_map_paddr(b, offset);
bm = p_addr + MLPP(offset);
while (i--) {
catch_oob_access_start();
#ifndef __LITTLE_ENDIAN
if (swap_endian)
*bm = lel_to_cpu(*bm);
#endif
bits += hweight_long(*bm++);
catch_oob_access_end();
}
bm_unmap(p_addr);
offset += do_now;
......@@ -463,14 +436,12 @@ STATIC void bm_memset(struct drbd_bitmap *b, size_t offset, int c, size_t len)
do_now = min_t(size_t, ALIGN(offset + 1, LWPP), end) - offset;
p_addr = bm_map_paddr(b, offset);
bm = p_addr + MLPP(offset);
catch_oob_access_start();
if (bm+do_now > p_addr + LWPP) {
printk(KERN_ALERT "drbd: BUG BUG BUG! p_addr:%p bm:%p do_now:%d\n",
p_addr, bm, (int)do_now);
break; /* breaks to after catch_oob_access_end() only! */
}
memset(bm, c, do_now * sizeof(long));
catch_oob_access_end();
bm_unmap(p_addr);
offset += do_now;
}
......@@ -573,16 +544,13 @@ int drbd_bm_resize(struct drbd_conf *mdev, sector_t capacity)
p_addr = bm_map_paddr(b, words);
bm = p_addr + MLPP(words);
catch_oob_access_start();
*bm = DRBD_MAGIC;
catch_oob_access_end();
bm_unmap(p_addr);
(void)bm_clear_surplus(b);
if (!growing)
b->bm_set = bm_count_bits(b);
bm_end_info(mdev, __func__);
spin_unlock_irq(&b->bm_lock);
if (opages != npages)
vfree(opages);
......@@ -669,12 +637,10 @@ void drbd_bm_merge_lel(struct drbd_conf *mdev, size_t offset, size_t number,
bm = p_addr + MLPP(offset);
offset += do_now;
while (do_now--) {
catch_oob_access_start();
bits = hweight_long(*bm);
word = *bm | lel_to_cpu(*buffer++);
*bm++ = word;
b->bm_set += hweight_long(word) - bits;
catch_oob_access_end();
}
bm_unmap(p_addr);
}
......@@ -683,10 +649,9 @@ void drbd_bm_merge_lel(struct drbd_conf *mdev, size_t offset, size_t number,
* where we _know_ that we are 64 bit aligned,
* and know that this function is used in this way, too...
*/
if (end == b->bm_words) {
if (end == b->bm_words)
b->bm_set -= bm_clear_surplus(b);
bm_end_info(mdev, __func__);
}
spin_unlock_irq(&b->bm_lock);
}
......@@ -719,11 +684,8 @@ void drbd_bm_get_lel(struct drbd_conf *mdev, size_t offset, size_t number,
p_addr = bm_map_paddr(b, offset);
bm = p_addr + MLPP(offset);
offset += do_now;
while (do_now--) {
catch_oob_access_start();
while (do_now--)
*buffer++ = cpu_to_lel(*bm++);
catch_oob_access_end();
}
bm_unmap(p_addr);
}
}
......@@ -1249,11 +1211,8 @@ int drbd_bm_e_weight(struct drbd_conf *mdev, unsigned long enr)
int n = e-s;
p_addr = bm_map_paddr(b, s);
bm = p_addr + MLPP(s);
while (n--) {
catch_oob_access_start();
while (n--)
count += hweight_long(*bm++);
catch_oob_access_end();
}
bm_unmap(p_addr);
} else {
ERR("start offset (%d) too large in drbd_bm_e_weight\n", s);
......@@ -1288,10 +1247,8 @@ unsigned long drbd_bm_ALe_set_all(struct drbd_conf *mdev, unsigned long al_enr)
p_addr = bm_map_paddr(b, s);
bm = p_addr + MLPP(s);
while (i--) {
catch_oob_access_start();
count += hweight_long(*bm);
*bm = -1UL;
catch_oob_access_end();
bm++;
}
bm_unmap(p_addr);
......
......@@ -2,6 +2,6 @@
#include <linux/drbd_config.h>
const char *drbd_buildtag(void)
{
return "GIT-hash: c74771beb9598144d31b861e7ea966f914914c4f drbd/drbd_actlog.c drbd/drbd_bitmap.c drbd/drbd_int.h drbd/drbd_main.c drbd/drbd_receiver.c drbd/drbd_req.c drbd/drbd_worker.c"
" build by phil@fat-tyre, 2009-03-30 16:54:38";
return "GIT-hash: bbadddd7bad33396ebb8c0c12da9aab594d00c4e drbd/Makefile-2.6"
" build by phil@fat-tyre, 2009-04-01 10:29:21";
}
......@@ -325,7 +325,7 @@ void lc_changed(struct lru_cache *lc, struct lc_element *e)
lc->new_number = -1;
clear_bit(__LC_DIRTY, &lc->flags);
smp_mb__after_clear_bit();
PARANOIA_LEAVE();
RETURN();
}
......
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