[DRBD-cvs] user by phil; * Replaced the "do_panic" option with on...

drbd-user@lists.linbit.com drbd-user@lists.linbit.com
Wed, 11 Feb 2004 14:25:25 +0100 (CET)


DRBD CVS committal

Author  : phil
Project : drbd
Module  : user

Dir     : drbd/user


Modified Files:
      Tag: rel-0_7-branch
	drbdadm.h drbdadm_main.c drbdadm_parser.y drbdadm_scanner.fl 
	drbdsetup.c 


Log Message:
* Replaced the "do_panic" option with
  on-io-error = { PassOn | Panic | Detach }

[ Untested; Unfinished. Need to rework the make_request funtion a bit,
  and kick out the remapping of requests to finish this. ]

===================================================================
RCS file: /var/lib/cvs/drbd/drbd/user/Attic/drbdadm.h,v
retrieving revision 1.1.2.16
retrieving revision 1.1.2.17
diff -u -3 -r1.1.2.16 -r1.1.2.17
--- drbdadm.h	9 Feb 2004 11:15:49 -0000	1.1.2.16
+++ drbdadm.h	11 Feb 2004 13:25:20 -0000	1.1.2.17
@@ -58,15 +58,23 @@
 
 extern int dry_run;
 extern char* drbdsetup;
+extern char ss_buffer[255];
 
 /* ssprintf() places the result of the printf in the current stack
    frame and sets ptr to the resulting string. If the current stack
    frame is destroyed (=function returns), the allocated memory is
    freed automatically */
 
+/*
 #define ssprintf(...) \
          ({ int _ss_size = snprintf(0, 0, ##__VA_ARGS__);        \
          char *_ss_ret = __builtin_alloca(_ss_size+1);           \
          snprintf(_ss_ret, _ss_size+1, ##__VA_ARGS__);           \
          _ss_ret; })
+#endif
+*/
+
+#define ssprintf(ptr,...) \
+  ptr=strcpy(alloca(snprintf(ss_buffer,255,##__VA_ARGS__)+1),ss_buffer)
+
 #endif
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/user/Attic/drbdadm_main.c,v
retrieving revision 1.1.2.31
retrieving revision 1.1.2.32
diff -u -3 -r1.1.2.31 -r1.1.2.32
--- drbdadm_main.c	9 Feb 2004 11:15:49 -0000	1.1.2.31
+++ drbdadm_main.c	11 Feb 2004 13:25:20 -0000	1.1.2.32
@@ -84,6 +84,7 @@
 static int sh_mod_parms(struct d_resource* ,char* );
 static int sh_ll_dev(struct d_resource* ,char* );
 
+char ss_buffer[255];
 int line=1;
 struct d_globals global_options = { 0, 0 };
 char *config_file = NULL;
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/user/Attic/drbdadm_parser.y,v
retrieving revision 1.1.2.19
retrieving revision 1.1.2.20
diff -u -3 -r1.1.2.19 -r1.1.2.20
--- drbdadm_parser.y	15 Dec 2003 15:25:53 -0000	1.1.2.19
+++ drbdadm_parser.y	11 Feb 2004 13:25:20 -0000	1.1.2.20
@@ -93,7 +93,7 @@
 %token TK_RESOURCE TK_DISK TK_NET TK_SYNCER TK_ON
 %token TK_PORT TK_DEVICE TK_ADDRESS TK_GLOBAL TK_STARTUP
 %token TK_META_DISK TK_META_INDEX
-%token <txt> TK_PROTOCOL TK_DO_PANIC
+%token <txt> TK_PROTOCOL TK_ON_IO_ERROR
 %token <txt> TK_SIZE TK_TIMEOUT TK_CONNECT_INT
 %token <txt> TK_RATE TK_USE_CSUMS TK_SKIP_SYNC TK_PING_INT
 %token <txt> TK_INTEGER TK_STRING TK_IPADDR TK_INCON_DEGR_CMD
@@ -163,7 +163,7 @@
 		| disk_stmts disk_stmt   { $$=APPEND($1,$2); }
 		;
 
-disk_stmt:        TK_DO_PANIC   { $$=new_opt($1,0); }
+disk_stmt:        TK_ON_IO_ERROR '=' TK_STRING   { $$=new_opt($1,$3); }
 		| TK_SIZE '=' TK_INTEGER   { $$=new_opt($1,$3); }
 		;
 
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/user/Attic/drbdadm_scanner.fl,v
retrieving revision 1.1.2.19
retrieving revision 1.1.2.20
diff -u -3 -r1.1.2.19 -r1.1.2.20
--- drbdadm_scanner.fl	15 Dec 2003 15:25:53 -0000	1.1.2.19
+++ drbdadm_scanner.fl	11 Feb 2004 13:25:20 -0000	1.1.2.20
@@ -59,7 +59,7 @@
 timeout          { DP; CP; return TK_TIMEOUT;            }
 ping-int         { DP; CP; return TK_PING_INT;           }
 protocol         { DP; CP; BEGIN(id); return TK_PROTOCOL;}
-do-panic         { DP; CP; return TK_DO_PANIC;           }
+on-io-error      { DP; CP; BEGIN(id); return TK_ON_IO_ERROR;}
 use-csums        { DP; CP; return TK_USE_CSUMS;          }
 skip-sync        { DP; CP; return TK_SKIP_SYNC;          }
 al-extents       { DP; CP; return TK_AL_EXTENTS;         }
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/user/drbdsetup.c,v
retrieving revision 1.54.2.21
retrieving revision 1.54.2.22
diff -u -3 -r1.54.2.21 -r1.54.2.22
--- drbdsetup.c	8 Feb 2004 12:26:14 -0000	1.54.2.21
+++ drbdsetup.c	11 Feb 2004 13:25:20 -0000	1.54.2.22
@@ -64,7 +64,7 @@
 #define DEF_MAX_BUFFERS 2048         // entries
 #define DEF_SNDBUF_SIZE (2*65535)    // ~128KB
 #define DEF_DISK_SIZE 0
-
+#define DEF_ON_IO_ERROR PassOn
 
 #if 0
 # define ioctl(X...) (fprintf(stderr,"ioctl(%s)\n",#X),0);
@@ -149,8 +149,8 @@
   {"disk", cmd_disk_conf,(char *[]){"lower_dev","meta_data_dev",
 				    "meta_data_index",0},
    (struct option[]) {
-     { "size",  required_argument,      0, 'd' },
-     { "do-panic",   no_argument,       0, 'p' },
+     { "size",       required_argument, 0, 'd' },
+     { "on-io-error",required_argument, 0, 'e' },
      { 0,            0,                 0, 0 } } },
   {"resize", cmd_disk_size,             0,
    (struct option[]) {
@@ -160,6 +160,12 @@
   {"show", cmd_show,                 0, 0, }
 };
 
+const char *eh_names[] = {
+  [PassOn] = "pass_on",
+  [Panic]  = "panic",
+  [Detach] = "detach" 
+};
+
 unsigned long resolv(const char* name)
 {
   unsigned long retval;
@@ -335,7 +341,13 @@
   for (i = 0; i < ARRY_SIZE(commands); i++)
     print_command_usage(i, 0);
 
-  printf("\nVersion: "REL_VERSION" (api:%d)\n",API_VERSION);
+  printf("\nAvailable on-io-error handlers:");
+  for(i=0;i<ARRY_SIZE(eh_names);i++) {
+    printf(" %s",eh_names[i]);
+    if(i < ARRY_SIZE(eh_names)-1) printf(",");
+  }
+    
+  printf("\n\nVersion: "REL_VERSION" (api:%d)\n",API_VERSION);
   if (addinfo)
       printf("\n%s\n",addinfo);
 
@@ -403,13 +415,13 @@
 		      struct option *options)
 {
   cn->config.disk_size = 0; /* default not known */
-  cn->config.do_panic  = 0;
+  cn->config.on_io_error = DEF_ON_IO_ERROR;
 
   if(argc==0) return 0;
 
   while(1)
     {
-      int c;
+      int c,i;
 
       PRINT_ARGV;
       c = getopt_long(argc,argv,make_optstring(options),options,0);
@@ -419,14 +431,22 @@
 	case 'd':
 	  cn->config.disk_size = m_strtol(optarg,1024);
 	  break;
-	case 'p':
-	  cn->config.do_panic=1;
-	  break;
+	case 'e':
+	  for(i=0;i<ARRY_SIZE(eh_names);i++) {
+	    if (strcmp(optarg,eh_names[i])==0) {
+	      cn->config.on_io_error=i;
+	      goto ok;
+	    }
+	  }
+	  fprintf(stderr,"%s: '%s' is an invalid on-io-error handler.\n",
+		  argv[0],optarg);
+	  return 20;
 	case 1:	// non option argument. see getopt_long(3)
 	  fprintf(stderr,"%s: Unexpected nonoption argument '%s'\n",argv[0],optarg);
 	case '?':
 	  return 20;
 	}
+    ok:
     }
   return 0;
 }
@@ -1097,7 +1117,9 @@
 
   printf("Disk options:\n");
   if( cn.disk_size_user ) printf(" size = %d KB\n",cn.disk_size_user);
-  if( cn.do_panic ) printf(" do-panic\n");
+  if( cn.on_io_error != DEF_ON_IO_ERROR) {
+    printf(" on-io-error = %s\n",eh_names[cn.on_io_error]);
+  }
 
   if( cn.cstate < Unconnected ) return 0;