[prev in list] [next in list] [prev in thread] [next in thread] 

List:       drbd-cvs
Subject:    [DRBD-cvs] drbd by lars; adding the panic patch, which was floati...
From:       drbd-cvs () linbit ! com
Date:       2004-04-28 7:57:20
Message-ID: 20040428075720.33DB115DF5F () garcon ! linbit ! com
[Download RAW message or body]

DRBD CVS committal

Author  : lars
Module  : drbd

Dir     : drbd/drbd


Modified Files:
	Makefile drbd_int.h drbd_main.c drbd_receiver.c drbd_req-2.4.c 


Log Message:
adding the panic patch, which was floating around since ages :)
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/Makefile,v
retrieving revision 1.30
retrieving revision 1.31
diff -u -3 -r1.30 -r1.31
--- Makefile	11 Mar 2004 11:51:28 -0000	1.30
+++ Makefile	28 Apr 2004 07:57:15 -0000	1.31
@@ -140,4 +140,8 @@
 	[ -e $(LINUX)/System.map ] && \
 	   /sbin/depmod -F $(LINUX)/System.map -e ./drbd.o 2>&1 >/dev/null || true
   endif
+
+  depmod: drbd.o
+	[ -e $(LINUX)/System.map ] && \
+	   /sbin/depmod -F $(LINUX)/System.map -e ./drbd.o 2>&1 >/dev/null || true
 endif
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/drbd_int.h,v
retrieving revision 1.79
retrieving revision 1.80
diff -u -3 -r1.79 -r1.80
--- drbd_int.h	6 Apr 2004 09:14:12 -0000	1.79
+++ drbd_int.h	28 Apr 2004 07:57:15 -0000	1.80
@@ -144,6 +144,39 @@
 #define RQ_DRBD_WRITTEN   0xf300
 #define RQ_DRBD_READ      0xf500
 
+
+#define DRBD_PANIC 2
+/* do_panic alternatives:
+ *	0: panic();
+ *	1: machine_halt; SORRY, this DOES NOT WORK
+ *	2: prink(EMERG ), plus flag to fail all eventual drbd IO, plus panic()
+ */
+
+extern volatile int drbd_did_panic;
+
+#include <linux/reboot.h>
+
+#if    DRBD_PANIC == 0
+#define drbd_panic(x...) panic(x)
+#elif  DRBD_PANIC == 1
+/* sorry , this does not work */
+#define drbd_panic(x...) do {						\
+	printk(KERN_EMERG x);						\
+	notifier_call_chain(&reboot_notifier_list, SYS_HALT, NULL);	\
+	printk(KERN_EMERG "System halted.\n");				\
+	machine_halt();							\
+	do_exit(0);							\
+} while (0)
+#else
+#define drbd_panic(x...) do {	\
+	printk(KERN_EMERG x);	\
+	drbd_did_panic = 1;	\
+	smp_mb();		\
+	panic(x);		\
+} while (0)
+#endif
+#undef DRBD_PANIC
+
 /* This is the layout for a packet on the wire!
  * The byteorder is the network byte order!
  */
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/drbd_main.c,v
retrieving revision 1.92
retrieving revision 1.93
diff -u -3 -r1.92 -r1.93
--- drbd_main.c	6 Apr 2004 09:14:12 -0000	1.92
+++ drbd_main.c	28 Apr 2004 07:57:15 -0000	1.93
@@ -113,6 +113,8 @@
 int minor_count=2;
 int disable_io_hints=0;
 
+volatile int drbd_did_panic = 0;
+
 #if LINUX_VERSION_CODE > KERNEL_VERSION(2,3,40)
 STATIC struct block_device_operations drbd_ops = {
 #if LINUX_VERSION_CODE > KERNEL_VERSION(2,4,9)
@@ -772,7 +774,7 @@
 
 	if ( !drop_it ) {
 		printk(KERN_ERR DEVICE_NAME
-		       "%d: [%s/%d] sock_sendmsg time expired, ko = %u\n",
+		       "%d: [%s/%d] sock_sendmsg timeout count down: ko=%u\n",
 		       (int)(mdev-drbd_conf), task->comm, task->pid,
 		       mdev->ko_count);
 	}
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/drbd_receiver.c,v
retrieving revision 1.136
retrieving revision 1.137
diff -u -3 -r1.136 -r1.137
--- drbd_receiver.c	6 Apr 2004 09:14:12 -0000	1.136
+++ drbd_receiver.c	28 Apr 2004 07:57:15 -0000	1.137
@@ -43,7 +43,6 @@
 #include <linux/smp_lock.h>
 #include <linux/pkt_sched.h>
 #define __KERNEL_SYSCALLS__
-#include <linux/unistd.h>
 #include "drbd.h"
 #include "drbd_int.h"
 
@@ -163,7 +162,7 @@
 	if( !uptodate ) {
 		int minor = (int)(mdev-drbd_conf);
 		if ( mdev->do_panic ) {
-			panic(DEVICE_NAME
+			drbd_panic(DEVICE_NAME
 			      "%d: The lower-level device (%d:%d)"
 			      " had an error. bnr=%lu bsz=%u BSZ=%u\n",
 			      minor,
@@ -612,6 +611,11 @@
 	struct idle_timer_info ti;
 	int rv;
 	struct socket *sock = via_msock ? mdev->msock : mdev->sock;
+
+	if (drbd_did_panic) {
+		set_current_state(TASK_ZOMBIE);
+		schedule(); // commit suicide
+	}
 
 	msg.msg_control = NULL;
 	msg.msg_controllen = 0;
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/drbd_req-2.4.c,v
retrieving revision 1.39
retrieving revision 1.40
diff -u -3 -r1.39 -r1.40
--- drbd_req-2.4.c	28 Nov 2003 08:32:52 -0000	1.39
+++ drbd_req-2.4.c	28 Apr 2004 07:57:15 -0000	1.40
@@ -112,7 +112,7 @@
 	req->bh->b_end_io(req->bh,uptodate & req->rq_status);
 
 	if( mdev->do_panic && !(uptodate & req->rq_status) ) {
-		panic(DEVICE_NAME": The lower-level device had an error.\n");
+		drbd_panic(DEVICE_NAME": The lower-level device had an error.\n");
 	}
 
 	kfree(req); /* frees also the temporary bh */
@@ -140,7 +140,18 @@
 	int size_kb, bnr, send_ok;
 	unsigned long flags;
 
-	if(mdev->cstate < StandAlone || MINOR(bh->b_rdev) >= minor_count) {
+	if (   mdev->cstate < StandAlone
+	    || mdev->state != Primary
+	    || MINOR(bh->b_rdev) >= minor_count
+	    || drbd_did_panic )
+	{
+		if (mdev->state != Primary) {
+			printk(KERN_EMERG DEVICE_NAME
+			       "%d: not in Primary state, "
+			       "failing IO-request [%s/%d]\n",
+			       (int)(mdev-drbd_conf),
+			       current->comm,current->pid);
+		}
 		buffer_IO_error(bh);
 		return 0;
 	}



[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic