[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