[Ocfs2-tools-devel] [PATCH 1/2] tunefs: add ability to turn on
unwritten extents
Joel Becker
Joel.Becker at oracle.com
Thu Nov 8 12:17:51 PST 2007
On Thu, Nov 08, 2007 at 11:01:22AM -0800, Mark Fasheh wrote:
> If sparse file support is enabled, turning on unwritten extents is just a
> matter of writing the ro_compat flag. If the user asks for unwritten and the
> file system doesn't support sparse files, we turn on sparse 1st.
>
> The feature set code got a little smarter as a result of this patch - we can
> now just use a set of bitfields to represent which features tunefs knows how
> to set or clear.
>
> Signed-off-by: Mark Fasheh <mark.fasheh at oracle.com>
Signed-off-by: Joel Becker <joel.becker at oracle.com>
> ---
> tunefs.ocfs2/features.c | 66 ++++++++++++++++++++++++++++++++++++-------
> tunefs.ocfs2/sparse_file.c | 25 ++++++++++++++++
> tunefs.ocfs2/tunefs.h | 1 +
> 3 files changed, 81 insertions(+), 11 deletions(-)
>
> diff --git a/tunefs.ocfs2/features.c b/tunefs.ocfs2/features.c
> index f05100a..69c0a8a 100644
> --- a/tunefs.ocfs2/features.c
> +++ b/tunefs.ocfs2/features.c
> @@ -29,37 +29,75 @@
>
> extern ocfs2_tune_opts opts;
>
> +#define TUNEFS_COMPAT_SET 0
> +#define TUNEFS_COMPAT_CLEAR 0
> +#define TUNEFS_RO_COMPAT_SET OCFS2_FEATURE_RO_COMPAT_UNWRITTEN
> +#define TUNEFS_RO_COMPAT_CLEAR 0
> +#define TUNEFS_INCOMPAT_SET OCFS2_FEATURE_INCOMPAT_SPARSE_ALLOC
> +#define TUNEFS_INCOMPAT_CLEAR OCFS2_FEATURE_INCOMPAT_SPARSE_ALLOC
> +
> /*
> * Check whether we can add or remove a feature.
> *
> - * Currently, we only handle "sparse files".
> + * Features which can be SET or CLEARed are represented in the TUNEFS
> + * bitfields above.
> * More feature check may be added if we want to
> * support more options in tunefs.ocfs2.
> */
> errcode_t feature_check(ocfs2_filesys *fs)
> {
> errcode_t ret = 1;
> + int sparse_on = ocfs2_sparse_alloc(OCFS2_RAW_SB(fs->fs_super));
> +
> + if (opts.set_feature.compat & ~TUNEFS_COMPAT_SET ||
> + opts.set_feature.ro_compat & ~TUNEFS_RO_COMPAT_SET ||
> + opts.set_feature.incompat & ~TUNEFS_INCOMPAT_SET)
> + goto bail;
>
> - if (opts.set_feature.ro_compat != 0 ||
> - opts.set_feature.compat != 0 ||
> - opts.clear_feature.ro_compat != 0 ||
> - opts.clear_feature.compat != 0)
> + if (opts.clear_feature.compat & ~TUNEFS_COMPAT_CLEAR ||
> + opts.clear_feature.ro_compat & ~TUNEFS_RO_COMPAT_CLEAR ||
> + opts.clear_feature.incompat & ~TUNEFS_INCOMPAT_CLEAR)
> goto bail;
>
> - if ((opts.set_feature.incompat ==
> - OCFS2_FEATURE_INCOMPAT_SPARSE_ALLOC) &&
> - !ocfs2_sparse_alloc(OCFS2_RAW_SB(fs->fs_super)))
> - ret = 0;
> - else if (opts.clear_feature.incompat ==
> - OCFS2_FEATURE_INCOMPAT_SPARSE_ALLOC) {
> + if (opts.set_feature.incompat & OCFS2_FEATURE_INCOMPAT_SPARSE_ALLOC) {
> + /*
> + * Allow sparse to pass on an already-sparse file
> + * system if the user asked for unwritten extents.
> + */
> + if (ocfs2_sparse_alloc(OCFS2_RAW_SB(fs->fs_super)) &&
> + !(opts.set_feature.ro_compat & OCFS2_FEATURE_RO_COMPAT_UNWRITTEN))
> + goto bail;
> +
> + sparse_on = 1;
> + } else if (opts.clear_feature.incompat & OCFS2_FEATURE_INCOMPAT_SPARSE_ALLOC) {
> if (!ocfs2_sparse_alloc(OCFS2_RAW_SB(fs->fs_super)))
> goto bail;
>
> + sparse_on = 0;
> ret = clear_sparse_file_check(fs, opts.progname);
> if (ret)
> goto bail;
> }
>
> + if (opts.set_feature.ro_compat & OCFS2_FEATURE_RO_COMPAT_UNWRITTEN) {
> + /*
> + * Disallow setting of unwritten extents unless we
> + * either have sparse file support, or will also be
> + * turning it on.
> + */
> + if (!sparse_on)
> + goto bail;
> +
> + /*
> + * We can't use the helper here because it checks for
> + * the sparse flag.
> + */
> + if (OCFS2_HAS_RO_COMPAT_FEATURE(OCFS2_RAW_SB(fs->fs_super),
> + OCFS2_FEATURE_RO_COMPAT_UNWRITTEN))
> + goto bail;
> + }
> +
> + ret = 0;
> bail:
> return ret;
> }
> @@ -73,6 +111,12 @@ errcode_t update_feature(ocfs2_filesys *fs)
> else if (opts.clear_feature.incompat
> & OCFS2_FEATURE_INCOMPAT_SPARSE_ALLOC)
> ret = clear_sparse_file_flag(fs, opts.progname);
> + if (ret)
> + goto bail;
> +
> + if (opts.set_feature.ro_compat & OCFS2_FEATURE_RO_COMPAT_UNWRITTEN)
> + set_unwritten_extents_flag(fs);
>
> +bail:
> return ret;
> }
> diff --git a/tunefs.ocfs2/sparse_file.c b/tunefs.ocfs2/sparse_file.c
> index 314f08d..2d2ba01 100644
> --- a/tunefs.ocfs2/sparse_file.c
> +++ b/tunefs.ocfs2/sparse_file.c
> @@ -545,6 +545,15 @@ errcode_t set_sparse_file_flag(ocfs2_filesys *fs, char *progname)
> errcode_t ret;
> struct ocfs2_super_block *super = OCFS2_RAW_SB(fs->fs_super);
>
> + /*
> + * The flag to call set_sparse_file may get set as a result of
> + * unwritten extents being turned on, despite the file system
> + * already supporting sparse files. We can safely do nothing
> + * here.
> + */
> + if (ocfs2_sparse_alloc(super))
> + return 0;
> +
> ret = iterate_all_regular(fs, progname, set_func);
>
> if (ret)
> @@ -556,6 +565,22 @@ bail:
> return ret;
> }
>
> +void set_unwritten_extents_flag(ocfs2_filesys *fs)
> +{
> + struct ocfs2_super_block *super = OCFS2_RAW_SB(fs->fs_super);
> +
> + /*
> + * If we hit this, it's a bug - the code in feature_check()
> + * should have prevented us from getting this far.
> + *
> + * XXX: Is it fatal? Should we just refuse the change and
> + * print a warning to the console?
> + */
> + assert(ocfs2_sparse_alloc(OCFS2_RAW_SB(fs->fs_super)));
> +
> + OCFS2_SET_RO_COMPAT_FEATURE(super, OCFS2_FEATURE_RO_COMPAT_UNWRITTEN);
> +}
> +
> static void add_hole(void *priv_data, uint32_t hole_start, uint32_t hole_len)
> {
> errcode_t ret;
> diff --git a/tunefs.ocfs2/tunefs.h b/tunefs.ocfs2/tunefs.h
> index 3124b76..e7f8c88 100644
> --- a/tunefs.ocfs2/tunefs.h
> +++ b/tunefs.ocfs2/tunefs.h
> @@ -107,6 +107,7 @@ errcode_t list_sparse(ocfs2_filesys *fs);
> errcode_t set_sparse_file_flag(ocfs2_filesys *fs, char *progname);
> errcode_t clear_sparse_file_check(ocfs2_filesys *fs, char *progname);
> errcode_t clear_sparse_file_flag(ocfs2_filesys *fs, char *progname);
> +void set_unwritten_extents_flag(ocfs2_filesys *fs);
> void free_clear_ctxt(void);
>
> errcode_t feature_check(ocfs2_filesys *fs);
> --
> 1.5.0.6
>
>
> _______________________________________________
> Ocfs2-tools-devel mailing list
> Ocfs2-tools-devel at oss.oracle.com
> http://oss.oracle.com/mailman/listinfo/ocfs2-tools-devel
--
"What do you take me for, an idiot?"
- General Charles de Gaulle, when a journalist asked him
if he was happy.
Joel Becker
Principal Software Developer
Oracle
E-mail: joel.becker at oracle.com
Phone: (650) 506-8127
More information about the Ocfs2-tools-devel
mailing list