提交 cf3d0b81 编写于 作者: E Edward Shishkin 提交者: Linus Torvalds

reiserfs: do not repair wrong journal params

When mounting a file system with wrong journal params do not try to repair
them, suggest fsck instead.
Signed-off-by: NEdward Shishkin <edward@namesys.com>
Cc: Jeff Mahoney <jeffm@suse.com>
Cc: Chris Mason <chris.mason@oracle.com>
Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
上级 f4a1c2bc
...@@ -2649,6 +2649,61 @@ static int journal_init_dev(struct super_block *super, ...@@ -2649,6 +2649,61 @@ static int journal_init_dev(struct super_block *super,
return result; return result;
} }
/**
* When creating/tuning a file system user can assign some
* journal params within boundaries which depend on the ratio
* blocksize/standard_blocksize.
*
* For blocks >= standard_blocksize transaction size should
* be not less then JOURNAL_TRANS_MIN_DEFAULT, and not more
* then JOURNAL_TRANS_MAX_DEFAULT.
*
* For blocks < standard_blocksize these boundaries should be
* decreased proportionally.
*/
#define REISERFS_STANDARD_BLKSIZE (4096)
static int check_advise_trans_params(struct super_block *p_s_sb,
struct reiserfs_journal *journal)
{
if (journal->j_trans_max) {
/* Non-default journal params.
Do sanity check for them. */
int ratio = 1;
if (p_s_sb->s_blocksize < REISERFS_STANDARD_BLKSIZE)
ratio = REISERFS_STANDARD_BLKSIZE / p_s_sb->s_blocksize;
if (journal->j_trans_max > JOURNAL_TRANS_MAX_DEFAULT / ratio ||
journal->j_trans_max < JOURNAL_TRANS_MIN_DEFAULT / ratio ||
SB_ONDISK_JOURNAL_SIZE(p_s_sb) / journal->j_trans_max <
JOURNAL_MIN_RATIO) {
reiserfs_warning(p_s_sb,
"sh-462: bad transaction max size (%u). FSCK?",
journal->j_trans_max);
return 1;
}
if (journal->j_max_batch != (journal->j_trans_max) *
JOURNAL_MAX_BATCH_DEFAULT/JOURNAL_TRANS_MAX_DEFAULT) {
reiserfs_warning(p_s_sb,
"sh-463: bad transaction max batch (%u). FSCK?",
journal->j_max_batch);
return 1;
}
} else {
/* Default journal params.
The file system was created by old version
of mkreiserfs, so some fields contain zeros,
and we need to advise proper values for them */
if (p_s_sb->s_blocksize != REISERFS_STANDARD_BLKSIZE)
reiserfs_panic(p_s_sb, "sh-464: bad blocksize (%u)",
p_s_sb->s_blocksize);
journal->j_trans_max = JOURNAL_TRANS_MAX_DEFAULT;
journal->j_max_batch = JOURNAL_MAX_BATCH_DEFAULT;
journal->j_max_commit_age = JOURNAL_MAX_COMMIT_AGE;
}
return 0;
}
/* /*
** must be called once on fs mount. calls journal_read for you ** must be called once on fs mount. calls journal_read for you
*/ */
...@@ -2744,49 +2799,8 @@ int journal_init(struct super_block *p_s_sb, const char *j_dev_name, ...@@ -2744,49 +2799,8 @@ int journal_init(struct super_block *p_s_sb, const char *j_dev_name,
le32_to_cpu(jh->jh_journal.jp_journal_max_commit_age); le32_to_cpu(jh->jh_journal.jp_journal_max_commit_age);
journal->j_max_trans_age = JOURNAL_MAX_TRANS_AGE; journal->j_max_trans_age = JOURNAL_MAX_TRANS_AGE;
if (journal->j_trans_max) { if (check_advise_trans_params(p_s_sb, journal) != 0)
/* make sure these parameters are available, assign it if they are not */ goto free_and_return;
__u32 initial = journal->j_trans_max;
__u32 ratio = 1;
if (p_s_sb->s_blocksize < 4096)
ratio = 4096 / p_s_sb->s_blocksize;
if (SB_ONDISK_JOURNAL_SIZE(p_s_sb) / journal->j_trans_max <
JOURNAL_MIN_RATIO)
journal->j_trans_max =
SB_ONDISK_JOURNAL_SIZE(p_s_sb) / JOURNAL_MIN_RATIO;
if (journal->j_trans_max > JOURNAL_TRANS_MAX_DEFAULT / ratio)
journal->j_trans_max =
JOURNAL_TRANS_MAX_DEFAULT / ratio;
if (journal->j_trans_max < JOURNAL_TRANS_MIN_DEFAULT / ratio)
journal->j_trans_max =
JOURNAL_TRANS_MIN_DEFAULT / ratio;
if (journal->j_trans_max != initial)
reiserfs_warning(p_s_sb,
"sh-461: journal_init: wrong transaction max size (%u). Changed to %u",
initial, journal->j_trans_max);
journal->j_max_batch = journal->j_trans_max *
JOURNAL_MAX_BATCH_DEFAULT / JOURNAL_TRANS_MAX_DEFAULT;
}
if (!journal->j_trans_max) {
/*we have the file system was created by old version of mkreiserfs
so this field contains zero value */
journal->j_trans_max = JOURNAL_TRANS_MAX_DEFAULT;
journal->j_max_batch = JOURNAL_MAX_BATCH_DEFAULT;
journal->j_max_commit_age = JOURNAL_MAX_COMMIT_AGE;
/* for blocksize >= 4096 - max transaction size is 1024. For block size < 4096
trans max size is decreased proportionally */
if (p_s_sb->s_blocksize < 4096) {
journal->j_trans_max /= (4096 / p_s_sb->s_blocksize);
journal->j_max_batch = (journal->j_trans_max) * 9 / 10;
}
}
journal->j_default_max_commit_age = journal->j_max_commit_age; journal->j_default_max_commit_age = journal->j_max_commit_age;
if (commit_max_age != 0) { if (commit_max_age != 0) {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册