[DRBD-cvs] r1603 - trunk/user

svn at svn.drbd.org svn at svn.drbd.org
Tue Oct 19 17:06:11 CEST 2004


Author: phil
Date: 2004-10-19 17:06:08 +0200 (Tue, 19 Oct 2004)
New Revision: 1603

Modified:
   trunk/user/drbdadm_main.c
   trunk/user/drbdmeta.c
Log:
* drbdadm knows about set-gc now, although the order
  of the arguments seems to be strange:
  drbdadm -- ::14 set-gc all
  drbdadm ::14 set-gc r0   works as well

* Implemented the missing initialization of the AL 
  are in drbdmeta

* create-md tries to not overwrite existing meta-data,
  ander offer the user to convert older meta-data.

* Added the ioctl(,BLKFLSBUF,) calls to drbdmeta.



Modified: trunk/user/drbdadm_main.c
===================================================================
--- trunk/user/drbdadm_main.c	2004-10-19 11:50:05 UTC (rev 1602)
+++ trunk/user/drbdadm_main.c	2004-10-19 15:06:08 UTC (rev 1603)
@@ -137,6 +137,7 @@
   { "show-gc",           admm_generic, "show-gc"         ,1,1 },
   { "get-gc",            admm_generic, "get-gc"          ,1,1 },
   { "dump-md",           admm_generic, "dump-md"         ,1,1 },
+  { "set-gc",            admm_generic, "set-gc"          ,0,1 },
   { "wait_con_int",      adm_wait_ci, 0                  ,1,0 },
   { "sh-resources",      sh_resources,0                  ,0,0 },
   { "sh-mod-parms",      sh_mod_parms,0                  ,0,0 },
@@ -505,7 +506,7 @@
 static int admm_generic(struct d_resource* res ,char* cmd)
 {
   char* argv[20];
-  int argc=0;
+  int argc=0,i;
 
   argv[argc++]=drbdmeta;
   argv[argc++]=res->me->device;
@@ -517,9 +518,13 @@
   }
   argv[argc++]=res->me->meta_index;
   argv[argc++]=cmd;
+  for(i=0;i<soi;i++) {
+    argv[argc++]=setup_opts[i];
+  }
+
   argv[argc++]=0;
 
-  return m_system(argv,SLEEPS_SHORT);
+  return m_system(argv,SLEEPS_VERY_LONG);
 }
 
 static int adm_generic(struct d_resource* res,char* cmd,int flags)
@@ -1115,7 +1120,8 @@
 
   if ( optind == argc ) print_usage();
 
-  while(argv[optind][0]=='-') {
+  while(argv[optind][0]=='-' || argv[optind][0]==':' || 
+	isdigit(argv[optind][0]) ) {
     setup_opts[soi++]=argv[optind++];
     if (optind == argc) print_usage();
   }

Modified: trunk/user/drbdmeta.c
===================================================================
--- trunk/user/drbdmeta.c	2004-10-19 11:50:05 UTC (rev 1602)
+++ trunk/user/drbdmeta.c	2004-10-19 15:06:08 UTC (rev 1603)
@@ -307,6 +307,11 @@
 		return 0;
 	}
 
+	if( ioctl(cfg->fd,BLKFLSBUF) == -1) {
+		PERROR("ioctl(,BLKFLSBUF,) failed");
+		return 0;
+	}
+
 	return 1;
 }
 
@@ -314,6 +319,16 @@
 {
 	struct format_07* cfg = &config->d.f07;
 
+	if( fsync(cfg->fd) == -1) {
+		PERROR("fsync() failed");
+		return 0;
+	}
+
+	if( ioctl(cfg->fd,BLKFLSBUF) == -1) {
+		PERROR("ioctl(,BLKFLSBUF,) failed");
+		return 0;
+	}
+
 	return close(cfg->fd) == 0;
 }
 
@@ -438,7 +453,20 @@
 	from_lel(m->bitmap, m->bm_size/sizeof(long) );
 
 	if( init_al ) {
-		/* TODO; */
+		char sector[512] = { [ 0 ... 511 ] = 0 };
+
+		if(lseek64(cfg->fd,offset+512*MD_AL_OFFSET_07, SEEK_SET)==-1) {
+			PERROR("lseek() failed");
+			return 0;
+		}
+
+		for (i = 0; i < MD_AL_MAX_SIZE_07; i++) {
+			rr = write(cfg->fd, &sector, 512);
+			if(rr != 512) {
+				PERROR("write failed");
+				return 0;
+			}
+		}
 	}
 
 	return 1;
@@ -557,7 +585,20 @@
 	from_lel(m->bitmap, m->bm_size/sizeof(long) );
 
 	if( init_al ) {
-		/* TODO; */
+		char sector[512] = { [ 0 ... 511 ] = 0 };
+
+		if(lseek64(cfg->fd,offset+512*MD_AL_OFFSET_07, SEEK_SET)==-1) {
+			PERROR("lseek() failed");
+			return 0;
+		}
+
+		for (i = 0; i < MD_AL_MAX_SIZE_07; i++) {
+			rr = write(cfg->fd, &sector, 512);
+			if(rr != 512) {
+				PERROR("write failed");
+				return 0;
+			}
+		}
 	}
 
 	return 1;
@@ -694,39 +735,43 @@
  ******************************************/
 
 struct format_ops formats[] = {
-	{ "v06",
-	  (char *[]) { "minor", 0 },
-	  sizeof(struct format_06),
-	  v06_parse,
-	  v06_open,
-	  v06_close,
-	  v06_md_alloc,
-	  v06_read,
-	  v06_write
-	},
-	{ "v07",
-	  (char *[]) { "device","index",0 },
-	  sizeof(struct format_07),
-	  v07_parse,
-	  v07_open,
-	  v07_close,
-	  v07_md_alloc,
-	  v07_read,
-	  v07_write
-	},
-	{ "v08",
-	  (char *[]) { "device","index",0 },
-	  sizeof(struct format_07),
-	  v07_parse,
-	  v07_open,
-	  v07_close,
-	  v07_md_alloc,
-	  v08_read,
-	  v08_write
+	{ 
+		"v06",
+		(char *[]) { "minor", 0 },
+		sizeof(struct format_06),
+		v06_parse,
+		v06_open,
+		v06_close,
+		v06_md_alloc,
+		v06_read,
+		v06_write
+	}, { 
+		"v07",
+		(char *[]) { "device","index",0 },
+		sizeof(struct format_07),
+		v07_parse,
+		v07_open,
+		v07_close,
+		v07_md_alloc,
+		v07_read,
+		v07_write
+	}, { 
+		"v08",
+		(char *[]) { "device","index",0 },
+		sizeof(struct format_07),
+		v07_parse,
+		v07_open,
+		v07_close,
+		v07_md_alloc,
+		v08_read,
+		v08_write
 	}
-
 };
 
+struct format_ops *fops_v06 = formats+0;
+struct format_ops *fops_v07 = formats+1;
+struct format_ops *fops_v08 = formats+2;
+
 struct meta_cmd {
 	const char* name;
 	const char* args;
@@ -813,6 +858,33 @@
 	return 0;
 }
 
+int m_convert_md(struct format * , struct format * );
+
+struct format * dup_v07(struct format * fcfg)
+{
+	struct format * new;
+
+	new = malloc(fops_v07->conf_size + sizeof(void*) );
+	new->ops = fops_v07;
+	new->d.f07.fd = 0;
+	new->d.f07.device_name = fcfg->d.f07.device_name;
+	new->d.f07.index = fcfg->d.f07.index;
+	
+	return new;
+}
+
+int ask(char *text)
+{
+	char answer[200];
+	int rr;
+
+	printf("%s [yes/no] ",text);
+
+	rr = scanf("%s",answer);
+
+	return !strcmp(answer,"yes");
+}
+
 int meta_create_md(struct format * fcfg, char** argv, int argc )
 {
 	struct meta_data* md;
@@ -821,9 +893,33 @@
 		fprintf(stderr,"Ignoring additional arguments\n");
 	}
 
+	OR_EXIT(fcfg,open);
+
 	md = fcfg->ops->md_alloc();
 
-	OR_EXIT(fcfg,open);
+	/* Hackisch but efficient, knows details about v07 and v08 */
+	if( fcfg->ops == fops_v08 ) {
+		if(fops_v07->read(fcfg,md)) {
+			if(ask("Valid v07 meta-data found, convert?")) {
+				md_free(md);
+				return m_convert_md(dup_v07(fcfg), fcfg);
+			}
+			goto question2;
+		}
+	}
+
+	if(fcfg->ops->read(fcfg,md)) {
+	question2:
+		if(!ask("Valid meta-data already in place, create new?")) {
+			printf("Operation cancelled.\n");
+			exit(0);
+		}
+	}
+
+	printf("Creating meta data...\n");
+
+	md_free(md);
+	md = fcfg->ops->md_alloc();
 	OR_EXIT(fcfg,write,md,1);
 	OR_EXIT(fcfg,close);
 
@@ -832,24 +928,20 @@
 	return 0;
 }
 
-struct format* parse_format(char** argv, int argc, int* ai);
-
-int meta_convert_md(struct format * fcfg, char** argv, int argc )
+int m_convert_md(struct format * source, struct format * target)
 {
-	struct format * target;
 	struct meta_data* md;
-	int unused;
 
-	target = parse_format(argv, argc, &unused );
-
 	md = target->ops->md_alloc();
 
-	OR_EXIT(fcfg,open);
-	OR_EXIT(fcfg,read,md);
-	OR_EXIT(fcfg,close);
+	printf("Converting meta data...\n");
 
+	OR_EXIT(source,open);
+	OR_EXIT(source,read,md);
+	OR_EXIT(source,close);
+
 	OR_EXIT(target,open);
-	OR_EXIT(target,write,md,1); /* init_al = 1 ?!? */
+	OR_EXIT(target,write,md,0);
 	OR_EXIT(target,close);
 
 	md_free(md);
@@ -857,6 +949,18 @@
 	return 0;
 }
 
+struct format* parse_format(char** argv, int argc, int* ai);
+
+int meta_convert_md(struct format * fcfg, char** argv, int argc )
+{
+	struct format * target;
+	int unused;
+
+	target = parse_format(argv, argc, &unused );
+
+	return m_convert_md(fcfg, target);
+}
+
 int meta_dump_md(struct format * fcfg, char** argv, int argc )
 {
 	struct meta_data* md;



More information about the drbd-cvs mailing list