[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