[DRBD-cvs] r1632 - in trunk: . drbd user

svn at svn.drbd.org svn at svn.drbd.org
Sat Nov 6 13:29:41 CET 2004


Author: lars
Date: 2004-11-06 13:29:38 +0100 (Sat, 06 Nov 2004)
New Revision: 1632

Modified:
   trunk/
   trunk/Makefile
   trunk/drbd/Makefile-2.6
   trunk/drbd/drbd_sizeof_sanity_check.c
   trunk/user/drbd_limits.h
   trunk/user/drbdmeta.c
   trunk/user/drbdtool_common.c
Log:
consolidated global vars into the "struct format" of drbdmeta

added some comments

no more -Werror for drbd_sizeof_sanity_check.c, seems like some archs have a
problem with that in the implicitly included linux/types.h.
still, warnings about padding of drbd structs are BAD,
and should be fixed immediately (if they ever occur again).



Property changes on: trunk
___________________________________________________________________
Name: propagate:at
   - 1617
   + 1632

Modified: trunk/Makefile
===================================================================
--- trunk/Makefile	2004-11-06 09:31:13 UTC (rev 1631)
+++ trunk/Makefile	2004-11-06 12:29:38 UTC (rev 1632)
@@ -120,7 +120,7 @@
 .PHONY: .filelist
 .filelist:
 	@ svn info >/dev/null || { echo "you need a svn checkout to do this." ; false ; }
-	@find $$(svn st -v | sed '/^?/d;s/^.\{8\} \+[0-9]\+ \+[0-9]\+ [a-z]\+ *//;') \
+	@find $$(svn st -vq | sed 's/^.\{8\} \+[0-9]\+ \+[0-9]\+ [a-z]\+ *//;') \
 	\! -type d -maxdepth 0 |\
 	sed 's:^:drbd-$(DIST_VERSION)/:' > .filelist
 	@[ -s .filelist ] # assert there is something in .filelist now

Modified: trunk/drbd/Makefile-2.6
===================================================================
--- trunk/drbd/Makefile-2.6	2004-11-06 09:31:13 UTC (rev 1631)
+++ trunk/drbd/Makefile-2.6	2004-11-06 12:29:38 UTC (rev 1632)
@@ -1,4 +1,4 @@
-CFLAGS_drbd_sizeof_sanity_check.o = -Wpadded -Werror
+CFLAGS_drbd_sizeof_sanity_check.o = -Wpadded # -Werror
 
 drbd-objs  :=	drbd_sizeof_sanity_check.o \
 		drbd_buildtag.o drbd_bitmap.o drbd_fs.o drbd_proc.o \

Modified: trunk/drbd/drbd_sizeof_sanity_check.c
===================================================================
--- trunk/drbd/drbd_sizeof_sanity_check.c	2004-11-06 09:31:13 UTC (rev 1631)
+++ trunk/drbd/drbd_sizeof_sanity_check.c	2004-11-06 12:29:38 UTC (rev 1632)
@@ -8,8 +8,7 @@
 #define SZO(type,size) \
 	s = sizeof(type); \
 	if (s != size) { \
-		printk("<3>sizeof(" #type "): %d != %d; " \
-			"ioctls won't work, aborting\n", s, size); \
+		printk("<3>sizeof(" #type "): %d != %d\n", s, size); \
 		err = -1; \
 	}
 
@@ -24,5 +23,6 @@
 	SZO(struct ioctl_syncer_config,	 32)
 	SZO(struct ioctl_wait,		 16)
 	SZO(struct ioctl_get_config,	432)
+	if (err) printk("<3>ioctls won't work, aborting\n");
 	return err;
 }

Modified: trunk/user/drbd_limits.h
===================================================================
--- trunk/user/drbd_limits.h	2004-11-06 09:31:13 UTC (rev 1631)
+++ trunk/user/drbd_limits.h	2004-11-06 12:29:38 UTC (rev 1632)
@@ -13,7 +13,7 @@
 #ifndef DRBD_LIMITS_H
 #define DRBD_LIMITS_H 1
 
-#define DEBUG_RANGE_CHECK 1
+#define DEBUG_RANGE_CHECK 0
 
 #define RANGE(what,min,max) \
 const unsigned long long DRBD_ ## what ## _MIN = (min); \

Modified: trunk/user/drbdmeta.c
===================================================================
--- trunk/user/drbdmeta.c	2004-11-06 09:31:13 UTC (rev 1631)
+++ trunk/user/drbdmeta.c	2004-11-06 12:29:38 UTC (rev 1632)
@@ -371,9 +371,14 @@
 struct format_ops;
 
 struct format {
-	struct format_ops *ops;
-	char *device_name;	/* well, in 06 it is file name */
-	int fd;
+	const struct format_ops *ops;
+	char *md_device_name;	/* well, in 06 it is file name */
+	char *drbd_dev_name;
+	int lock_fd;
+	int drbd_fd;
+	int ll_fd;
+	int md_fd;
+
 	/* byte offset of our "super block", within fd */
 	u64 md_offset;
 
@@ -403,6 +408,12 @@
 	} on_disk;
 };
 
+/* - parse is expected to exit() if it does not work out.
+ * - open is expected to mmap the respective on_disk members,
+ *   and copy the "superblock" meta data into the struct mem_cpu
+ * FIXME describe rest of them, and when they should exit,
+ * return error or success.
+ */
 struct format_ops {
 	const char *name;
 	char **args;
@@ -506,11 +517,6 @@
 	{"set-gc", ":::VAL:VAL:...", meta_set_gc, 0},
 };
 
-char *progname = 0;
-int drbd_fd = -1;
-int lock_fd = -1;
-char *drbd_dev_name;
-
 /*
  * generic helpers
  */
@@ -650,7 +656,7 @@
 		fprintf(stderr, "asprintf() failed.\n");
 		exit(20);
 	};
-	cfg->device_name = e;
+	cfg->md_device_name = e;
 
 	*ai += 1;
 
@@ -661,27 +667,27 @@
 {
 	struct stat sb;
 
-	cfg->fd = open(cfg->device_name, O_RDWR);
+	cfg->md_fd = open(cfg->md_device_name, O_RDWR);
 
-	if (cfg->fd == -1) {
-		PERROR("open(%s) failed", cfg->device_name);
+	if (cfg->md_fd == -1) {
+		PERROR("open(%s) failed", cfg->md_device_name);
 		return -1;
 	}
 
-	if (fstat(cfg->fd, &sb)) {
+	if (fstat(cfg->md_fd, &sb)) {
 		PERROR("fstat() failed");
 		return -1;
 	}
 
 	if (!S_ISREG(sb.st_mode)) {
 		fprintf(stderr, "'%s' is not a plain file!\n",
-			cfg->device_name);
+			cfg->md_device_name);
 		return -1;
 	}
 
 	cfg->on_disk.md6 =
 	    mmap(NULL, sizeof(struct md_on_disk_06), PROT_READ | PROT_WRITE,
-		 MAP_SHARED, cfg->fd, 0);
+		 MAP_SHARED, cfg->md_fd, 0);
 	if (cfg->on_disk.md6 == NULL) {
 		PERROR("mmap(md_on_disk) failed");
 		return -1;
@@ -700,11 +706,11 @@
 		PERROR("munmap(md_on_disk) failed");
 		return -1;
 	}
-	if (fsync(cfg->fd) == -1) {
+	if (fsync(cfg->md_fd) == -1) {
 		PERROR("fsync() failed");
 		return -1;
 	}
-	if (close(cfg->fd)) {
+	if (close(cfg->md_fd)) {
 		PERROR("close() failed");
 		return -1;
 	}
@@ -734,7 +740,7 @@
 	u64 offset;
 
 	if (cfg->md_index == -1) {
-		offset = (bdev_size(cfg->fd) & ~((1 << 12) - 1))
+		offset = (bdev_size(cfg->md_fd) & ~((1 << 12) - 1))
 		    - MD_RESERVED_SIZE_07;
 	} else {
 		offset = MD_RESERVED_SIZE_07 * cfg->md_index;
@@ -777,12 +783,12 @@
 		return -1;
 	}
 
-	cfg->device_name = strdup(argv[0]);
+	cfg->md_device_name = strdup(argv[0]);
 	e = argv[1];
 	index = strtol(argv[1], &e, 0);
 	if (*e != 0 || -1 > index || index > 255) {
 		fprintf(stderr, "'%s' is not a valid index number.\n", argv[1]);
-		exit(20);
+		return -1;
 	}
 	cfg->md_index = index;
 
@@ -797,25 +803,25 @@
 	unsigned long words;
 	u64 offset, al_offset, bm_offset;
 
-	cfg->fd = open(cfg->device_name, O_RDWR);
+	cfg->md_fd = open(cfg->md_device_name, O_RDWR);
 
-	if (cfg->fd == -1) {
-		PERROR("open(%s) failed", cfg->device_name);
+	if (cfg->md_fd == -1) {
+		PERROR("open(%s) failed", cfg->md_device_name);
 		exit(20);
 	}
 
-	if (fstat(cfg->fd, &sb)) {
-		PERROR("fstat(%s) failed", cfg->device_name);
+	if (fstat(cfg->md_fd, &sb)) {
+		PERROR("fstat(%s) failed", cfg->md_device_name);
 		exit(20);
 	}
 
 	if (!S_ISBLK(sb.st_mode)) {
 		fprintf(stderr, "'%s' is not a block device!\n",
-			cfg->device_name);
+			cfg->md_device_name);
 		exit(20);
 	}
 
-	if (ioctl(cfg->fd, BLKFLSBUF) == -1) {
+	if (ioctl(cfg->md_fd, BLKFLSBUF) == -1) {
 		PERROR("ioctl(,BLKFLSBUF,) failed");
 		exit(20);
 	}
@@ -823,7 +829,7 @@
 	offset = v07_offset(cfg);
 	cfg->on_disk.md7 =
 	    mmap(NULL, sizeof(struct md_on_disk_07), PROT_READ | PROT_WRITE,
-		 MAP_SHARED, cfg->fd, offset);
+		 MAP_SHARED, cfg->md_fd, offset);
 	if (cfg->on_disk.md7 == NULL) {
 		PERROR("mmap(md_on_disk) failed");
 		exit(20);
@@ -839,14 +845,14 @@
 
 	cfg->on_disk.al =
 	    mmap(NULL, MD_AL_MAX_SIZE_07 * 512, PROT_READ | PROT_WRITE,
-		 MAP_SHARED, cfg->fd, al_offset);
+		 MAP_SHARED, cfg->md_fd, al_offset);
 	if (cfg->on_disk.al == NULL) {
 		PERROR("mmap(al_on_disk) failed");
 		exit(20);
 	}
 
 	cfg->on_disk.bm = mmap(NULL, MD_BM_MAX_SIZE_07, PROT_READ | PROT_WRITE,
-			       MAP_SHARED, cfg->fd, bm_offset);
+			       MAP_SHARED, cfg->md_fd, bm_offset);
 	if (cfg->on_disk.bm == NULL) {
 		PERROR("mmap(bm_on_disk) failed");
 		exit(20);
@@ -876,15 +882,15 @@
 		PERROR("munmap(md_on_disk) failed");
 		return -1;
 	}
-	if (fsync(cfg->fd) == -1) {
+	if (fsync(cfg->md_fd) == -1) {
 		PERROR("fsync() failed");
 		return -1;
 	}
-	if (ioctl(cfg->fd, BLKFLSBUF) == -1) {
+	if (ioctl(cfg->md_fd, BLKFLSBUF) == -1) {
 		PERROR("ioctl(,BLKFLSBUF,) failed");
 		return -1;
 	}
-	if (close(cfg->fd)) {
+	if (close(cfg->md_fd)) {
 		PERROR("close() failed");
 		return -1;
 	}
@@ -916,7 +922,7 @@
 	if (cfg->on_disk.al == NULL) {
 		cfg->on_disk.al =
 		    mmap(NULL, MD_AL_MAX_SIZE_07 * 512, PROT_READ | PROT_WRITE,
-			 MAP_SHARED, cfg->fd, al_offset);
+			 MAP_SHARED, cfg->md_fd, al_offset);
 		if (cfg->on_disk.al == NULL) {
 			PERROR("mmap(al_on_disk) failed");
 			exit(20);
@@ -926,7 +932,7 @@
 	if (cfg->on_disk.bm == NULL) {
 		cfg->on_disk.bm =
 		    mmap(NULL, MD_BM_MAX_SIZE_07, PROT_READ | PROT_WRITE,
-			 MAP_SHARED, cfg->fd, bm_offset);
+			 MAP_SHARED, cfg->md_fd, bm_offset);
 		if (cfg->on_disk.bm == NULL) {
 			PERROR("mmap(bm_on_disk) failed");
 			exit(20);
@@ -996,7 +1002,7 @@
 	if (cfg->on_disk.al == NULL) {
 		cfg->on_disk.al =
 		    mmap(NULL, MD_AL_MAX_SIZE_07 * 512, PROT_READ | PROT_WRITE,
-			 MAP_SHARED, cfg->fd, al_offset);
+			 MAP_SHARED, cfg->md_fd, al_offset);
 		if (cfg->on_disk.al == NULL) {
 			PERROR("mmap(al_on_disk) failed");
 			exit(20);
@@ -1006,7 +1012,7 @@
 	if (cfg->on_disk.bm == NULL) {
 		cfg->on_disk.bm =
 		    mmap(NULL, MD_BM_MAX_SIZE_07, PROT_READ | PROT_WRITE,
-			 MAP_SHARED, cfg->fd, bm_offset);
+			 MAP_SHARED, cfg->md_fd, bm_offset);
 		if (cfg->on_disk.bm == NULL) {
 			PERROR("mmap(bm_on_disk) failed");
 			exit(20);
@@ -1278,6 +1284,81 @@
 	return err;
 }
 
+#if 0
+int meta_set_size(struct format *cfg, char **argv, int argc)
+{
+	struct md_cpu tmp;
+	unsigned long long kB, ll_kB;
+	int err;
+	char **str;
+
+#warning	"sorry, not yet correctly implemented"
+	fprintf(stderr,	"sorry, not yet correctly implemented\n");
+	exit(30);
+	if (argc > 1) {
+		fprintf(stderr, "Ignoring additional arguments\n");
+	}
+	if (argc < 1) {
+		fprintf(stderr, "Required Argument missing\n");
+		exit(10);
+	}
+
+	if (cfg->ops->open(cfg))
+		return -1;
+
+	ll_kB = bdev_size(cfg->drbd_fd) >> 10;
+
+	/* FIXME make flexible for v08
+	 * new method vXY_max_dev_sect? */
+	if (cfg->md_index == -1) {
+		if (ll_kB < (MD_RESERVED_SIZE_07>>10)) {
+			fprintf(stderr, "device too small for internal meta data\n");
+			exit(20);
+		}
+		ll_kB = ALIGN(ll_kB,4) - (MD_RESERVED_SIZE_07 >> 10);
+	}
+
+	kB = m_strtoll(argv[0],'k');
+	if (kB > ll_kB) {
+		fprintf(stderr,
+			"%s out of range, maximum available %llukB.\n",
+			argv[0], ll_kB);
+		exit(20);
+	}
+	tmp = cfg->md;
+	tmp.la_sect = kB<<1;
+
+	printf("available   %llukB\n", ll_kB);
+	printf("previously  %llukB\n", cfg->md.la_sect>>1);
+	printf("size set to %llukB\n", kB);
+
+	if (!confirmed("Write new size to disk?")) {
+		printf("Operation cancelled.\n");
+		exit(0);
+	}
+
+	if (cfg->on_disk.bm) {
+		u64 a,b,ll;
+		a = cfg->md.la_sect;
+		b = tmp.la_sect;
+		/* convert sectors to bit numbers */
+		a >>= 8;
+		b = (b+7) >> 8;
+		if (b > a) {
+			/* first word */
+		}
+	}
+	cfg->md = tmp;
+	err = cfg->ops->md_cpu_to_disk(cfg)
+	    || cfg->ops->close(cfg);
+	if (err)
+		fprintf(stderr, "update failed\n");
+
+	return err;
+}
+#endif
+
+char *progname = NULL;
 void print_usage()
 {
 	char **args;
@@ -1309,14 +1390,13 @@
 	exit(0);
 }
 
-struct format *parse_format(char **argv, int argc, int *ai)
+int parse_format(struct format *cfg, char **argv, int argc, int *ai)
 {
-	struct format *cfg;
 	enum Known_Formats f;
 
 	if (argc < 1) {
 		fprintf(stderr, "Format identifier missing\n");
-		exit(20);
+		return -1;
 	}
 
 	for (f = Drbd_06; f < Drbd_Unknown; f++) {
@@ -1325,16 +1405,13 @@
 	}
 	if (f == Drbd_Unknown) {
 		fprintf(stderr, "Unknown format '%s'.\n", argv[0]);
-		exit(20);
+		return -1;
 	}
 
 	(*ai)++;
 
-	cfg = calloc(1, sizeof(struct format));
 	cfg->ops = f_ops + f;
-	cfg->ops->parse(cfg, argv + 1, argc - 1, ai);
-
-	return cfg;
+	return cfg->ops->parse(cfg, argv + 1, argc - 1, ai);
 }
 
 int main(int argc, char **argv)
@@ -1352,25 +1429,32 @@
 	if (argc < 4)
 		print_usage();
 
-	ai = 1;
-	drbd_dev_name = argv[ai++];
-	drbd_fd = dt_lock_open_drbd(drbd_dev_name, &lock_fd, 1);
-	if (drbd_fd > -1) {
+	/* FIXME should have a "drbd_cfg_new" and a "drbd_cfg_free"
+	 * function, maybe even a "get" and "put" ?
+	 */
+	cfg = calloc(1, sizeof(struct format));
+	cfg->drbd_dev_name = argv[1];
+	cfg->drbd_fd = dt_lock_open_drbd(cfg->drbd_dev_name, &cfg->lock_fd, 1);
+	if (cfg->drbd_fd > -1) {
 		/* avoid DRBD specific ioctls here...
 		 * If the device is _not_ configured, block device ioctls
 		 * should fail. So if we _can_ determine whether it is readonly,
 		 * it is configured; and we better not touch its meta data.
 		 */
 		int dummy_is_ro;
-		if (ioctl(drbd_fd, BLKROGET, &dummy_is_ro) == 0) {
+		if (ioctl(cfg->drbd_fd, BLKROGET, &dummy_is_ro) == 0) {
 			fprintf(stderr, "Device '%s' is configured!\n",
-				drbd_dev_name);
+				cfg->drbd_dev_name);
 			exit(20);
 		}
 	}
 
-	/* implicit cfg = calloc */
-	cfg = parse_format(argv + ai, argc - ai, &ai);
+	/* argv[0] is progname, argv[1] was drbd_dev_name. */
+	ai = 2;
+	if (parse_format(cfg, argv + ai, argc - ai, &ai)) {
+		/* parse has already printed some error message */
+		exit(20);
+	}
 
 	if (ai >= argc) {
 		fprintf(stderr, "command missing\n");
@@ -1392,6 +1476,6 @@
 	return command->function(cfg, argv + ai, argc - ai);
 	/* and if we want an explicit free,
 	 * this would be the place for it.
-	 * free(cfg->device_name), free(cfg) ...
+	 * free(cfg->md_device_name), free(cfg) ...
 	 */
 }

Modified: trunk/user/drbdtool_common.c
===================================================================
--- trunk/user/drbdtool_common.c	2004-11-06 09:31:13 UTC (rev 1631)
+++ trunk/user/drbdtool_common.c	2004-11-06 12:29:38 UTC (rev 1632)
@@ -208,6 +208,11 @@
       exit(20);
     }
 
+  /* FIXME maybe check the major number, too?
+   * you cannot be paranoid enough...
+   * either NBD [43], or DRBD [147] (enforce for v08)
+   */
+
   /* THINK.
    * maybe we should also place a fcntl lock on the
    * _physical_device_ we open later...
@@ -219,8 +224,15 @@
    * pretending it belongs to an other, you'll screw up completely.
    *
    * We should store something in the meta data to detect such abuses.
+   * Philipp, see my suggestion for "/var/lib/drbd/drbd-toc",
+   * or /etc/drbd/ for that matter ...
    */
 
+  /* NOTE that /var/lock/drbd-*-* may not be "secure",
+   * maybe we should rather use /var/lock/drbd/drbd-*-*,
+   * and make sure that /var/lock/drbd is drwx.-..-. root:root  ...
+   */
+
   snprintf(lfname,39,"/var/lock/drbd-%d-%d",
 	   major(drbd_stat.st_rdev),minor(drbd_stat.st_rdev));
 



More information about the drbd-cvs mailing list