cluster: RHEL55 - clogd: Fix rhbz#544253: lvcreate mirrored volume panics all cluster ...
by Jonathan Brassow
Gitweb: http://git.fedorahosted.org/git/cluster.git?p=cluster.git;a=commitdiff;h=...
Commit: 953a56b67037afe26dfcb8f01549041fc88e170d
Parent: d9c1b3a5e50fadac385ee01aa00c57b2f58adbcc
Author: Jonathan Brassow <jbrassow(a)redhat.com>
AuthorDate: Wed Mar 3 09:29:52 2010 -0600
Committer: Jonathan Brassow <jbrassow(a)redhat.com>
CommitterDate: Wed Mar 3 09:33:34 2010 -0600
clogd: Fix rhbz#544253: lvcreate mirrored volume panics all cluster ...
Two bug fixes for 5.5 where colliding to cause this issue. In one previous
bug fix, the version number of the communication structure used between
kernel and userspace was checked for a mismatch. If a mismatch was found,
an error was sent to the kernel to abandon the creation of the mirror. The
other bug fix (the original fix for 544253) addressed a list member that
wasn't being removed from the list before the memory was freed on an error
condition.
If the user had booted an older kernel (one that didn't contain the
original fix for 544253) /and/ had the updated userspace package that would
reject communication if there was a version mismatch, the panic that
544253 was meant to fix would actually be forced - every time!
This update causing the version checking could to complain about a mismatch
but tolerate it. This way, we don't panic the machine if a user is forced
to use an older kernel without the original fix for 544253.
---
cmirror/src/local.c | 10 ++++------
1 files changed, 4 insertions(+), 6 deletions(-)
diff --git a/cmirror/src/local.c b/cmirror/src/local.c
index 4d4800b..3e6d74a 100644
--- a/cmirror/src/local.c
+++ b/cmirror/src/local.c
@@ -184,6 +184,7 @@ static int kernel_send_helper(void *data, int out_size)
*/
static int do_local_work(void *data)
{
+ static int version_complain = 0;
int r;
struct clog_tfr *tfr = NULL;
@@ -194,13 +195,10 @@ static int do_local_work(void *data)
if (!tfr)
return 0;
- if (tfr->private[0] != CLOG_TFR_VERSION) {
+ if ((tfr->private[0] != CLOG_TFR_VERSION) && !version_complain) {
+ version_complain = 1;
LOG_ERROR("Kernel/Userspace version mismatch!");
- tfr->data_size = 0;
- tfr->error = -EINVAL;
- kernel_send(tfr);
-
- return tfr->error;
+ LOG_ERROR("Kernel module, dm-log-clustered, is not up-to-date");
}
LOG_DBG("[%s] Request from kernel received: [%s/%u]",
14 years, 2 months
gfs2-utils: master - gfs2: GFS2 utilities should make use of exported device topology
by Bob Peterson
Gitweb: http://git.fedorahosted.org/git/gfs2-utils.git?p=gfs2-utils.git;a=commitd...
Commit: a8f852725fb3deb0f74f75daeb7eab631f8db8e9
Parent: c4b41dc01efd1ebbdbe2b6337543a0ff43bcefa5
Author: Bob Peterson <rpeterso(a)redhat.com>
AuthorDate: Tue Mar 2 08:46:35 2010 -0600
Committer: Bob Peterson <rpeterso(a)redhat.com>
CommitterDate: Tue Mar 2 08:53:34 2010 -0600
gfs2: GFS2 utilities should make use of exported device topology
This patch uses ioctls to fetch device topology information for
the devices and uses it to validate and default block sizes in
rgrps.
rhbz#519491
---
gfs2/libgfs2/device_geometry.c | 38 +++++++++++++++++++++-
gfs2/libgfs2/libgfs2.h | 10 ++++++
gfs2/mkfs/main_mkfs.c | 69 +++++++++++++++++++++++++++++++++++-----
3 files changed, 108 insertions(+), 9 deletions(-)
diff --git a/gfs2/libgfs2/device_geometry.c b/gfs2/libgfs2/device_geometry.c
index bb13e46..b1ffdc3 100644
--- a/gfs2/libgfs2/device_geometry.c
+++ b/gfs2/libgfs2/device_geometry.c
@@ -10,10 +10,46 @@
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
-
+#include <sys/ioctl.h>
#include <linux/types.h>
+
#include "libgfs2.h"
+#define BLKSSZGET _IO(0x12,104) /* logical_block_size */
+#define BLKIOMIN _IO(0x12,120) /* minimum_io_size */
+#define BLKIOOPT _IO(0x12,121) /* optimal_io_size */
+#define BLKALIGNOFF _IO(0x12,122) /* alignment_offset */
+#define BLKPBSZGET _IO(0x12,123) /* physical_block_size */
+
+/**
+ * device_topology - Get the device topology
+ * Values not fetched are returned as zero.
+ */
+int device_topology(struct gfs2_sbd *sdp)
+{
+ if (ioctl(sdp->device_fd, BLKSSZGET, &sdp->logical_block_size) < 0)
+ sdp->logical_block_size = 0;
+ if (ioctl(sdp->device_fd, BLKIOMIN, &sdp->minimum_io_size) < 0)
+ sdp->minimum_io_size = 0;
+ if (ioctl(sdp->device_fd, BLKALIGNOFF, &sdp->optimal_io_size) < 0)
+ sdp->optimal_io_size = 0;
+ if (ioctl(sdp->device_fd, BLKIOOPT, &sdp->alignment_offset) < 0)
+ sdp->alignment_offset = 0;
+ if (ioctl(sdp->device_fd, BLKPBSZGET, &sdp->physical_block_size) < 0)
+ sdp->physical_block_size = 0;
+ if (!sdp->debug)
+ return 0;
+
+ printf("\nDevice Topology:\n");
+ printf(" Logical block size: %u\n", sdp->logical_block_size);
+ printf(" Physical block size: %u\n", sdp->physical_block_size);
+ printf(" Minimum I/O size: %u\n", sdp->minimum_io_size);
+ printf(" Optimal I/O size: %u (0 means unknown)\n",
+ sdp->optimal_io_size);
+ printf(" Alignment offset: %u\n", sdp->alignment_offset);
+ return 0;
+}
+
/**
* device_geometry - Get the size of a device
* @w: the command line
diff --git a/gfs2/libgfs2/libgfs2.h b/gfs2/libgfs2/libgfs2.h
index 6aa9e2d..f98f845 100644
--- a/gfs2/libgfs2/libgfs2.h
+++ b/gfs2/libgfs2/libgfs2.h
@@ -235,6 +235,15 @@ struct gfs2_sbd {
int metafs_fd;
char metafs_path[PATH_MAX]; /* where metafs is mounted */
struct special_blocks eattr_blocks;
+
+ /* device topology information: */
+ uint32_t logical_block_size;
+ uint32_t minimum_io_size;
+ uint32_t optimal_io_size;
+ uint32_t alignment_offset;
+ uint32_t physical_block_size;
+ uint64_t rg_one_length;
+ uint64_t rg_length;
};
struct metapath {
@@ -376,6 +385,7 @@ extern int brelse(struct gfs2_buffer_head *bh);
#define bcommit(bl) do { __bcommit(bl, __LINE__, __FUNCTION__); } while(0)
/* device_geometry.c */
+extern int device_topology(struct gfs2_sbd *sdp);
extern int device_geometry(struct gfs2_sbd *sdp);
extern int fix_device_geometry(struct gfs2_sbd *sdp);
diff --git a/gfs2/mkfs/main_mkfs.c b/gfs2/mkfs/main_mkfs.c
index 80a718c..9250663 100644
--- a/gfs2/mkfs/main_mkfs.c
+++ b/gfs2/mkfs/main_mkfs.c
@@ -18,6 +18,7 @@
#include <signal.h>
#include <sys/time.h>
#include <libintl.h>
+
#define _(String) gettext(String)
#include <linux/types.h>
@@ -191,7 +192,8 @@ static void decode_arguments(int argc, char *argv[], struct gfs2_sbd *sdp)
if (sdp->debug) {
printf( _("Command Line Arguments:\n"));
- printf(" bsize = %u\n", sdp->bsize);
+ if (sdp->bsize != -1)
+ printf(" bsize = %u\n", sdp->bsize);
printf(" qcsize = %u\n", sdp->qcsize);
printf(" jsize = %u\n", sdp->jsize);
printf(" journals = %u\n", sdp->md.journals);
@@ -258,12 +260,10 @@ static void test_locking(char *lockproto, char *locktable)
}
}
-static void verify_arguments(struct gfs2_sbd *sdp)
+static void verify_bsize(struct gfs2_sbd *sdp)
{
unsigned int x;
-
- if (!sdp->expert)
- test_locking(sdp->lockproto, sdp->locktable);
+ char input[32];
/* Block sizes must be a power of two from 512 to 65536 */
@@ -271,9 +271,38 @@ static void verify_arguments(struct gfs2_sbd *sdp)
if (x == sdp->bsize)
break;
- if (!x || sdp->bsize > 65536)
- die( _("block size must be a power of two between 512 and 65536\n"));
+ if (!x || sdp->bsize > getpagesize())
+ die( _("block size must be a power of two between 512 and "
+ "%d\n"), getpagesize());
+ if (sdp->bsize < sdp->logical_block_size) {
+ die( _("Error: Block size %d is less than minimum logical "
+ "block size (%d).\n"), sdp->bsize,
+ sdp->logical_block_size);
+ }
+
+ if (sdp->bsize < sdp->physical_block_size) {
+ printf( _("WARNING: Block size %d is inefficient because it "
+ "is less than the physical block size (%d).\n"),
+ sdp->bsize, sdp->physical_block_size);
+ if (sdp->override)
+ return;
+
+ printf( _("\nAre you sure you want to proceed? [y/n] "));
+ if(!fgets(input, 32, stdin))
+ die( _("unable to read from stdin\n"));
+
+ if (input[0] != 'y')
+ die( _("aborted\n"));
+ else
+ printf("\n");
+ }
+}
+
+static void verify_arguments(struct gfs2_sbd *sdp)
+{
+ if (!sdp->expert)
+ test_locking(sdp->lockproto, sdp->locktable);
/* Look at this! Why can't we go bigger than 2GB? */
if (sdp->expert) {
if (1 > sdp->rgsize || sdp->rgsize > 2048)
@@ -553,7 +582,7 @@ void main_mkfs(int argc, char *argv[])
unsigned char uuid[16];
memset(sdp, 0, sizeof(struct gfs2_sbd));
- sdp->bsize = GFS2_DEFAULT_BSIZE;
+ sdp->bsize = -1;
sdp->jsize = GFS2_DEFAULT_JSIZE;
sdp->rgsize = -1;
sdp->utsize = GFS2_DEFAULT_UTSIZE;
@@ -580,6 +609,30 @@ void main_mkfs(int argc, char *argv[])
if (!sdp->override)
are_you_sure(sdp);
+ if (device_topology(sdp)) {
+ fprintf(stderr, _("Device topology error\n"));
+ exit(-1);
+ }
+
+ if (sdp->bsize == -1) {
+ /* See if optimal_io_size (the biggest I/O we can submit
+ without incurring a penalty) is a suitable block size. */
+ if (sdp->optimal_io_size <= getpagesize() &&
+ sdp->optimal_io_size >= sdp->minimum_io_size)
+ sdp->bsize = sdp->optimal_io_size;
+ /* See if physical_block_size (the smallest unit we can write
+ without incurring read-modify-write penalty) is suitable. */
+ else if (sdp->physical_block_size <= getpagesize() &&
+ sdp->physical_block_size >= GFS2_DEFAULT_BSIZE)
+ sdp->bsize = sdp->physical_block_size;
+ else
+ sdp->bsize = GFS2_DEFAULT_BSIZE;
+
+ if (sdp->debug)
+ printf("\nUsing block size: %u\n", sdp->bsize);
+ }
+ verify_bsize(sdp);
+
if (compute_constants(sdp)) {
fprintf(stderr, _("Bad constants (1)\n"));
exit(-1);
14 years, 2 months
cluster: STABLE3 - gfs2: GFS2 utilities should make use of exported device topology
by Bob Peterson
Gitweb: http://git.fedorahosted.org/git/cluster.git?p=cluster.git;a=commitdiff;h=...
Commit: ff524561ca1684696a7e1a5526edb108b78324f2
Parent: 463a731a9396385a46d2ec5736bfe7ba687968b3
Author: Bob Peterson <rpeterso(a)redhat.com>
AuthorDate: Tue Mar 2 08:46:35 2010 -0600
Committer: Bob Peterson <rpeterso(a)redhat.com>
CommitterDate: Tue Mar 2 08:50:35 2010 -0600
gfs2: GFS2 utilities should make use of exported device topology
This patch uses ioctls to fetch device topology information for
the devices and uses it to validate and default block sizes in
rgrps.
rhbz#519491
---
gfs2/libgfs2/device_geometry.c | 38 +++++++++++++++++++++-
gfs2/libgfs2/libgfs2.h | 10 ++++++
gfs2/mkfs/main_mkfs.c | 69 +++++++++++++++++++++++++++++++++++-----
3 files changed, 108 insertions(+), 9 deletions(-)
diff --git a/gfs2/libgfs2/device_geometry.c b/gfs2/libgfs2/device_geometry.c
index b2d5861..a05ae94 100644
--- a/gfs2/libgfs2/device_geometry.c
+++ b/gfs2/libgfs2/device_geometry.c
@@ -8,10 +8,46 @@
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
-
+#include <sys/ioctl.h>
#include <linux/types.h>
+
#include "libgfs2.h"
+#define BLKSSZGET _IO(0x12,104) /* logical_block_size */
+#define BLKIOMIN _IO(0x12,120) /* minimum_io_size */
+#define BLKIOOPT _IO(0x12,121) /* optimal_io_size */
+#define BLKALIGNOFF _IO(0x12,122) /* alignment_offset */
+#define BLKPBSZGET _IO(0x12,123) /* physical_block_size */
+
+/**
+ * device_topology - Get the device topology
+ * Values not fetched are returned as zero.
+ */
+int device_topology(struct gfs2_sbd *sdp)
+{
+ if (ioctl(sdp->device_fd, BLKSSZGET, &sdp->logical_block_size) < 0)
+ sdp->logical_block_size = 0;
+ if (ioctl(sdp->device_fd, BLKIOMIN, &sdp->minimum_io_size) < 0)
+ sdp->minimum_io_size = 0;
+ if (ioctl(sdp->device_fd, BLKALIGNOFF, &sdp->optimal_io_size) < 0)
+ sdp->optimal_io_size = 0;
+ if (ioctl(sdp->device_fd, BLKIOOPT, &sdp->alignment_offset) < 0)
+ sdp->alignment_offset = 0;
+ if (ioctl(sdp->device_fd, BLKPBSZGET, &sdp->physical_block_size) < 0)
+ sdp->physical_block_size = 0;
+ if (!sdp->debug)
+ return 0;
+
+ printf("\nDevice Topology:\n");
+ printf(" Logical block size: %u\n", sdp->logical_block_size);
+ printf(" Physical block size: %u\n", sdp->physical_block_size);
+ printf(" Minimum I/O size: %u\n", sdp->minimum_io_size);
+ printf(" Optimal I/O size: %u (0 means unknown)\n",
+ sdp->optimal_io_size);
+ printf(" Alignment offset: %u\n", sdp->alignment_offset);
+ return 0;
+}
+
/**
* device_geometry - Get the size of a device
* @w: the command line
diff --git a/gfs2/libgfs2/libgfs2.h b/gfs2/libgfs2/libgfs2.h
index 6aa9e2d..f98f845 100644
--- a/gfs2/libgfs2/libgfs2.h
+++ b/gfs2/libgfs2/libgfs2.h
@@ -235,6 +235,15 @@ struct gfs2_sbd {
int metafs_fd;
char metafs_path[PATH_MAX]; /* where metafs is mounted */
struct special_blocks eattr_blocks;
+
+ /* device topology information: */
+ uint32_t logical_block_size;
+ uint32_t minimum_io_size;
+ uint32_t optimal_io_size;
+ uint32_t alignment_offset;
+ uint32_t physical_block_size;
+ uint64_t rg_one_length;
+ uint64_t rg_length;
};
struct metapath {
@@ -376,6 +385,7 @@ extern int brelse(struct gfs2_buffer_head *bh);
#define bcommit(bl) do { __bcommit(bl, __LINE__, __FUNCTION__); } while(0)
/* device_geometry.c */
+extern int device_topology(struct gfs2_sbd *sdp);
extern int device_geometry(struct gfs2_sbd *sdp);
extern int fix_device_geometry(struct gfs2_sbd *sdp);
diff --git a/gfs2/mkfs/main_mkfs.c b/gfs2/mkfs/main_mkfs.c
index 50e3550..eff2c9a 100644
--- a/gfs2/mkfs/main_mkfs.c
+++ b/gfs2/mkfs/main_mkfs.c
@@ -16,6 +16,7 @@
#include <signal.h>
#include <sys/time.h>
#include <libintl.h>
+
#define _(String) gettext(String)
#include <linux/types.h>
@@ -189,7 +190,8 @@ static void decode_arguments(int argc, char *argv[], struct gfs2_sbd *sdp)
if (sdp->debug) {
printf( _("Command Line Arguments:\n"));
- printf(" bsize = %u\n", sdp->bsize);
+ if (sdp->bsize != -1)
+ printf(" bsize = %u\n", sdp->bsize);
printf(" qcsize = %u\n", sdp->qcsize);
printf(" jsize = %u\n", sdp->jsize);
printf(" journals = %u\n", sdp->md.journals);
@@ -256,12 +258,10 @@ static void test_locking(char *lockproto, char *locktable)
}
}
-static void verify_arguments(struct gfs2_sbd *sdp)
+static void verify_bsize(struct gfs2_sbd *sdp)
{
unsigned int x;
-
- if (!sdp->expert)
- test_locking(sdp->lockproto, sdp->locktable);
+ char input[32];
/* Block sizes must be a power of two from 512 to 65536 */
@@ -269,9 +269,38 @@ static void verify_arguments(struct gfs2_sbd *sdp)
if (x == sdp->bsize)
break;
- if (!x || sdp->bsize > 65536)
- die( _("block size must be a power of two between 512 and 65536\n"));
+ if (!x || sdp->bsize > getpagesize())
+ die( _("block size must be a power of two between 512 and "
+ "%d\n"), getpagesize());
+ if (sdp->bsize < sdp->logical_block_size) {
+ die( _("Error: Block size %d is less than minimum logical "
+ "block size (%d).\n"), sdp->bsize,
+ sdp->logical_block_size);
+ }
+
+ if (sdp->bsize < sdp->physical_block_size) {
+ printf( _("WARNING: Block size %d is inefficient because it "
+ "is less than the physical block size (%d).\n"),
+ sdp->bsize, sdp->physical_block_size);
+ if (sdp->override)
+ return;
+
+ printf( _("\nAre you sure you want to proceed? [y/n] "));
+ if(!fgets(input, 32, stdin))
+ die( _("unable to read from stdin\n"));
+
+ if (input[0] != 'y')
+ die( _("aborted\n"));
+ else
+ printf("\n");
+ }
+}
+
+static void verify_arguments(struct gfs2_sbd *sdp)
+{
+ if (!sdp->expert)
+ test_locking(sdp->lockproto, sdp->locktable);
/* Look at this! Why can't we go bigger than 2GB? */
if (sdp->expert) {
if (1 > sdp->rgsize || sdp->rgsize > 2048)
@@ -551,7 +580,7 @@ void main_mkfs(int argc, char *argv[])
unsigned char uuid[16];
memset(sdp, 0, sizeof(struct gfs2_sbd));
- sdp->bsize = GFS2_DEFAULT_BSIZE;
+ sdp->bsize = -1;
sdp->jsize = GFS2_DEFAULT_JSIZE;
sdp->rgsize = -1;
sdp->utsize = GFS2_DEFAULT_UTSIZE;
@@ -578,6 +607,30 @@ void main_mkfs(int argc, char *argv[])
if (!sdp->override)
are_you_sure(sdp);
+ if (device_topology(sdp)) {
+ fprintf(stderr, _("Device topology error\n"));
+ exit(-1);
+ }
+
+ if (sdp->bsize == -1) {
+ /* See if optimal_io_size (the biggest I/O we can submit
+ without incurring a penalty) is a suitable block size. */
+ if (sdp->optimal_io_size <= getpagesize() &&
+ sdp->optimal_io_size >= sdp->minimum_io_size)
+ sdp->bsize = sdp->optimal_io_size;
+ /* See if physical_block_size (the smallest unit we can write
+ without incurring read-modify-write penalty) is suitable. */
+ else if (sdp->physical_block_size <= getpagesize() &&
+ sdp->physical_block_size >= GFS2_DEFAULT_BSIZE)
+ sdp->bsize = sdp->physical_block_size;
+ else
+ sdp->bsize = GFS2_DEFAULT_BSIZE;
+
+ if (sdp->debug)
+ printf("\nUsing block size: %u\n", sdp->bsize);
+ }
+ verify_bsize(sdp);
+
if (compute_constants(sdp)) {
fprintf(stderr, _("Bad constants (1)\n"));
exit(-1);
14 years, 2 months
cluster: the annotated tag cluster-3.0.9 has been created
by Fabio M. Di Nitto
Gitweb: http://git.fedorahosted.org/git/cluster.git?p=cluster.git;a=commitdiff;h=...
Commit: 4bbf3a369207584a47cb0210e5091f2070244cc7
Parent: 0000000000000000000000000000000000000000
Author: Fabio M. Di Nitto <fdinitto(a)redhat.com>
AuthorDate: 2010-03-02 09:07 +0000
Committer: Fabio M. Di Nitto <fdinitto(a)redhat.com>
CommitterDate: 2010-03-02 09:07 +0000
annotated tag: cluster-3.0.9 has been created
at 4bbf3a369207584a47cb0210e5091f2070244cc7 (tag)
tagging 463a731a9396385a46d2ec5736bfe7ba687968b3 (commit)
replaces cluster-3.0.8
cluster-3.0.9 release
Abhijith Das (2):
gfs2_quota: fix uninitialized fiemap flags
Merge branch 'STABLE3' of ssh://git.fedoraproject.org/git/cluster into mySTABLE3
Bob Peterson (2):
GFS2: libgfs2: build_rgrps was not attaching bh's properly
gfs2: fix regressions from performance fixes
Fabio M. Di Nitto (2):
build: fix publishing of tags to git
qdiskd: Enable master_wins intelligently
Lon Hohberger (4):
qdiskd: Dynamic votes
qdisk: Make configuration errors fatal during startup
qdiskd: Reject invalid vote counts
resource-agents: Clear vm.sh default
Steven Whitehouse (1):
gfs2: man page updates
14 years, 2 months
cluster: STABLE3 - qdiskd: Enable master_wins intelligently
by Fabio M. Di Nitto
Gitweb: http://git.fedorahosted.org/git/cluster.git?p=cluster.git;a=commitdiff;h=...
Commit: 463a731a9396385a46d2ec5736bfe7ba687968b3
Parent: 1b02c28d6b10fc2bef9016b956dd474d72f99a1b
Author: Fabio M. Di Nitto <fdinitto(a)redhat.com>
AuthorDate: Tue Mar 2 06:27:51 2010 +0100
Committer: Fabio M. Di Nitto <fdinitto(a)redhat.com>
CommitterDate: Tue Mar 2 06:27:51 2010 +0100
qdiskd: Enable master_wins intelligently
In two node clusters with no heuristics, running
qdiskd is useless unless master_wins is set.
This patch enables master_wins by default in this
case.
In order to use this mode automatically on start
up:
* the quorumd 'votes' parameter must be unset
* there must be exactly two nodes in the cluster
* there must be no heuristics configured
If enabled automatically during startup, this mode
will later be disabled if the quorum disk's vote count
changes. This can occur by:
* adding a host to the cluster
* setting the 'votes' parameter to a value other
than '1'.
Signed-off-by: Lon Hohberger <lhh(a)redhat.com>
Signed-off-by: Fabio M. Di Nitto <fdinitto(a)redhat.com>
---
cman/man/qdisk.5 | 10 ++++++++--
cman/qdisk/disk.h | 4 +++-
cman/qdisk/main.c | 22 ++++++++++++++++++++++
3 files changed, 33 insertions(+), 3 deletions(-)
diff --git a/cman/man/qdisk.5 b/cman/man/qdisk.5
index 7004f01..efa3638 100644
--- a/cman/man/qdisk.5
+++ b/cman/man/qdisk.5
@@ -73,7 +73,7 @@ the amount of synchronous I/O contention on the shared quorum disk.
* Cluster node IDs must be statically configured in cluster.conf and
must be numbered from 1..16 (there can be gaps, of course).
-* Cluster node votes should all be 1.
+* Cluster node votes must all be 1.
* CMAN must be running before the qdisk program can operate in full
capacity. If CMAN is not running, qdisk will wait for it.
@@ -91,7 +91,7 @@ been explored.
* For 'tiebreaker' operation in a two-node cluster, unset CMAN's two_node
flag (or set it to 0), set CMAN's expected votes to '3', set each node's
-vote to '1', and set qdisk's vote count to '1' as well. This will allow
+vote to '1', and leave qdisk's vote count unset. This will allow
the cluster to operate if either both nodes are online, or a single node &
the heuristics.
@@ -300,6 +300,12 @@ This option only takes effect if there are no heuristics
configured. Usage of this option in configurations with more than
two cluster nodes is undefined and should not be done.
+In a two-node cluster with no heuristics and no defined vote
+count (see above), this mode is turned by default. If enabled in
+this way at startup and a node is later added to the cluster
+configuration or the vote count is set to a value other than 1, this
+mode will be disabled.
+
.in 9
\fIallow_kill\fP\fB="\fP1\fB"\fP
.in 12
diff --git a/cman/qdisk/disk.h b/cman/qdisk/disk.h
index 8678ca7..93d15fe 100644
--- a/cman/qdisk/disk.h
+++ b/cman/qdisk/disk.h
@@ -55,7 +55,9 @@ typedef enum {
RF_UPTIME = 0x20,
RF_CMAN_LABEL = 0x40,
RF_IOTIMEOUT = 0x80,
- RF_MASTER_WINS = 0x100
+ RF_MASTER_WINS = 0x100,
+ RF_AUTO_VOTES = 0x200,
+ RF_AUTO_MASTER_WINS = 0x400
} run_flag_t;
diff --git a/cman/qdisk/main.c b/cman/qdisk/main.c
index 81218d0..4d1c411 100644
--- a/cman/qdisk/main.c
+++ b/cman/qdisk/main.c
@@ -1526,6 +1526,7 @@ get_dynamic_config_data(qd_ctx *ctx, int ccsfd)
/* Get votes */
if (ctx->qc_config) {
old_votes = ctx->qc_votes;
+ ctx->qc_flags &= ~RF_AUTO_VOTES;
}
snprintf(query, sizeof(query), "/cluster/quorumd/@votes");
@@ -1546,6 +1547,8 @@ get_dynamic_config_data(qd_ctx *ctx, int ccsfd)
/* During startup, this is fatal */
return -1;
}
+ } else {
+ ctx->qc_flags |= RF_AUTO_VOTES;
}
}
@@ -1553,6 +1556,12 @@ get_dynamic_config_data(qd_ctx *ctx, int ccsfd)
logt_print(LOG_DEBUG, "Changing vote count from %d to %d\n",
old_votes, ctx->qc_votes);
+ if (ctx->qc_flags & RF_AUTO_MASTER_WINS) {
+ logt_print(LOG_DEBUG, "Vote count changed! "
+ "Disabling master-wins\n");
+ ctx->qc_flags &= ~(RF_MASTER_WINS|RF_AUTO_MASTER_WINS);
+ }
+
/*
* This is done in main() normally. Here, we are
* reconfiguring _only_ the votes at this point. The
@@ -1789,6 +1798,19 @@ get_config_data(qd_ctx *ctx, struct h_data *h, int maxh, int *cfh)
logt_print(LOG_WARNING, "Master-wins mode disabled\n");
ctx->qc_flags &= ~RF_MASTER_WINS;
}
+ } else {
+ if (ctx->qc_flags & RF_AUTO_VOTES &&
+ !(ctx->qc_flags & RF_MASTER_WINS) &&
+ ctx->qc_votes == 1) {
+ /* Two node cluster, no heuristics, 1 vote for
+ * quorum disk daemon. Safe to enable master-wins.
+ * In fact, qdiskd without master-wins in this config
+ * is a waste of resources.
+ */
+ ctx->qc_flags |= RF_MASTER_WINS | RF_AUTO_MASTER_WINS;
+ logt_print(LOG_INFO, "Enabling master-wins mode for "
+ "simple two-node cluster\n");
+ }
}
ret = 0;
14 years, 2 months
gfs2-utils: master - gfs2_quota: fix uninitialized fiemap flags
by Abhijith Das
Gitweb: http://git.fedorahosted.org/git/gfs2-utils.git?p=gfs2-utils.git;a=commitd...
Commit: c4b41dc01efd1ebbdbe2b6337543a0ff43bcefa5
Parent: d67c1edbb7711f17d7967ff4072ac05bb77b74b9
Author: Abhijith Das <adas(a)redhat.com>
AuthorDate: Mon Mar 1 19:00:41 2010 -0600
Committer: Abhijith Das <adas(a)redhat.com>
CommitterDate: Mon Mar 1 19:09:33 2010 -0600
gfs2_quota: fix uninitialized fiemap flags
This patch zeroes out the fmap.fm_flags field before
calling the fiemap ioctl. Uninitialized flags will
cause gfs2 to throw the "Invalid request descriptor"
error.
rhbz#536902
---
gfs2/quota/check.c | 2 ++
gfs2/quota/main.c | 6 ++++--
2 files changed, 6 insertions(+), 2 deletions(-)
diff --git a/gfs2/quota/check.c b/gfs2/quota/check.c
index f60a80f..7bd31ad 100644
--- a/gfs2/quota/check.c
+++ b/gfs2/quota/check.c
@@ -222,6 +222,7 @@ read_quota_file(struct gfs2_sbd *sdp, commandline_t *comline,
}
quota_file_size = statbuf.st_size;
/* First find the number of extents in the quota file */
+ fmap.fm_flags = 0;
fmap.fm_start = 0;
fmap.fm_length = (~0ULL);
error = ioctl(fd, FS_IOC_FIEMAP, &fmap);
@@ -235,6 +236,7 @@ read_quota_file(struct gfs2_sbd *sdp, commandline_t *comline,
fprintf(stderr, "malloc error (%d): %s\n", errno, strerror(errno));
goto out;
}
+ fmap2->fm_flags = 0;
fmap2->fm_start = 0;
fmap2->fm_length = (~0ULL);
fmap2->fm_extent_count = fmap.fm_mapped_extents;
diff --git a/gfs2/quota/main.c b/gfs2/quota/main.c
index 1b54162..69a5ce7 100644
--- a/gfs2/quota/main.c
+++ b/gfs2/quota/main.c
@@ -369,8 +369,8 @@ do_reset(struct gfs2_sbd *sdp, commandline_t *comline)
if (!*comline->filesystem)
die("need a filesystem to work on\n");
- printf("This operation will permanently erase all quota information. "
- "You will have to re-assign all quota limit/warn values. "
+ printf("This operation will permanently erase all quota information.\n"
+ "You will have to re-assign all quota limit/warn values.\n"
"Proceed [y/N]? ");
c = getchar();
if (c != 'y' && c != 'Y')
@@ -478,6 +478,7 @@ do_list(struct gfs2_sbd *sdp, commandline_t *comline)
}
quota_file_size = statbuf.st_size;
/* First find the number of extents in the quota file */
+ fmap.fm_flags = 0;
fmap.fm_start = 0;
fmap.fm_length = (~0ULL);
error = ioctl(fd, FS_IOC_FIEMAP, &fmap);
@@ -491,6 +492,7 @@ do_list(struct gfs2_sbd *sdp, commandline_t *comline)
fprintf(stderr, "malloc error (%d): %s\n", errno, strerror(errno));
goto out;
}
+ fmap2->fm_flags = 0;
fmap2->fm_start = 0;
fmap2->fm_length = (~0ULL);
fmap2->fm_extent_count = fmap.fm_mapped_extents;
14 years, 2 months
cluster: STABLE3 - gfs2_quota: fix uninitialized fiemap flags
by Abhijith Das
Gitweb: http://git.fedorahosted.org/git/cluster.git?p=cluster.git;a=commitdiff;h=...
Commit: 54807e352deb5267b0a3a8a49652fe39cb8abd5a
Parent: 5155e0a2fd30e9a3ee3b0b9d27b7418b9cdb71d4
Author: Abhijith Das <adas(a)redhat.com>
AuthorDate: Mon Mar 1 19:00:41 2010 -0600
Committer: Abhijith Das <adas(a)redhat.com>
CommitterDate: Mon Mar 1 19:00:41 2010 -0600
gfs2_quota: fix uninitialized fiemap flags
This patch zeroes out the fmap.fm_flags field before
calling the fiemap ioctl. Uninitialized flags will
cause gfs2 to throw the "Invalid request descriptor"
error.
rhbz#536902
---
gfs2/quota/check.c | 2 ++
gfs2/quota/main.c | 6 ++++--
2 files changed, 6 insertions(+), 2 deletions(-)
diff --git a/gfs2/quota/check.c b/gfs2/quota/check.c
index ac3e9bf..7476629 100644
--- a/gfs2/quota/check.c
+++ b/gfs2/quota/check.c
@@ -220,6 +220,7 @@ read_quota_file(struct gfs2_sbd *sdp, commandline_t *comline,
}
quota_file_size = statbuf.st_size;
/* First find the number of extents in the quota file */
+ fmap.fm_flags = 0;
fmap.fm_start = 0;
fmap.fm_length = (~0ULL);
error = ioctl(fd, FS_IOC_FIEMAP, &fmap);
@@ -233,6 +234,7 @@ read_quota_file(struct gfs2_sbd *sdp, commandline_t *comline,
fprintf(stderr, "malloc error (%d): %s\n", errno, strerror(errno));
goto out;
}
+ fmap2->fm_flags = 0;
fmap2->fm_start = 0;
fmap2->fm_length = (~0ULL);
fmap2->fm_extent_count = fmap.fm_mapped_extents;
diff --git a/gfs2/quota/main.c b/gfs2/quota/main.c
index fa8f4c3..06176db 100644
--- a/gfs2/quota/main.c
+++ b/gfs2/quota/main.c
@@ -367,8 +367,8 @@ do_reset(struct gfs2_sbd *sdp, commandline_t *comline)
if (!*comline->filesystem)
die("need a filesystem to work on\n");
- printf("This operation will permanently erase all quota information. "
- "You will have to re-assign all quota limit/warn values. "
+ printf("This operation will permanently erase all quota information.\n"
+ "You will have to re-assign all quota limit/warn values.\n"
"Proceed [y/N]? ");
c = getchar();
if (c != 'y' && c != 'Y')
@@ -476,6 +476,7 @@ do_list(struct gfs2_sbd *sdp, commandline_t *comline)
}
quota_file_size = statbuf.st_size;
/* First find the number of extents in the quota file */
+ fmap.fm_flags = 0;
fmap.fm_start = 0;
fmap.fm_length = (~0ULL);
error = ioctl(fd, FS_IOC_FIEMAP, &fmap);
@@ -489,6 +490,7 @@ do_list(struct gfs2_sbd *sdp, commandline_t *comline)
fprintf(stderr, "malloc error (%d): %s\n", errno, strerror(errno));
goto out;
}
+ fmap2->fm_flags = 0;
fmap2->fm_start = 0;
fmap2->fm_length = (~0ULL);
fmap2->fm_extent_count = fmap.fm_mapped_extents;
14 years, 2 months
cluster: STABLE3 - gfs2: man page updates
by Bob Peterson
Gitweb: http://git.fedorahosted.org/git/cluster.git?p=cluster.git;a=commitdiff;h=...
Commit: d3188bf4fd69910620245740a89494fb35113bcd
Parent: 5155e0a2fd30e9a3ee3b0b9d27b7418b9cdb71d4
Author: Steven Whitehouse <swhiteho(a)redhat.com>
AuthorDate: Thu Feb 4 14:34:57 2010 +0000
Committer: Bob Peterson <rpeterso(a)redhat.com>
CommitterDate: Mon Mar 1 16:05:16 2010 -0600
gfs2: man page updates
This brings the man pages uptodate. The main change is to
document the current set of mount options and to remove
those which are obsolete.
rhbz#561862
---
gfs2/man/gfs2_tool.8 | 12 ++++-
gfs2/man/mount.gfs2.8 | 108 ++++++++++++++++++++++++++++++++++---------------
2 files changed, 84 insertions(+), 36 deletions(-)
diff --git a/gfs2/man/gfs2_tool.8 b/gfs2/man/gfs2_tool.8
index 1533de7..dccd631 100644
--- a/gfs2/man/gfs2_tool.8
+++ b/gfs2/man/gfs2_tool.8
@@ -16,7 +16,10 @@ as gfs_tool used to.
.SH COMMANDS
.TP
\fBclearflag\fP \fIFlag\fR \fIFile1\fR \fIFile2\fR \fI...\fR
-Clear an attribute flag on a file. See \fBsetflag\fP for available flags.
+Clear an attribute flag on a file. This is now obsolete and kept
+only for backward compatibility, chattr is the preferred way to
+clear attribute flags. See \fBsetflag\fP for available flags. This
+option will probably be removed at a future date.
.TP
\fBfreeze\fP \fIMountPoint\fR
Freeze (quiesce) a GFS2 cluster.
@@ -35,7 +38,8 @@ Print out information about the journals in a mounted filesystem.
\fBlockdump\fP \fIMountPoint\fR
Print out information about the locks this machine holds for a given
filesystem. This information is also available via the debugfs
-glock dump file.
+glock dump file, and accessing that file is the preferred method
+of obtaining a dump of the glock state.
.\".TP
.\"\fBrindex\fP \fIMountPoint\fR
.\"Print out the resource group index of a mounted filesystem.
@@ -73,7 +77,7 @@ Print out the superblock.
Set an attribute flag on a file. The currently supported flags are
jdata, immutable, appendonly, noatime, and sync. The
chattr command is the preferred way to set attributes on
-files.
+files. This option will probably be removed at a future date.
The \fIjdata\fR flag causes all the data written to a file
to be journaled. If the \fIjdata\fR flag is set for a directory,
@@ -108,4 +112,6 @@ Print out the version of GFS2 that this program goes with.
.TP
\fBwithdraw\fP \fIMountPoint\fR
Cause GFS2 to abnormally shutdown a given filesystem on this node.
+This feature is only useful for testing and should not be used
+during normal filesystem operation.
diff --git a/gfs2/man/mount.gfs2.8 b/gfs2/man/mount.gfs2.8
index fcf99c4..29d14c8 100644
--- a/gfs2/man/mount.gfs2.8
+++ b/gfs2/man/mount.gfs2.8
@@ -4,18 +4,17 @@
mount.gfs2 - GFS2 mount options
.SH SYNOPSIS
-.B mount
-[\fIStandardMountOptions\fR] \fB-t\fP gfs2 \fIDEVICE\fR \fIMOUNTPOINT\fR \fB-o\fP [GFS2Option1,GFS2Option2,GFS2OptionX...]
+.BI "mount \-a [\-fnrsvw] \-t " gfs2 " [\-O " options "]
+.br
+.BI "mount [\-fnrsvw] \-t " gfs2 " [\-o " options " ] " "device dir"
.SH DESCRIPTION
-GFS2 may be used as a local (single computer) filesystem, but its real purpose
-is in clusters, where multiple computers (nodes) share a common storage device.
-
-Above is the format typically used to mount a GFS2 filesystem, using the
-\fBmount\fP(8) command. The \fIdevice\fR may be any block device on which you
+For details on the common mount options, please see the
+\fBmount\fP(8) command man page.
+The \fIdevice\fR may be any block device on which you
have created a GFS2 filesystem. Examples include a
single disk partition (e.g. /dev/sdb3), a loopback device, a device exported
-from another node (e.g. an iSCSI device or a \fBgnbd\fP(8) device), or a
+from another node (e.g. an iSCSI device), or a
logical volume (typically comprised of a number of individual disks).
\fIdevice\fR does not necessarily need to match the device name as seen on
@@ -31,8 +30,6 @@ different computers. Each computer must see an entire filesystem. You
may, however, mount several GFS2 filesystems if you want to distribute your
data storage in a controllable way.
-\fImountpoint\fR is the same as \fIdir\fR in the \fBmount\fP(8) man page.
-
This man page describes GFS2-specific options that can be passed to the GFS2
file system at mount time, using the \fB-o\fP flag. There are many other
\fB-o\fP options handled by the generic mount command \fBmount\fP(8).
@@ -41,9 +38,9 @@ interpreted by the mount command nor by the kernel's Virtual File System. GFS2
and non-GFS2 options may be intermingled after the \fB-o\fP, separated by
commas (but no spaces).
-The options debug, commit, discard, acl, quota, suiddir, and data can be
+The options commit, discard, errors, quota_quantum, statfs_quantum, statfs_percent, barrier, acl, quota, suiddir, and data can be
changed after mount using the "mount -o remount,option /mountpoint" command.
-The options debug, quota, discard, acl, and suiddir support the "no"
+The options quota, discard, barrier, acl, and suiddir support the "no"
prefix. For example, "noacl" turns off what "acl" turns on.
If you have trouble mounting GFS2, check the syslog (e.g. /var/log/messages)
@@ -51,15 +48,13 @@ for specific error messages.
.SH OPTIONS
.TP
-\fBlockproto=\fP\fILockModuleName\fR
+\fBlockproto=\fP\fILockProtoName\fR
This specifies which inter-node lock protocol is used by the GFS2 filesystem
for this mount, overriding the default lock protocol name stored in the
filesystem's on-disk superblock.
-The \fILockModuleName\fR must be an exact match of the protocol name presented
-by the lock module when it registers with the lock harness. Traditionally,
-this matches the .o filename of the lock module, e.g. \fIlock_dlm\fR,
-or \fIlock_nolock\fR.
+The \fILockProtoName\fR must be one of the supported locking protocols,
+currently these are \fIlock_nolock\fR and \fIlock_dlm\fR.
The default lock protocol name is written to disk initially when creating the
filesystem with \fBmkfs.gfs2\fP(8), -p option. It can be changed on-disk by
@@ -67,7 +62,9 @@ using the \fBgfs2_tool\fP(8) utility's \fBsb proto\fP command.
The \fBlockproto\fP mount option should be used only under special
circumstances in which you want to temporarily use a different lock protocol
-without changing the on-disk default.
+without changing the on-disk default. Using the incorrect lock protocol
+on a cluster filesystem mounted from more than one node will almost
+certainly result in filesystem corruption.
.TP
\fBlocktable=\fP\fILockTableName\fR
This specifies the identity of the cluster and of the filesystem for this
@@ -78,8 +75,8 @@ the inter-node locking system, enabling the mounting of multiple GFS2
filesystems.
The format of \fILockTableName\fR is lock-module-specific. For
-lock_dlm, the format is \fIclustername:fsname\fR. For
-lock_nolock, the field is ignored.
+\fIlock_dlm\fR, the format is \fIclustername:fsname\fR. For
+\fIlock_nolock\fR, the field is ignored.
The default cluster/filesystem name is written to disk initially when creating
the filesystem with \fBmkfs.gfs2\fP(8), -t option. It can be changed on-disk
@@ -108,10 +105,13 @@ is achieved by letting VFS handle the whole job.
This is turned on automatically by the lock_nolock module,
but can be overridden by using the \fBignore_local_fs\fP option.
.TP
-\fBdebug\fP
-Causes GFS2 to oops when encountering an error that would cause the
-mount to withdraw or print an assertion warning. This option should
-probably not be used in a production system.
+\fBerrors=\fP\fI[panic|withdraw]\fR
+Setting errors=panic causes GFS2 to oops when encountering an error that
+would otherwise cause the
+mount to withdraw or print an assertion warning. The default setting
+is errors=withdraw. This option should not be used in a production system.
+It replaces the earlier \fBdebug\fP option on kernel versions 2.6.31 and
+above.
.TP
\fBignore_local_fs\fP
By default, using the nolock lock module automatically turns on the
@@ -133,7 +133,8 @@ Enables POSIX Access Control List \fBacl\fP(5) support within GFS2.
.TP
\fBspectator\fP
Mount this filesystem using a special form of read-only mount. The mount
-does not use one of the filesystem's journals.
+does not use one of the filesystem's journals. The node is unable to
+recover journals for other nodes.
.TP
\fBsuiddir\fP
Sets owner of any newly created file or directory to be that of parent
@@ -155,13 +156,21 @@ been freed. These can be used by suitable hardware to implement
thin-provisioning and similar schemes. This feature is supported
in kernel version 2.6.30 and above.
.TP
+\fBbarrier\fP
+This option, which defaults to on, causes GFS2 to send I/O barriers
+when flushing the journal. The option is automatically turned off
+if the underlying device does not support I/O barriers. We highly
+recommend the use of I/O barriers with GFS2 at all times unless
+the block device is designed so that it cannot lose its write cache
+content (e.g. its on a UPS, or it doesn't have a write cache)
+.TP
\fBcommit=\fP\fIsecs\fR
This is similar to the ext3 \fBcommit=\fP option in that it sets
the maximum number of seconds between journal commits if there is
dirty data in the journal. The default is 60 seconds. This option
is only provided in kernel versions 2.6.31 and above.
.TP
-\fBdata=\fP\fI[ordered/writeback]\fR
+\fBdata=\fP\fI[ordered|writeback]\fR
When data=ordered is set, the user data modified by a transaction is
flushed to the disk before the transaction is committed to disk. This
should prevent the user from seeing uninitialized blocks in a file
@@ -169,14 +178,47 @@ after a crash. Data=writeback mode writes the user data to the disk
at any time after it's dirtied. This doesn't provide the same
consistency guarantee as ordered mode, but it should be slightly
faster for some workloads. The default is ordered mode.
-
-.SH LINKS
-.TP 30
-http://sources.redhat.com/cluster
--- home site of GFS2
.TP
-http://www.suse.de/~agruen/acl/linux-acls/
--- good writeup on ACL support in Linux
+\fBmeta\fP
+This option results in selecting the meta filesystem root rather than
+the normal filesystem root. This option is normally only used by
+the GFS2 utility functions. Altering any file on the GFS2 meta filesystem
+may render the filesystem unusable, so only experts in the GFS2
+on-disk layout should use this option.
+.TP
+\fBquota_quantum=\fP\fIsecs\fR
+This sets the number of seconds for which a change in the quota
+information may sit on one node before being written to the quota
+file. This is the preferred way to set this parameter. The value
+is an integer number of seconds greater than zero. The default is
+60 seconds. Shorter settings result in faster updates of the lazy
+quota information and less likelihood of someone exceeding their
+quota. Longer settings make filesystem operations involving quotas
+faster and more efficient.
+.TP
+\fBstatfs_quantum=\fP\fIsecs\fR
+Setting statfs_quantum to 0 is the preferred way to set the slow version
+of statfs. The default value is 30 secs which sets the maximum time
+period before statfs changes will be syned to the master statfs file.
+This can be adjusted to allow for faster, less accurate statfs values
+or slower more accurate values. When set to 0, statfs will always
+report the true values.
+.TP
+\fBstatfs_percent=\fP\fIvalue\fR
+This setting provides a bound on the maximum percentage change in
+the statfs information on a local basis before it is synced back
+to the master statfs file, even if the time period has not
+expired. If the setting of statfs_quantum is 0, then this setting
+is ignored.
+
+.SH BUGS
+
+GFS2 doesn't support \fBerrors=\fP\fIremount-ro\fR or \fBdata=\fP\fIjournal\fR.
+It is not possible to switch support for user and group quotas on and
+off independently of each other. Some of the error messages are rather
+cryptic, if you encounter one of these messages check firstly that gfs_controld
+is running and secondly that you have enough journals on the filesystem
+for the number of nodes in use.
.SH SEE ALSO
14 years, 2 months
cluster: RHEL55 - rgmanager: Clear vm.sh default
by Lon Hohberger
Gitweb: http://git.fedorahosted.org/git/cluster.git?p=cluster.git;a=commitdiff;h=...
Commit: d9c1b3a5e50fadac385ee01aa00c57b2f58adbcc
Parent: 4089a83a53f71dceb4a7de0487bf00c0e9dfcd42
Author: Lon Hohberger <lhh(a)redhat.com>
AuthorDate: Mon Mar 1 16:17:17 2010 -0500
Committer: Lon Hohberger <lhh(a)redhat.com>
CommitterDate: Mon Mar 1 16:21:47 2010 -0500
rgmanager: Clear vm.sh default
The default behavior of vm.sh is to use_virsh whenever
possible. The problem with specifying a default in the
RA metadata is that it causes rgmanager to provide a
value to the RA when it is called. In this case, rgmanager
was providing "1" as the default, meaning that the logic
which carefully determines whether to use 'xm' or 'virsh'
is disabled.
This is not seen when testing the resource agent by
hand; it is only seen when called in the context of
rgmanager or rg_test.
Resolves: rhbz#545916
Signed-off-by: Lon Hohberger <lhh(a)redhat.com>
---
rgmanager/src/resources/vm.sh | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/rgmanager/src/resources/vm.sh b/rgmanager/src/resources/vm.sh
index 14978fc..d2932dd 100755
--- a/rgmanager/src/resources/vm.sh
+++ b/rgmanager/src/resources/vm.sh
@@ -128,7 +128,7 @@ meta_data()
virtual machines instead of xm. This is required when
using non-Xen virtual machines (e.g. qemu / KVM).
</shortdesc>
- <content type="integer" default="1"/>
+ <content type="integer" default=""/>
</parameter>
<parameter name="xmlfile">
14 years, 2 months