[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);