[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