[DRBD-cvs] drbd by phil; [Patch by Lars] An improved alternative ...

drbd-user@lists.linbit.com drbd-user@lists.linbit.com
Tue, 4 May 2004 17:03:07 +0200 (CEST)


DRBD CVS committal

Author  : phil
Module  : drbd

Dir     : drbd/drbd


Modified Files:
      Tag: rel-0_7-branch
	drbd_dsender.c drbd_fs.c drbd_int.h drbd_receiver.c 
	drbd_req-2.4.c 


Log Message:
[Patch by Lars]
An improved alternative to the panic() call.

===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/Attic/drbd_dsender.c,v
retrieving revision 1.1.2.100
retrieving revision 1.1.2.101
diff -u -3 -r1.1.2.100 -r1.1.2.101
--- drbd_dsender.c	4 May 2004 14:10:16 -0000	1.1.2.100
+++ drbd_dsender.c	4 May 2004 15:03:02 -0000	1.1.2.101
@@ -842,6 +842,11 @@
 	for (;;) {
 		intr = down_interruptible(&mdev->data.work.s);
 
+		if (unlikely(drbd_did_panic == DRBD_MAGIC)) {
+			set_current_state(TASK_ZOMBIE);
+			schedule(); // commit suicide
+		}
+
 		if (intr) {
 			D_ASSERT(intr == -EINTR);
 			drbd_flush_signals(current);
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/drbd_fs.c,v
retrieving revision 1.28.2.83
retrieving revision 1.28.2.84
diff -u -3 -r1.28.2.83 -r1.28.2.84
--- drbd_fs.c	4 May 2004 10:26:12 -0000	1.28.2.83
+++ drbd_fs.c	4 May 2004 15:03:02 -0000	1.28.2.84
@@ -686,6 +686,9 @@
 
 	D_ASSERT(MAJOR(inode->i_rdev) == MAJOR_NR);
 
+	if (unlikely(drbd_did_panic == DRBD_MAGIC))
+		return -EBUSY;
+
 	if( (err=down_interruptible(&mdev->device_mutex)) ) return err;
 	/*
 	 * please no 'return', use 'err = -ERRNO; goto out;'
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/drbd_int.h,v
retrieving revision 1.58.2.154
retrieving revision 1.58.2.155
diff -u -3 -r1.58.2.154 -r1.58.2.155
--- drbd_int.h	4 May 2004 13:17:23 -0000	1.58.2.154
+++ drbd_int.h	4 May 2004 15:03:02 -0000	1.58.2.155
@@ -279,6 +279,28 @@
 #define GEN_CNT_SIZE 5
 #define DRBD_MD_MAGIC (DRBD_MAGIC+3) // 3nd incarnation of the file format.
 
+#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;
+
+#if    DRBD_PANIC == 0
+#define drbd_panic(x...) panic(x)
+#elif  DRBD_PANIC == 1
+#error "sorry , this does not work, please contribute"
+#else
+#define drbd_panic(x...) do {		\
+	printk(KERN_EMERG x);		\
+	drbd_did_panic = DRBD_MAGIC;	\
+	smp_mb();			\
+	panic(x);			\
+} while (0)
+#endif
+#undef DRBD_PANIC
 
 /***
  * on the wire
@@ -968,7 +990,7 @@
 		case Panic:
 			set_bit(DISKLESS,&mdev->flags);
 			smp_mb(); // but why is there smp_mb__after_clear_bit() ?
-			panic(DEVICE_NAME" : IO error on backing device!\n");
+			drbd_panic(DEVICE_NAME" : IO error on backing device!\n");
 			break;
 		case Detach:
 			ERR("Local IO failed. Detaching...\n");
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/drbd_receiver.c,v
retrieving revision 1.97.2.139
retrieving revision 1.97.2.140
diff -u -3 -r1.97.2.139 -r1.97.2.140
--- drbd_receiver.c	4 May 2004 14:10:16 -0000	1.97.2.139
+++ drbd_receiver.c	4 May 2004 15:03:02 -0000	1.97.2.140
@@ -435,6 +435,11 @@
 	struct msghdr msg;
 	int rv;
 
+	if (unlikely(drbd_did_panic == DRBD_MAGIC)) {
+		set_current_state(TASK_ZOMBIE);
+		schedule(); // commit suicide
+	}
+
 	msg.msg_control = NULL;
 	msg.msg_controllen = 0;
 	msg.msg_iovlen = 1;
@@ -467,6 +472,11 @@
 	struct iovec iov;
 	struct msghdr msg;
 	int rv;
+
+	if (unlikely(drbd_did_panic == DRBD_MAGIC)) {
+		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.33.2.67
retrieving revision 1.33.2.68
diff -u -3 -r1.33.2.67 -r1.33.2.68
--- drbd_req-2.4.c	29 Apr 2004 14:43:27 -0000	1.33.2.67
+++ drbd_req-2.4.c	4 May 2004 15:03:02 -0000	1.33.2.68
@@ -164,6 +164,11 @@
 	int local, remote;
 	int target_area_out_of_sync = FALSE; // only relevant for reads
 
+	if (unlikely(drbd_did_panic == DRBD_MAGIC)) {
+		drbd_bio_IO_error(bio);
+		return 0;
+	}
+
 	/* FIXME
 	 * not always true, e.g. someone trying to mount on Secondary
 	 * maybe error out immediately here?
@@ -195,8 +200,8 @@
 	 */
 	req = mempool_alloc(drbd_request_mempool, GFP_DRBD);
 	if (!req) {
-		/* THINK really only pass the error to the upper layers?
-		 * maybe we should rather panic reight here?
+		/* only pass the error to the upper layers.
+		 * if user cannot handle io errors, thats not our business.
 		 */
 		ERR("could not kmalloc() req\n");
 		drbd_bio_IO_error(bio);