summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCsaba Henk <csaba@gluster.com>2010-07-08 05:44:05 +0000
committerAnand V. Avati <avati@dev.gluster.com>2010-07-08 05:24:50 -0700
commitf605883c4fe99428c560a18a1051693f7aadf84e (patch)
tree21ee55116f9ec7426fc9084c4f566e56e5cea230
parent2233d7d3c54bf2fc7dc291ae19d8516b44f6e6af (diff)
fix up option handling
After 79241696, the following anomalies came up: - --mac-compat and --read-only was rejected originally on server side, 79241696 cancelled this check - direct I/O option handling was interfered by 79241696 - --mac-compat had no effect on Linux and does not compile on Mac Restore original behaviors. Signed-off-by: Csaba Henk <csaba@gluster.com> Signed-off-by: Anand V. Avati <avati@dev.gluster.com> BUG: 971 (dynamic volume management) URL: http://bugs.gluster.com/cgi-bin/bugzilla3/show_bug.cgi?id=971
-rw-r--r--glusterfsd/src/glusterfsd.c81
-rw-r--r--glusterfsd/src/glusterfsd.h3
-rw-r--r--libglusterfs/src/glusterfs.h6
-rw-r--r--libglusterfs/src/graph.c14
4 files changed, 64 insertions, 40 deletions
diff --git a/glusterfsd/src/glusterfsd.c b/glusterfsd/src/glusterfsd.c
index 3e0947fbb2b..8636e1f6c44 100644
--- a/glusterfsd/src/glusterfsd.c
+++ b/glusterfsd/src/glusterfsd.c
@@ -150,15 +150,19 @@ static struct argp_option gf_options[] = {
"Add/override a translator option for a volume with specified value"},
{"read-only", ARGP_READ_ONLY_KEY, 0, 0,
"Mount the filesystem in 'read-only' mode"},
- {"mac-compat", ARGP_MAC_COMPAT_KEY, 0, 0,
- "Provide stubs for attributes needed for seamless operation on Macs"},
+ {"mac-compat", ARGP_MAC_COMPAT_KEY, "BOOL", OPTION_ARG_OPTIONAL,
+ "Provide stubs for attributes needed for seamless operation on Macs "
+#ifdef GF_DARWIN_HOST_OS
+ "[default: \"on\" on client side, else \"off\"]"
+#else
+ "[default: \"off\"]"
+#endif
+ },
{0, 0, 0, 0, "Fuse options:"},
- {"disable-direct-io-mode", ARGP_DISABLE_DIRECT_IO_MODE_KEY, 0, 0,
- "Disable direct I/O mode in fuse kernel module"
- " [default if big writes are supported]"},
- {"enable-direct-io-mode", ARGP_ENABLE_DIRECT_IO_MODE_KEY, 0, 0,
- "Force direct I/O mode in fuse kernel module"},
+ {"direct-io-mode", ARGP_DIRECT_IO_MODE_KEY, "BOOL", OPTION_ARG_OPTIONAL,
+ "Use direct I/O mode in fuse kernel module"
+ " [default: \"off\" if big writes are supported, else \"on\"]"},
{"entry-timeout", ARGP_ENTRY_TIMEOUT_KEY, "SECONDS", 0,
"Set entry timeout to SECONDS in fuse kernel module [default: 1]"},
{"attribute-timeout", ARGP_ATTRIBUTE_TIMEOUT_KEY, "SECONDS", 0,
@@ -232,35 +236,20 @@ create_fuse_mount (glusterfs_ctx_t *ctx)
ret = dict_set_static_ptr (master->options, ZR_DUMP_FUSE,
cmd_args->dump_fuse);
-#ifdef GF_DARWIN_HOST_OS
- /* On Darwin machines, O_APPEND is not handled,
- * which may corrupt the data
- */
-
- if (cmd_args->fuse_direct_io_mode_flag == 1) {
- gf_log ("glusterfsd", GF_LOG_DEBUG,
- "'direct-io-mode' in fuse causes data corruption "
- "if O_APPEND is used. disabling 'direct-io-mode'");
- }
- ret = dict_set_static_ptr (top->options, ZR_DIRECT_IO_OPT, "disable");
-
-#else /* ! DARWIN HOST OS */
- switch (cmd_args->fuse_direct_io_mode_flag) {
- case 0: /* disable */
+ switch (cmd_args->fuse_direct_io_mode) {
+ case GF_OPTION_DISABLE: /* disable */
ret = dict_set_static_ptr (master->options, ZR_DIRECT_IO_OPT,
"disable");
break;
- case 1: /* enable */
+ case GF_OPTION_ENABLE: /* enable */
ret = dict_set_static_ptr (master->options, ZR_DIRECT_IO_OPT,
"enable");
break;
- case 2: /* default */
+ case GF_OPTION_DEFERRED: /* default */
default:
break;
}
-#endif /* GF_DARWIN_HOST_OS */
-
ret = xlator_init (master);
if (ret)
goto err;
@@ -393,6 +382,7 @@ parse_opts (int key, char *arg, struct argp_state *state)
cmd_args_t *cmd_args = NULL;
uint32_t n = 0;
double d = 0.0;
+ gf_boolean_t b = _gf_false;
cmd_args = state->input;
@@ -418,7 +408,17 @@ parse_opts (int key, char *arg, struct argp_state *state)
break;
case ARGP_MAC_COMPAT_KEY:
- cmd_args->mac_compat = 1;
+ if (!arg)
+ arg = "on";
+
+ if (gf_string2boolean (arg, &b) == 0) {
+ cmd_args->mac_compat = b;
+
+ break;
+ }
+
+ argp_failure (state, -1, 0,
+ "invalid value \"%s\" for mac-compat", arg);
break;
case ARGP_VOLUME_FILE_KEY:
@@ -520,12 +520,18 @@ parse_opts (int key, char *arg, struct argp_state *state)
cmd_args->debug_mode = ENABLE_DEBUG_MODE;
break;
- case ARGP_DISABLE_DIRECT_IO_MODE_KEY:
- cmd_args->fuse_direct_io_mode_flag = 0;
- break;
+ case ARGP_DIRECT_IO_MODE_KEY:
+ if (!arg)
+ arg = "on";
+
+ if (gf_string2boolean (arg, &b) == 0) {
+ cmd_args->fuse_direct_io_mode = b;
+
+ break;
+ }
- case ARGP_ENABLE_DIRECT_IO_MODE_KEY:
- cmd_args->fuse_direct_io_mode_flag = 1;
+ argp_failure (state, -1, 0,
+ "unknown direct I/O mode setting \"%s\"", arg);
break;
case ARGP_ENTRY_TIMEOUT_KEY:
@@ -786,7 +792,16 @@ glusterfs_ctx_defaults_init (glusterfs_ctx_t *ctx)
/* parsing command line arguments */
cmd_args->log_level = DEFAULT_LOG_LEVEL;
- cmd_args->fuse_direct_io_mode_flag = _gf_true;
+#ifdef GF_DARWIN_HOST_OS
+ cmd_args->mac_compat = GF_OPTION_DEFERRED;
+ /* On Darwin machines, O_APPEND is not handled,
+ * which may corrupt the data
+ */
+ cmd_args->fuse_direct_io_mode = GF_OPTION_DISABLE;
+#else
+ cmd_args->mac_compat = GF_OPTION_DISABLE;
+ cmd_args->fuse_direct_io_mode = GF_OPTION_DEFERRED;
+#endif
cmd_args->fuse_attribute_timeout = -1;
INIT_LIST_HEAD (&cmd_args->xlator_options);
diff --git a/glusterfsd/src/glusterfsd.h b/glusterfsd/src/glusterfsd.h
index 62916711752..e4f4babaad0 100644
--- a/glusterfsd/src/glusterfsd.h
+++ b/glusterfsd/src/glusterfsd.h
@@ -64,12 +64,11 @@ enum argp_option_keys {
ARGP_NO_DAEMON_KEY = 'N',
ARGP_RUN_ID_KEY = 'r',
ARGP_DEBUG_KEY = 133,
- ARGP_DISABLE_DIRECT_IO_MODE_KEY = 134,
ARGP_ENTRY_TIMEOUT_KEY = 135,
ARGP_ATTRIBUTE_TIMEOUT_KEY = 136,
ARGP_VOLUME_NAME_KEY = 137,
ARGP_XLATOR_OPTION_KEY = 138,
- ARGP_ENABLE_DIRECT_IO_MODE_KEY = 139,
+ ARGP_DIRECT_IO_MODE_KEY = 139,
#ifdef GF_DARWIN_HOST_OS
ARGP_NON_LOCAL_KEY = 140,
#endif /* DARWIN */
diff --git a/libglusterfs/src/glusterfs.h b/libglusterfs/src/glusterfs.h
index 48bb0ff4df6..5b9f375e6d3 100644
--- a/libglusterfs/src/glusterfs.h
+++ b/libglusterfs/src/glusterfs.h
@@ -201,6 +201,10 @@ struct _xlator_cmdline_option {
typedef struct _xlator_cmdline_option xlator_cmdline_option_t;
+#define GF_OPTION_ENABLE _gf_true
+#define GF_OPTION_DISABLE _gf_false
+#define GF_OPTION_DEFERRED 2
+
struct _cmd_args {
/* basic options */
char *volfile_server;
@@ -222,7 +226,7 @@ struct _cmd_args {
struct list_head xlator_options; /* list of xlator_option_t */
/* fuse options */
- int fuse_direct_io_mode_flag;
+ int fuse_direct_io_mode;
int volfile_check;
double fuse_entry_timeout;
double fuse_attribute_timeout;
diff --git a/libglusterfs/src/graph.c b/libglusterfs/src/graph.c
index a59b427bffe..2609b7625df 100644
--- a/libglusterfs/src/graph.c
+++ b/libglusterfs/src/graph.c
@@ -131,6 +131,14 @@ glusterfs_graph_insert (glusterfs_graph_t *graph, glusterfs_ctx_t *ctx,
xlator_list_t *xlchild = NULL;
xlator_list_t *xlparent = NULL;
+ if (!ctx->master) {
+ gf_log ("glusterfs", GF_LOG_ERROR,
+ "volume \"%s\" can be added from command line only "
+ "on client side", type);
+
+ return -1;
+ }
+
ixl = GF_CALLOC (1, sizeof (*ixl), gf_common_mt_xlator_t);
if (!ixl)
return -1;
@@ -210,13 +218,11 @@ glusterfs_graph_mac_compat (glusterfs_graph_t *graph, glusterfs_ctx_t *ctx)
cmd_args = &ctx->cmd_args;
-#ifdef GF_DARWIN_HOST_OS
- if (!cmd_args->mac_compat)
+ if (cmd_args->mac_compat == GF_OPTION_DISABLE)
return 0;
- ret = glusterfs_graph_insert (graph, ctx, ZR_XLATOR_MAC_COMPAT,
+ ret = glusterfs_graph_insert (graph, ctx, "features/mac-compat",
"mac-compat-autoload");
-#endif
return ret;
}