[Ocfs2-tools-devel] [PATCH] Make tunefs.ocfs2 understand all journal options.
Goldwyn Rodrigues
rgoldwyn at gmail.com
Tue Dec 20 18:51:47 PST 2011
On Tue, Nov 22, 2011 at 1:49 PM, Joel Becker <jlbec at evilplan.org> wrote:
> On Thu, Nov 03, 2011 at 06:16:28PM +0100, Michal Srb wrote:
>> The manual page of tunefs.ocfs2 says that tunefs can understand the same -J
>> options as mkfs.ocfs2 does. That is: size,[no]block32,[no]block64. However
>> tunefs.ocfs2 understands only the size. This adds the ability to change the
>> block option too.
>> ---
>> tunefs.ocfs2/Makefile | 1 +
>> tunefs.ocfs2/libocfs2ne.c | 18 +++++-
>> tunefs.ocfs2/libocfs2ne.h | 2 +-
>> tunefs.ocfs2/ocfs2ne.c | 30 ++++++++++
>> tunefs.ocfs2/op_set_journal_block.c | 109 +++++++++++++++++++++++++++++++++++
>> tunefs.ocfs2/op_set_journal_size.c | 6 +-
>> tunefs.ocfs2/op_set_slot_count.c | 5 +-
>> 7 files changed, 164 insertions(+), 7 deletions(-)
>> create mode 100644 tunefs.ocfs2/op_set_journal_block.c
>>
>> diff --git a/tunefs.ocfs2/Makefile b/tunefs.ocfs2/Makefile
>> index 3847d0f..995d717 100644
>> --- a/tunefs.ocfs2/Makefile
>> +++ b/tunefs.ocfs2/Makefile
>> @@ -40,6 +40,7 @@ OCFS2NE_OPERATIONS = \
>> op_resize_volume \
>> op_set_label \
>> op_set_journal_size \
>> + op_set_journal_block \
>> op_set_slot_count \
>> op_update_cluster_stack \
>> op_set_quota_sync_interval \
>> diff --git a/tunefs.ocfs2/libocfs2ne.c b/tunefs.ocfs2/libocfs2ne.c
>> index 8e814e7..7965727 100644
>> --- a/tunefs.ocfs2/libocfs2ne.c
>> +++ b/tunefs.ocfs2/libocfs2ne.c
>> @@ -331,7 +331,7 @@ errcode_t tunefs_clear_in_progress(ocfs2_filesys *fs, int flag)
>> return ocfs2_write_primary_super(fs);
>> }
>>
>> -errcode_t tunefs_set_journal_size(ocfs2_filesys *fs, uint64_t new_size)
>> +errcode_t tunefs_set_journal_size(ocfs2_filesys *fs, uint64_t new_size, ocfs2_fs_options mask, ocfs2_fs_options options)
>> {
>> errcode_t ret = 0;
>> char jrnl_file[OCFS2_MAX_FILENAME_LEN];
>> @@ -343,6 +343,8 @@ errcode_t tunefs_set_journal_size(ocfs2_filesys *fs, uint64_t new_size)
>> struct ocfs2_dinode *di;
>> struct tunefs_filesystem_state *state = tunefs_get_state(fs);
>> struct tools_progress *prog;
>> + ocfs2_fs_options new_features;
>> + int features_change;
>>
>> num_clusters =
>> ocfs2_clusters_in_blocks(fs,
>> @@ -379,6 +381,16 @@ errcode_t tunefs_set_journal_size(ocfs2_filesys *fs, uint64_t new_size)
>> return ret;
>> }
>>
>> + new_features.opt_compat = (state->ts_journal_features.opt_compat & ~mask.opt_compat)
>> + | (options.opt_compat & mask.opt_compat);
>> + new_features.opt_incompat = (state->ts_journal_features.opt_incompat & ~mask.opt_incompat)
>> + | (options.opt_incompat & mask.opt_incompat);
>> + new_features.opt_ro_compat = (state->ts_journal_features.opt_ro_compat & ~mask.opt_ro_compat)
>> + | (options.opt_ro_compat & mask.opt_ro_compat);
>> + features_change = (new_features.opt_compat ^ state->ts_journal_features.opt_compat) ||
>> + (new_features.opt_incompat ^ state->ts_journal_features.opt_incompat) ||
>> + (new_features.opt_ro_compat ^ state->ts_journal_features.opt_ro_compat);
>> +
>> for (i = 0; i < max_slots; ++i) {
>> ocfs2_sprintf_system_inode_name(jrnl_file,
>> OCFS2_MAX_FILENAME_LEN,
>> @@ -404,7 +416,7 @@ errcode_t tunefs_set_journal_size(ocfs2_filesys *fs, uint64_t new_size)
>> }
>>
>> di = (struct ocfs2_dinode *)buf;
>> - if (num_clusters == di->i_clusters) {
>> + if (num_clusters == di->i_clusters && !features_change) {
>> tools_progress_step(prog, 1);
>> continue;
>> }
>> @@ -413,7 +425,7 @@ errcode_t tunefs_set_journal_size(ocfs2_filesys *fs, uint64_t new_size)
>> "Resizing journal \"%s\" to %"PRIu32" clusters\n",
>> jrnl_file, num_clusters);
>> ret = ocfs2_make_journal(fs, blkno, num_clusters,
>> - &state->ts_journal_features);
>> + &new_features);
>
> Nowhere in any of this do you check the filesystem you are
> changing. While ocfs2_make_journal() will reformat your journal, it
> doesn't handle any of the special case checking that we have in mkfs.
> Things like:
>
> - If your filesystem is larger than can be described by 32bits, you
> can't go to block32, at least without shrinking your filesystem below
> the 32bit boundary.
Is it possible to shrink an ocfs2 filesystem? Is it in development?
[I was on vacation so sorry if I have missed on something]
--
Goldwyn
More information about the Ocfs2-tools-devel
mailing list