[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, §or, 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, §or, 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