summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRaghavendra G <raghavendra@gluster.com>2010-04-06 02:10:52 +0000
committerAnand V. Avati <avati@dev.gluster.com>2010-04-08 03:08:57 -0700
commit0f892d517b1907e2bd8cb3ac26699e2027d67fe6 (patch)
tree41676a1e3a4bd94452176da11f28e46363094997
parente23f987bb4796c46d4addba1f6df2cc3ab674086 (diff)
fuse: change behavior of direct io mode.
If bigwrites are available, then disable direct io mode only by default (previously direct io mode was disabled in any case). Added new command line option to force enabling of direct io mode Signed-off-by: Raghavendra G <raghavendra@gluster.com> Signed-off-by: Anand V. Avati <avati@dev.gluster.com> BUG: 801 (Direct io-mode support and related changes in caching translators.) URL: http://bugs.gluster.com/cgi-bin/bugzilla3/show_bug.cgi?id=801
-rw-r--r--glusterfsd/src/glusterfsd.c26
-rw-r--r--glusterfsd/src/glusterfsd.h1
-rw-r--r--xlators/mount/fuse/src/fuse-bridge.c22
3 files changed, 35 insertions, 14 deletions
diff --git a/glusterfsd/src/glusterfsd.c b/glusterfsd/src/glusterfsd.c
index 14627f0af94..87cda657e2c 100644
--- a/glusterfsd/src/glusterfsd.c
+++ b/glusterfsd/src/glusterfsd.c
@@ -149,6 +149,8 @@ static struct argp_option gf_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"},
{"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,
@@ -335,7 +337,7 @@ _add_fuse_mount (xlator_t *graph)
/* On Darwin machines, O_APPEND is not handled,
* which may corrupt the data
*/
- if (cmd_args->fuse_direct_io_mode_flag == _gf_true) {
+ if (cmd_args->fuse_direct_io_mode_flag == 1) {
gf_log ("glusterfs", GF_LOG_DEBUG,
"'direct-io-mode' in fuse causes data corruption "
"if O_APPEND is used. disabling 'direct-io-mode'");
@@ -347,12 +349,18 @@ _add_fuse_mount (xlator_t *graph)
cmd_args->non_local);
#else /* ! DARWIN HOST OS */
- if (cmd_args->fuse_direct_io_mode_flag == _gf_true) {
+ switch (cmd_args->fuse_direct_io_mode_flag) {
+ case 0: /* disable */
+ ret = dict_set_static_ptr (top->options, ZR_DIRECT_IO_OPT,
+ "disable");
+ break;
+ case 1: /* enable */
ret = dict_set_static_ptr (top->options, ZR_DIRECT_IO_OPT,
"enable");
- } else {
- ret = dict_set_static_ptr (top->options, ZR_DIRECT_IO_OPT,
- "disable");
+ break;
+ case 2: /* default */
+ default:
+ break;
}
#endif /* GF_DARWIN_HOST_OS */
@@ -880,7 +888,11 @@ parse_opts (int key, char *arg, struct argp_state *state)
break;
case ARGP_DISABLE_DIRECT_IO_MODE_KEY:
- cmd_args->fuse_direct_io_mode_flag = _gf_false;
+ cmd_args->fuse_direct_io_mode_flag = 0;
+ break;
+
+ case ARGP_ENABLE_DIRECT_IO_MODE_KEY:
+ cmd_args->fuse_direct_io_mode_flag = 1;
break;
case ARGP_ENTRY_TIMEOUT_KEY:
@@ -1143,7 +1155,7 @@ main (int argc, char *argv[])
/* parsing command line arguments */
cmd_args->log_level = DEFAULT_LOG_LEVEL;
- cmd_args->fuse_direct_io_mode_flag = _gf_true;
+ cmd_args->fuse_direct_io_mode_flag = 2;
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 8198f6f5238..b3f933ca624 100644
--- a/glusterfsd/src/glusterfsd.h
+++ b/glusterfsd/src/glusterfsd.h
@@ -66,6 +66,7 @@ enum argp_option_keys {
ARGP_ATTRIBUTE_TIMEOUT_KEY = 136,
ARGP_VOLUME_NAME_KEY = 137,
ARGP_XLATOR_OPTION_KEY = 138,
+ ARGP_ENABLE_DIRECT_IO_MODE_KEY = 139,
#ifdef GF_DARWIN_HOST_OS
ARGP_NON_LOCAL_KEY = 139,
#endif /* DARWIN */
diff --git a/xlators/mount/fuse/src/fuse-bridge.c b/xlators/mount/fuse/src/fuse-bridge.c
index a51cf6eed98..b01bf4cdffc 100644
--- a/xlators/mount/fuse/src/fuse-bridge.c
+++ b/xlators/mount/fuse/src/fuse-bridge.c
@@ -833,8 +833,9 @@ fuse_fd_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
foo.open_flags = 0;
if (!S_ISDIR (fd->inode->st_mode)) {
- if (((state->flags & O_ACCMODE) != O_RDONLY) &&
- priv->direct_io_mode)
+ if (((priv->direct_io_mode == 2)
+ && ((state->flags & O_ACCMODE) != O_RDONLY))
+ || (priv->direct_io_mode == 1))
foo.open_flags |= FOPEN_DIRECT_IO;
}
@@ -1648,8 +1649,9 @@ fuse_create_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
if (op_ret >= 0) {
foo.fh = (uintptr_t) fd;
- if (((state->flags & O_ACCMODE) != O_RDONLY) &&
- priv->direct_io_mode)
+ if (((priv->direct_io_mode == 2)
+ && ((state->flags & O_ACCMODE) != O_RDONLY))
+ || (priv->direct_io_mode == 1))
foo.open_flags |= FOPEN_DIRECT_IO;
gf_log ("glusterfs-fuse", GF_LOG_TRACE,
@@ -2920,8 +2922,14 @@ fuse_init (xlator_t *this, fuse_in_header_t *finh, void *msg)
fino.flags = FUSE_ASYNC_READ | FUSE_POSIX_LOCKS;
if (fini->minor >= 6 /* fuse_init_in has flags */ &&
fini->flags & FUSE_BIG_WRITES) {
- /* no need for direct I/O mode if big writes are supported */
- priv->direct_io_mode = 0;
+ /*
+ * no need for direct I/O mode by default if big writes are
+ * supported
+ */
+ if (priv->direct_io_mode == 2) {
+ priv->direct_io_mode = 0;
+ }
+
fino.flags |= FUSE_BIG_WRITES;
}
if (fini->minor >= 13) {
@@ -3422,7 +3430,7 @@ init (xlator_t *this_xl)
priv->entry_timeout = 1.0; /* default */
- priv->direct_io_mode = 1;
+ priv->direct_io_mode = 2;
ret = dict_get_str (options, ZR_DIRECT_IO_OPT, &value_string);
if (value_string) {
ret = gf_string2boolean (value_string, &priv->direct_io_mode);