[prev in list] [next in list] [prev in thread] [next in thread]
List: ssic-linux-users
Subject: [SSI-users] SSI-1.1.x DRBD-0.7.5 patch available
From: "Roger Tsang" <perj8 () hotmail ! com>
Date: 2004-11-03 13:56:47
Message-ID: 1358.10.0.0.2.1099490207.squirrel () 10 ! 0 ! 0 ! 2
[Download RAW message or body]
I spent some time to patch the newest drbd release available for SSI FC2
kernel-2.4. The DRBD in SSI contrib cannot be rolling updated to the
latest DRBD due to API changes, so I suggest if you are going to install
DRBD try out my patch anyway.
The following patch is against the original drbd-0.7.5 source release. I
adapted most of the code from the SSI contrib drbd. I also added some
enhancements to drbdadm dump output. For some reason the SSI kernel-2.4
list.h probably doesn't match the list.h from the latest virgin
kernel-2.4, so I had to do some additional mods for the drbd kernel
modules to compile.
The patched DRBD-0.7.5 kernel modules and userspace tools compile
successfully using the SSI-1.1.0 or SSI-1.1.1 kernel-2.4 for Fedora Core
2. I am still busy testing this patch and don't have a yes/no result for
root failover yet. I'm releasing what I have now so you guys have
something to work with and can hopefully improve on it.
Enjoy,
diff -urd drbd-0.7.5/drbd/drbd_int.h drbd-ssi/drbd/drbd_int.h
--- drbd-0.7.5/drbd/drbd_int.h 2004-09-29 05:21:03.000000000 -0400
+++ drbd-ssi/drbd/drbd_int.h 2004-11-03 01:07:53.000000000 -0500
@@ -114,6 +114,9 @@
#define FALSE 0
#endif
+#ifndef CONFIG_CLMS
+#define CONFIG_CLMS 1
+#endif
#define INITIAL_BLOCK_SIZE (1<<12) // 4K
/* I don't remember why XCPU ...
@@ -1016,8 +1019,11 @@
extern void drbd_bm_unlock (drbd_dev *mdev);
#define drbd_bm_lock(mdev) __drbd_bm_lock(mdev, __FILE__, __LINE__ )
-
// drbd_main.c
+//Jai include in CONFIG_CLMS
+extern void *drbd_clms_handle;
+extern int drbd_service;
+extern clusternode_t drbd_node;
extern drbd_dev *drbd_conf;
extern int minor_count;
extern kmem_cache_t *drbd_request_cache;
diff -urd drbd-0.7.5/drbd/drbd_main.c drbd-ssi/drbd/drbd_main.c
--- drbd-0.7.5/drbd/drbd_main.c 2004-09-29 05:21:03.000000000 -0400
+++ drbd-ssi/drbd/drbd_main.c 2004-11-03 01:04:31.000000000 -0500
@@ -53,6 +53,11 @@
#include <linux/slab.h>
#include <linux/devfs_fs_kernel.h>
+#ifdef CONFIG_CLMS
+#include <cluster/nsc.h>
+#include <cluster/icsgen.h>
+#endif
+
#define __KERNEL_SYSCALLS__
#include <linux/unistd.h>
#include <linux/vmalloc.h>
@@ -154,6 +159,11 @@
STATIC int *drbd_blocksizes;
STATIC int *drbd_sizes;
)
+//Jai include in CONFIG_CLMS
+void *drbd_clms_handle;
+int drbd_service;
+clusternode_t drbd_node;
+
struct Drbd_Conf *drbd_conf;
kmem_cache_t *drbd_request_cache;
kmem_cache_t *drbd_ee_cache;
@@ -410,6 +420,31 @@
return ok;
}
+#ifdef CONFIG_CLMS
+int drbd_nodedown(void *clms_handle,
+ int service,
+ clusternode_t node,
+ clusternode_t surrogate,
+ void *private)
+{
+ int i, err;
+ drbd_clms_handle = clms_handle;
+ drbd_service = service;
+ drbd_node = node;
+
+ for (i = 0; i < minor_count; i++) {
+ drbd_dev *mdev = drbd_conf + i;
+
+ if (mdev->conf.other_nodenum == node &&
+ mdev->state == Secondary) {
+ printk("Drbd nodedown : restarting
drbd_receiver\n");
+ drbd_thread_restart_nowait(&mdev->receiver);
+ }
+ }
+ return 0;
+}
+#endif
+
#if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,14)
// daemonize was no global symbol before 2.4.14
/* in 2.4.6 is is prototyped as
@@ -1892,6 +1927,17 @@
unlock_kernel();
#endif
+#ifdef CONFIG_CLMS
+ err = register_clms_subsys("drbd",
+ -1,
+ NULL,
+ drbd_nodedown,
+ NULL,
+ NULL,
+ NULL);
+ if (err)
+ goto Enomem;
+#endif
printk(KERN_INFO DEVICE_NAME ": initialised. "
"Version: " REL_VERSION " (api:%d/proto:%d)\n",
API_VERSION,PRO_VERSION);
diff -urd drbd-0.7.5/drbd/drbd_receiver.c drbd-ssi/drbd/drbd_receiver.c
--- drbd-0.7.5/drbd/drbd_receiver.c 2004-09-21 03:28:38.000000000 -0400
+++ drbd-ssi/drbd/drbd_receiver.c 2004-11-03 01:01:52.000000000 -0500
@@ -1957,6 +1957,9 @@
{
drbd_dev *mdev = thi->mdev;
int minor = (int)(mdev-drbd_conf);
+#ifdef CONFIG_CLMS
+ int err;
+#endif
sprintf(current->comm, "drbd%d_receiver", minor);
@@ -1984,11 +1987,25 @@
else {
if (signal_pending(current)) {
drbd_flush_signals(current);
+#ifdef CONFIG_CLMS
+ // Jai: Set state to primary
+ if ((err =
down_interruptible(&mdev->device_mutex)))
+ continue;
+ printk("Set_State Primary \n");
+ err = drbd_set_state(mdev, Primary);
+ if (err)
+ printk("Primary failed with error
d: %d\n",err);
+ up(&mdev->device_mutex);
+#endif
}
spin_lock(&thi->t_lock);
D_ASSERT(thi->t_state == Restarting);
thi->t_state = Running;
spin_unlock(&thi->t_lock);
+ // Jai: Return to clms_nodedown
+ if(drbd_clms_handle)
+ clms_nodedown_callback(drbd_clms_handle,
drbd_service,
+ drbd_node);
}
}
@@ -2170,6 +2187,7 @@
current->rt_priority = 2; /* more important than all other
tasks */
while (get_t_state(thi) == Running) {
+#ifndef CONFIG_CLMS
if (test_and_clear_bit(SEND_PING, &mdev->flags)) {
ERR_IF(!drbd_send_ping(mdev)) goto err;
// half ack timeout only,
@@ -2177,6 +2195,7 @@
mdev->meta.socket->sk->SK_(rcvtimeo) =
mdev->conf.timeout*HZ/20;
}
+#endif
/* FIXME this *should* be below drbd_process_ee,
* but that leads to some distributed deadlock :-(
@@ -2211,12 +2230,14 @@
ERR("meta connection shut down by peer.\n");
goto err;
} else if (rv == -EAGAIN) {
+#ifndef CONFIG_CLMS
if( mdev->meta.socket->sk->SK_(rcvtimeo) ==
mdev->conf.timeout*HZ/20) {
ERR("PingAck did not arrive in time.\n");
goto err;
}
set_bit(SEND_PING,&mdev->flags);
+#endif
continue;
} else if (rv == -EINTR) {
continue;
@@ -2257,7 +2278,9 @@
clear_bit(SIGNAL_ASENDER, &mdev->flags);
if (mdev->cstate >= Connected)
set_cstate(mdev,NetworkFailure);
+#ifndef CONFIG_CLMS
drbd_thread_restart_nowait(&mdev->receiver);
+#endif
}
INFO("asender terminated\n");
diff -urd drbd-0.7.5/drbd/hlist.h drbd-ssi/drbd/hlist.h
--- drbd-0.7.5/drbd/hlist.h 2004-09-21 03:28:39.000000000 -0400
+++ drbd-ssi/drbd/hlist.h 2004-11-03 01:11:07.000000000 -0500
@@ -1,3 +1,17 @@
+// Roger: compile bitmap and lru_cache on FC2
+#ifdef CONFIG_CLMS
+#undef hlist_node
+#undef hlist_head
+#undef HLIST_HEAD
+#undef INIT_HLIST_HEAD
+#undef hlist_empty
+#undef hlist_del_init
+#undef hlist_entry
+#undef hlist_add_head
+#undef hlist_for_each
+#undef hlist_for_each_safe
+#endif
+
#ifndef HLIST_HEAD_INIT
#ifndef HLIST_H
#define HLIST_H
diff -urd drbd-0.7.5/drbd/linux/drbd.h drbd-ssi/drbd/linux/drbd.h
--- drbd-0.7.5/drbd/linux/drbd.h 2004-09-21 03:28:39.000000000 -0400
+++ drbd-ssi/drbd/linux/drbd.h 2004-11-03 01:09:18.000000000 -0500
@@ -79,8 +79,14 @@
struct net_config {
IN char my_addr[MAX_SOCK_ADDR];
IN int my_addr_len;
+#ifdef CONFIG_CLMS
+ IN clusternode_t my_nodenum;
+#endif /* CONFIG_CLMS */
IN char other_addr[MAX_SOCK_ADDR];
IN int other_addr_len;
+#ifdef CONFIG_CLMS
+ IN clusternode_t other_nodenum;
+#endif /* CONFIG_CLMS */
IN int timeout; // deci seconds
IN int wire_protocol;
IN int try_connect_int; /* seconds */
Only in drbd-ssi/drbd: .tmp_versions
diff -urd drbd-0.7.5/user/drbdadm.h drbd-ssi/user/drbdadm.h
--- drbd-0.7.5/user/drbdadm.h 2004-09-21 03:28:44.000000000 -0400
+++ drbd-ssi/user/drbdadm.h 2004-11-03 01:26:18.000000000 -0500
@@ -40,6 +40,9 @@
char* name;
char* device;
char* disk;
+#ifdef CONFIG_CLMS
+ char* nodenum;
+#endif /* CONFIG_CLMS */
char* address;
char* port;
char* meta_disk;
diff -urd drbd-0.7.5/user/drbdadm_main.c drbd-ssi/user/drbdadm_main.c
--- drbd-0.7.5/user/drbdadm_main.c 2004-09-21 03:28:44.000000000 -0400
+++ drbd-ssi/user/drbdadm_main.c 2004-11-03 06:30:07.000000000 -0500
@@ -43,6 +43,9 @@
#include <getopt.h>
#include <signal.h>
#include <time.h>
+#ifdef CONFIG_CLMS
+#include <sys/cluster.h>
+#endif /* CONFIG_CLMS */
#include "drbdadm.h"
@@ -208,6 +211,7 @@
printI("on %s {\n",esc(hi->name)); ++indent;
printA("device", esc(hi->device));
printA("disk" , esc(hi->disk));
+ printA("nodenum", esc(hi->nodenum));
printI(IPFMT,"address" , hi->address, hi->port);
if (!strcmp(hi->meta_index,"-1"))
printA("meta-disk", "internal");
@@ -544,7 +548,9 @@
argv[argc++]=drbdsetup;
argv[argc++]=res->me->device;
argv[argc++]="net";
+ argv[argc++]=res->me->nodenum;
ssprintf(argv[argc++],"%s:%s",res->me->address,res->me->port);
+ argv[argc++]=res->peer->nodenum;
ssprintf(argv[argc++],"%s:%s",res->peer->address,res->peer->port);
argv[argc++]=res->protocol;
opt=res->net_options;
diff -urd drbd-0.7.5/user/drbdadm_parser.y drbd-ssi/user/drbdadm_parser.y
--- drbd-0.7.5/user/drbdadm_parser.y 2004-09-21 03:28:44.000000000 -0400
+++ drbd-ssi/user/drbdadm_parser.y 2004-11-03 01:22:51.000000000 -0500
@@ -3,6 +3,7 @@
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
+#include <sys/cluster.h>
#include "drbdadm.h"
@@ -49,13 +50,19 @@
static void host_sec(char *name)
{
+ clusternode_t thisnode;
+ thisnode = clusternode_num();
+
c_host->name = name;
if (!c_host->device) derror("device");
if (!c_host->disk) derror("disk");
if (!c_host->address) derror("address");
if (!c_host->meta_disk) derror("meta-disk");
+ if (thisnode == atoi(c_host->nodenum)) {
+#if 0
if (strcmp(name, nodeinfo.nodename) == 0) {
+#endif
// if (c_res->me) error(...); -- already done by check_uniq in the
rules.
c_res->me = c_host;
} else {
@@ -118,7 +125,7 @@
%token TK_ON TK_NET TK_DISK_S TK_SYNCER TK_STARTUP
%token TK_MINOR_COUNT TK_DISABLE_IO_HINTS
%token TK_PROTOCOL TK_INCON_DEGR_CMD
-%token TK_ADDRESS TK_DISK TK_DEVICE TK_META_DISK
+%token TK_ADDRESS TK_DISK TK_NODENUM TK_DEVICE TK_META_DISK
%token <txt> TK_INTEGER TK_STRING
%token <txt> TK_ON_IO_ERROR TK_SIZE
%token <txt> TK_TIMEOUT TK_CONNECT_INT TK_PING_INT TK_MAX_BUFFERS TK_IPADDR
@@ -251,6 +258,7 @@
host_stmt: TK_DISK TK_STRING { CHKU(disk,$2); }
| TK_DEVICE TK_STRING { CHKU(device,$2); }
+ | TK_NODENUM TK_INTEGER { CHKU(nodenum,$2); }
| TK_ADDRESS ip_and_port
{ check_uniq("IP","%s:%s", c_host->address,c_host->port); }
| TK_META_DISK meta_disk_and_index { check_meta_disk(); }
diff -urd drbd-0.7.5/user/drbdadm_scanner.fl drbd-ssi/user/drbdadm_scanner.fl
--- drbd-0.7.5/user/drbdadm_scanner.fl 2004-09-21 03:28:44.000000000 -0400
+++ drbd-ssi/user/drbdadm_scanner.fl 2004-11-03 01:24:42.000000000 -0500
@@ -256,6 +256,7 @@
}
<HOST>{
+ nodenum do_assign(NUM); CP; return TK_NODENUM;
address do_assign(IP_AND_PORT); CP; return TK_ADDRESS;
device do_assign(STRING); CP; return TK_DEVICE;
{DISK} do_assign(STRING); CP; return TK_DISK;
diff -urd drbd-0.7.5/user/drbdsetup.c drbd-ssi/user/drbdsetup.c
--- drbd-0.7.5/user/drbdsetup.c 2004-09-29 05:21:04.000000000 -0400
+++ drbd-ssi/user/drbdsetup.c 2004-11-03 01:29:36.000000000 -0500
@@ -38,6 +38,9 @@
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
+#ifdef CONFIG_CLMS
+#include <sys/cluster.h>
+#endif /* CONFIG_CLMS */
#include <linux/drbd.h>
#include <linux/drbd_config.h>
#define _GNU_SOURCE
@@ -150,7 +153,13 @@
{ 0, 0, 0, 0 } } },
{"down", cmd_down, 0, 0, },
{"detach", cmd_detach, 0, 0, },
+#ifdef CONFIG_CLMS
+ {"net", cmd_net_conf, (char *[]){"local_addr","local_node",
+ "remote_addr","remote_node",
+ "protocol",0},
+#else
{"net", cmd_net_conf, (char *[]){"local_addr","remote_addr","protocol",0},
+#endif /* CONFIG_CLMS */
(struct option[]) {
{ "timeout", required_argument, 0, 't' },
{ "max-epoch-size", required_argument, 0, 'e' },
@@ -1042,11 +1051,22 @@
{
struct ioctl_net_config cn;
int retval;
+#ifdef CONFIG_CLMS
+ char *ep;
+#endif /* CONFIG_CLMS */
retval=scan_net_options(argv,argc,&cn,options);
if(retval) return retval;
+#ifdef CONFIG_CLMS
+ cn.config.my_nodenum = strtol(argv[3], &ep, 10);
+ if (*ep) return 20;
+ cn.config.other_nodenum = strtol(argv[5], &ep, 10);
+ if (*ep) return 20;
+ return do_net_conf(drbd_fd,argv[7],argv[4],argv[6],&cn);
+#else
return do_net_conf(drbd_fd,argv[5],argv[3],argv[4],&cn);
+#endif /* CONFIG_CLMS */
}
int cmd_disk_conf(int drbd_fd,char** argv,int argc,struct option *options)
diff -urd drbd-0.7.5/user/Makefile drbd-ssi/user/Makefile
--- drbd-0.7.5/user/Makefile 2004-09-21 03:28:44.000000000 -0400
+++ drbd-ssi/user/Makefile 2004-11-03 01:25:38.000000000 -0500
@@ -17,7 +17,7 @@
# the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
#
-CFLAGS = -c -Wall -I../drbd
+CFLAGS = -c -Wall -I../drbd -D CONFIG_CLMS
CC = gcc
drbdadm-obj = drbdadm_scanner.o drbdadm_parser.o drbdadm_main.o \
@@ -28,7 +28,7 @@
all: drbdsetup drbdadm
drbdadm: $(drbdadm-obj)
- $(CC) -o $@ $^
+ $(CC) -lcluster -o $@ $^
drbdadm_scanner.c: drbdadm_scanner.fl drbdadm_parser.h
flex -s -odrbdadm_scanner.c drbdadm_scanner.fl
-------------------------------------------------------
This SF.Net email is sponsored by:
Sybase ASE Linux Express Edition - download now for FREE
LinuxWorld Reader's Choice Award Winner for best database on Linux.
http://ads.osdn.com/?ad_id=5588&alloc_id=12065&op=click
_______________________________________________
Ssic-linux-users mailing list
Ssic-linux-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/ssic-linux-users
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic