[Ocfs2-tools-devel] [PATCH RESEND 2/3] tunefs.ocfs2: support append direct io incompat feature

Eric Ren zren at suse.com
Fri Mar 4 03:44:48 PST 2016


Hello,

On 03/03/2016 07:32 PM, Joseph Qi wrote:
> Support turn on/off append direct io incompat feature.
>
> Signed-off-by: Joseph Qi <joseph.qi at huawei.com>
> ---
>   tunefs.ocfs2/Makefile             |   3 +-
>   tunefs.ocfs2/feature_append_dio.c | 123 ++++++++++++++++++++++++++++++++++++++
>   tunefs.ocfs2/op_features.c        |   2 +
>   3 files changed, 127 insertions(+), 1 deletion(-)
>   create mode 100644 tunefs.ocfs2/feature_append_dio.c
>
> diff --git a/tunefs.ocfs2/Makefile b/tunefs.ocfs2/Makefile
> index ba603b9..38ac7d1 100644
> --- a/tunefs.ocfs2/Makefile
> +++ b/tunefs.ocfs2/Makefile
> @@ -35,7 +35,8 @@ OCFS2NE_FEATURES =			\
>   	feature_xattr			\
>   	feature_indexed_dirs		\
>   	feature_quota			\
> -	feature_clusterinfo
> +	feature_clusterinfo		\
> +	feature_append_dio
>
>   OCFS2NE_OPERATIONS =			\
>   	op_cloned_volume		\
> diff --git a/tunefs.ocfs2/feature_append_dio.c b/tunefs.ocfs2/feature_append_dio.c
> new file mode 100644
> index 0000000..dad2f1b
> --- /dev/null
> +++ b/tunefs.ocfs2/feature_append_dio.c
> @@ -0,0 +1,123 @@
> +/* -*- mode: c; c-basic-offset: 8; -*-
> + * vim: noexpandtab sw=8 ts=8 sts=0:
> + *
> + * feature_append_dio.c
> + *
> + * ocfs2 tune utility for enabling and disabling the append direct
> + * io feature.
> + *
> + * This program is free software; you can redistribute it and/or
> + * modify it under the terms of the GNU General Public
> + * License version 2 as published by the Free Software Foundation.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> + * General Public License for more details.
> + */
> +
> +#include <stdio.h>
> +#include <stdlib.h>
> +#include <string.h>
> +#include <sys/stat.h>
> +#include <ctype.h>
> +#include <inttypes.h>
> +#include <assert.h>
> +
> +#include "ocfs2/ocfs2.h"
> +
> +#include "libocfs2ne.h"
> +
> +
> +static int enable_append_dio(ocfs2_filesys *fs, int flags)
> +{
> +	errcode_t ret = 0;
> +	struct ocfs2_super_block *super = OCFS2_RAW_SB(fs->fs_super);
> +	struct tools_progress *prog;
> +
> +	if (ocfs2_supports_append_dio(super)) {
> +		verbosef(VL_APP,
> +			 "Append direct io feature is already enabled; "
> +			 "nothing to enable\n");
> +		goto out;
> +	}
> +
> +	if (!tools_interact("Enable the append direct io feature on "
> +			    "device \"%s\"? ",
> +			    fs->fs_devname))
> +		goto out;
> +
> +	prog = tools_progress_start("Enable append direct io", "append-dio", 1);
> +	if (!prog) {
> +		ret = TUNEFS_ET_NO_MEMORY;
> +		tcom_err(ret, "while initializing the progress display");
> +		goto out;
> +	}
> +
> +	OCFS2_SET_INCOMPAT_FEATURE(super,
> +				    OCFS2_FEATURE_INCOMPAT_APPEND_DIO);
> +	tunefs_block_signals();
> +	ret = ocfs2_write_super(fs);
> +	tunefs_unblock_signals();
> +	if (ret)
> +		tcom_err(ret, "while writing out the superblock");
> +
> +	tools_progress_step(prog, 1);
> +	tools_progress_stop(prog);
> +out:
> +	return ret;
> +}
> +
> +static int disable_append_dio(ocfs2_filesys *fs, int flags)
> +{
> +	errcode_t ret = 0;
> +	struct ocfs2_super_block *super = OCFS2_RAW_SB(fs->fs_super);
> +	struct tools_progress *prog = NULL;
> +
> +	if (!ocfs2_supports_append_dio(super)) {
> +		verbosef(VL_APP,
> +			 "Append direct io feature is not enabled; "
> +			 "nothing to disable\n");
> +		goto out;
> +	}
> +
> +	if (!tools_interact("Disable the append direct io feature on "
> +			    "device \"%s\"? ",
> +			    fs->fs_devname))
> +		goto out;
> +
> +	prog = tools_progress_start("Disabling append direct io", "noappend-dio", 0);
> +	if (!prog) {
> +		ret = TUNEFS_ET_NO_MEMORY;
> +		tcom_err(ret, "while initializing the progress display");
> +		goto out;
> +	}
> +
> +	OCFS2_CLEAR_INCOMPAT_FEATURE(super,
> +				      OCFS2_FEATURE_INCOMPAT_APPEND_DIO);
> +	tunefs_block_signals();
> +	ret = ocfs2_write_super(fs);
> +	tunefs_unblock_signals();
> +	if (ret)
> +		tcom_err(ret, "while writing out the superblock");
> +
> +	tools_progress_step(prog, 1);
> +
> +out:
> +	if (prog)
> +		tools_progress_stop(prog);

Looks like we can move _stop() ahead of out: like how it is in enable_()?
However, it doesn't matter...

Eric

> +	return ret;
> +}
> +
> +DEFINE_TUNEFS_FEATURE_INCOMPAT(append_dio,
> +				OCFS2_FEATURE_INCOMPAT_APPEND_DIO,
> +				TUNEFS_FLAG_RW | TUNEFS_FLAG_ONLINE,
> +				enable_append_dio,
> +				disable_append_dio);
> +
> +#ifdef DEBUG_EXE
> +int main(int argc, char *argv[])
> +{
> +	return tunefs_feature_main(argc, argv, &append_dio_feature);
> +}
> +#endif
> diff --git a/tunefs.ocfs2/op_features.c b/tunefs.ocfs2/op_features.c
> index 20b65a5..b6235aa 100644
> --- a/tunefs.ocfs2/op_features.c
> +++ b/tunefs.ocfs2/op_features.c
> @@ -47,6 +47,7 @@ extern struct tunefs_feature refcount_feature;
>   extern struct tunefs_feature indexed_dirs_feature;
>   extern struct tunefs_feature discontig_bg_feature;
>   extern struct tunefs_feature clusterinfo_feature;
> +extern struct tunefs_feature append_dio_feature;
>
>   /* List of features supported by ocfs2ne */
>   static struct tunefs_feature *features[] = {
> @@ -64,6 +65,7 @@ static struct tunefs_feature *features[] = {
>   	&indexed_dirs_feature,
>   	&discontig_bg_feature,
>   	&clusterinfo_feature,
> +	&append_dio_feature,
>   	NULL,
>   };
>




More information about the Ocfs2-tools-devel mailing list