All of lore.kernel.org
 help / color / mirror / Atom feed
From: lhh@sourceware.org <lhh@sourceware.org>
To: cluster-devel.redhat.com
Subject: [Cluster-devel] cluster/cman/qdisk Makefile README disk.c disk ...
Date: 23 Jun 2006 16:01:05 -0000	[thread overview]
Message-ID: <20060623160105.8503.qmail@sourceware.org> (raw)

CVSROOT:	/cvs/cluster
Module name:	cluster
Branch: 	RHEL4
Changes by:	lhh at sourceware.org	2006-06-23 16:01:02

Modified files:
	cman/qdisk     : Makefile README disk.c disk.h main.c 
Added files:
	cman/qdisk     : mkqdisk.c proc.c 

Log message:
	Implements 'label' support for qdisk.  Uses /proc/partitions for device
	info & scans devices for signatures.  Useful in environments where a
	device is present but maybe numbered differently on different nodes
	depending on the host/SAN configuration.
	
	Also adds initialization utility which must be run before qdiskd will
	use a given partition.

Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/cman/qdisk/mkqdisk.c.diff?cvsroot=cluster&only_with_tag=RHEL4&r1=NONE&r2=1.1.2.1
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/cman/qdisk/proc.c.diff?cvsroot=cluster&only_with_tag=RHEL4&r1=NONE&r2=1.1.2.1
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/cman/qdisk/Makefile.diff?cvsroot=cluster&only_with_tag=RHEL4&r1=1.1.2.1&r2=1.1.2.2
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/cman/qdisk/README.diff?cvsroot=cluster&only_with_tag=RHEL4&r1=1.1.2.1&r2=1.1.2.2
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/cman/qdisk/disk.c.diff?cvsroot=cluster&only_with_tag=RHEL4&r1=1.1.2.2&r2=1.1.2.3
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/cman/qdisk/disk.h.diff?cvsroot=cluster&only_with_tag=RHEL4&r1=1.1.2.1&r2=1.1.2.2
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/cman/qdisk/main.c.diff?cvsroot=cluster&only_with_tag=RHEL4&r1=1.1.2.1&r2=1.1.2.2

--- cluster/cman/qdisk/Makefile	2006/05/18 14:52:49	1.1.2.1
+++ cluster/cman/qdisk/Makefile	2006/06/23 16:01:02	1.1.2.2
@@ -19,26 +19,31 @@
 CFLAGS +=-I${incdir} -I${top_srcdir}/config \
          -Wall -Werror -Wstrict-prototypes -Wshadow -D_GNU_SOURCE -g
 
-TARGET=qdiskd
+TARGET=qdiskd mkqdisk
 
 all: ${TARGET}
 
 copytobin: all
 	cp ${TARGET} ${top_srcdir}/bin
 
-install: qdiskd
+install: ${TARGET}
 	install -d ${sbindir}
-	install qdiskd ${sbindir}
+	install ${TARGET} ${sbindir}
 
 qdiskd: disk.o crc32.o disk_util.o main.o score.o bitmap.o clulog.o \
-	gettid.o ../lib/libcman.a
+	gettid.o proc.o ../lib/libcman.a
 	gcc -o $@ $^ -lpthread -L../lib -lccs
 
+mkqdisk: disk.o crc32.o disk_util.o \
+	 proc.o mkqdisk.o
+	gcc -o $@ $^ 
+
+
 %.o: %.c
 	$(CC) -c -o $@ $^ $(INCLUDES) $(CFLAGS)
 
 clean:
-	rm -f *.o qdiskd
+	rm -f *.o ${TARGET}
 
 uninstall:
-	${UNINSTALL} qdiskd ${sbindir}
+	${UNINSTALL} ${TARGET} ${sbindir}
--- cluster/cman/qdisk/README	2006/05/18 14:52:49	1.1.2.1
+++ cluster/cman/qdisk/README	2006/06/23 16:01:02	1.1.2.2
@@ -213,8 +213,16 @@
     min_score="3"	  Absolute minimum score to be consider one's
 			  self "alive".  If omitted, or set to 0, the
 			  default function "floor((n+1)/2)" is used.
-    device="/dev/sda1"/>  This is the device the quorum daemon will use.
+    device="/dev/sda1"    This is the device the quorum daemon will use.
 			  This device must be the same on all nodes.
+    label="mylabel"/>     This overrides the device field if present.
+			  If specified, the quorum daemon will read
+			  /proc/partitions and check for qdisk signatures
+			  on every block device found, comparing the label
+			  against the specified label.  This is useful in
+			  configurations where the block device name
+			  differs on a per-node basis.
+
 
 3.2.  The <heuristic> tag
 
@@ -249,3 +257,18 @@
 * The worst-case for improperly configured quorum heuristics is a race
 to fence where two partitions simultaneously try to kill each other.
 
+3.5. Creating a quorum disk partition
+
+3.5.1. The mkqdisk utility.
+
+The mkqdisk utility can create and list currently configured quorum disks
+visible to the local node.
+
+  mkqdisk -L		List available quorum disks.
+
+  mkqdisk -f <label>	Find a quorum device by the given label.
+
+  mkqdisk -c <device> -l <label>
+			Initialize <device> and name it <label>.  This
+			will destroy all data on the device, so be careful
+			when running this command.
--- cluster/cman/qdisk/disk.c	2006/05/22 17:32:42	1.1.2.2
+++ cluster/cman/qdisk/disk.c	2006/06/23 16:01:02	1.1.2.3
@@ -336,7 +336,8 @@
 		       "diskRawReadShadow: can't seek to offset %d.\n",
 		       (int) readOffset);
 #endif
-		return ENODATA;
+		errno = ENODATA;
+		return -1;
 	}
 
 	ret = diskRawRead(fd, buf, len);
@@ -345,7 +346,8 @@
 		fprintf(stderr, "diskRawReadShadow: aligned read "
 		       "returned %d, not %d.\n", ret, len);
 #endif
-		return ENODATA;
+		errno = ENODATA;
+		return -1;
 	}
 
 	/* Decode the header portion so we can run a checksum on it. */
@@ -360,7 +362,8 @@
 		       "fd = %d offset = %d len = %d\n", fd,
 		       (int) readOffset, len);
 #endif
-		return EPROTO;
+		errno = EPROTO;
+		return -1;
 	}
 
 	return 0;
@@ -655,7 +658,7 @@
 
 
 static int
-header_init(int fd, char *clustername)
+header_init(int fd, char *label)
 {
 	quorum_header_t qh;
 
@@ -675,6 +678,9 @@
 		return -1;
 	}
 
+	/* Copy in the cluster/label name */
+	snprintf(qh.qh_cluster, sizeof(qh.qh_cluster)-1, label);
+
 	if ((qh.qh_timestamp = (uint64_t)time(NULL)) <= 0) {
 		perror("time");
 		return -1;
@@ -691,7 +697,7 @@
 
 
 int
-qdisk_init(char *partname, char *clustername)
+qdisk_init(char *partname, char *label)
 {
 	int fd;
 	status_block_t ps, wps;
@@ -710,7 +716,7 @@
 		return -1;
 	}
 
-	if (header_init(fd, clustername) < 0) {
+	if (header_init(fd, label) < 0) {
 		return -1;
 	}
 
--- cluster/cman/qdisk/disk.h	2006/05/18 14:52:49	1.1.2.1
+++ cluster/cman/qdisk/disk.h	2006/06/23 16:01:02	1.1.2.2
@@ -238,6 +238,7 @@
 	int qc_unused;
 	cman_handle_t qc_ch;
 	char *qc_device;
+	char *qc_label;
 	char *qc_status_file;
 } qd_ctx;
 
@@ -259,4 +260,10 @@
 int qd_init(qd_ctx *ctx, cman_handle_t ch, int me);
 void qd_destroy(qd_ctx *ctx);
 
+/* proc.c */
+int find_partitions(const char *partfile, const char *label,
+		    char *devname, size_t devlen, int print);
+int check_device(char *device, char *label, quorum_header_t *qh);
+
+
 #endif
--- cluster/cman/qdisk/main.c	2006/05/18 14:52:49	1.1.2.1
+++ cluster/cman/qdisk/main.c	2006/06/23 16:01:02	1.1.2.2
@@ -880,6 +880,12 @@
 		ctx->qc_device = val;
 	}
 
+	/* Get label (overrides device) */
+	snprintf(query, sizeof(query), "/cluster/quorumd/@label");
+	if (ccs_get(ccsfd, query, &val) == 0) {
+		ctx->qc_label = val;
+	}
+
 	/* Get status file */
 	snprintf(query, sizeof(query), "/cluster/quorumd/@status_file");
 	if (ccs_get(ccsfd, query, &val) == 0) {
@@ -917,6 +923,7 @@
 	node_info_t ni[MAX_NODES_DISK];
 	struct h_data h[10];
 	char debug = 0, foreground = 0;
+	char device[128];
 
 	while ((rv = getopt(argc, argv, "fd")) != EOF) {
 		switch (rv) {
@@ -958,6 +965,32 @@
 		return -1;
 	}
 
+	if (ctx.qc_label) {
+		if (find_partitions("/proc/partitions",
+				    ctx.qc_label, device,
+				    sizeof(device), 0) != 0) {
+			clulog_and_print(LOG_CRIT, "Unable to match label"
+					 " '%s' to any device\n",
+					 ctx.qc_label);
+			return -1;
+		}
+
+		if (ctx.qc_device)
+			free(ctx.qc_device);
+
+		ctx.qc_device = strdup(device);
+
+		clulog(LOG_INFO, "Quorum Partition: %s Label: %s\n",
+		       ctx.qc_device, ctx.qc_label);
+	} else if (ctx.qc_device) {
+		if (check_device(ctx.qc_device, NULL, NULL) != 0) {
+			clulog(LOG_CRIT,
+			       "Specified partition %s does not have a "
+			       "qdisk label\n", ctx.qc_device);
+			return -1;
+		}
+	}
+
 	if (!foreground)
                 daemon(0,0);
 



             reply	other threads:[~2006-06-23 16:01 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2006-06-23 16:01 lhh [this message]
  -- strict thread matches above, loose matches on Subject: below --
2006-06-23 16:02 [Cluster-devel] cluster/cman/qdisk Makefile README disk.c disk lhh
2006-06-23 16:05 lhh

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20060623160105.8503.qmail@sourceware.org \
    --to=lhh@sourceware.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.