Patrick J. LoPresti
2010-Jul-11 17:03 UTC
[Ocfs2-devel] [PATCH 1/2] JBD2: Allow feature checks before journal recovery
Before we start accessing a huge (> 16 TiB) OCFS2 volume, we need to confirm that its journal supports 64-bit offsets. So we need to check the journal's feature bits before recovering the journal. This is not possible with JBD2 at present, because the journal superblock (where the feature bits reside) is not loaded from disk until the journal is recovered. This patch loads the journal superblock in jbd2_journal_check_used_features() if it has not already been loaded, allowing us to check the feature bits before journal recovery. Signed-off-by: Patrick LoPresti <lopresti at gmail.com> diff --git a/fs/jbd2/journal.c b/fs/jbd2/journal.c index bc2ff59..c5a864f 100644 --- a/fs/jbd2/journal.c +++ b/fs/jbd2/journal.c @@ -1365,6 +1365,8 @@ int jbd2_journal_check_used_features (journal_t *journal, unsigned long compat, if (!compat && !ro && !incompat) return 1; + if (journal_get_superblock(journal)) + return 0; if (journal->j_format_version == 1) return 0;
Patrick J. LoPresti
2010-Jul-11 17:04 UTC
[Ocfs2-devel] [PATCH 2/2] OCFS2: Allow huge (> 16 TiB) volumes to mount
The OCFS2 developers have already done all of the hard work to allow volumes larger than 16 TiB. But there is still a "sanity check" in fs/ocfs2/super.c that prevents the mounting of such volumes, even when the cluster size and journal options would allow it. This patch replaces that sanity check with a more sophisticated one to mount a huge volume provided that (a) it is addressable by the raw word/address size of the system (borrowing a test from ext4); (b) the volume is using JBD2; and (c) the JBD2_FEATURE_INCOMPAT_64BIT flag is set on the journal. I factored out the sanity check into its own function. I also moved it from ocfs2_initialize_super() down to ocfs2_check_volume(); any earlier, and the journal will not have been initialized yet. This patch is one of a pair, and it depends on the other ("JBD2: Allow feature checks before journal recovery"). I have tested this patch on small volumes, huge volumes, and huge volumes without 64-bit block support in the journal. All of them appear to work or to fail gracefully, as appropriate. Signed-off-by: Patrick LoPresti <lopresti at gmail.com> diff --git a/fs/ocfs2/super.c b/fs/ocfs2/super.c index 0eaa929..b809508 100644 --- a/fs/ocfs2/super.c +++ b/fs/ocfs2/super.c @@ -1991,6 +1991,47 @@ static int ocfs2_setup_osb_uuid(struct ocfs2_super *osb, const unsigned char *uu return 0; } +/* Check to make sure entire volume is addressable on this system. + Requires osb_clusters_at_boot to be valid and for the journal to + have been initialized by ocfs2_journal_init(). */ +static int ocfs2_check_addressable(struct ocfs2_super *osb) +{ + int status = 0; + u64 max_block + ocfs2_clusters_to_blocks(osb->sb, + osb->osb_clusters_at_boot) - 1; + + /* Absolute addressability check (borrowed from ext4/super.c) */ + if ((max_block > + (sector_t)(~0LL) >> (osb->sb->s_blocksize_bits - 9)) || + (max_block > (pgoff_t)(~0LL) >> (PAGE_CACHE_SHIFT - + osb->sb->s_blocksize_bits))) { + mlog(ML_ERROR, "Volume too large " + "to mount safely on this system"); + status = -EFBIG; + goto out; + } + + /* 32-bit block number is always OK. */ + if (max_block <= (u32)~0UL) + goto out; + + /* Volume is "huge", so see if our journal is new enough to + support it. */ + if (!(OCFS2_HAS_COMPAT_FEATURE(osb->sb, + OCFS2_FEATURE_COMPAT_JBD2_SB) && + jbd2_journal_check_used_features(osb->journal->j_journal, 0, 0, + JBD2_FEATURE_INCOMPAT_64BIT))) { + mlog(ML_ERROR, "The journal cannot address the entire volume. " + "Enable the 'block64' journal option with tunefs.ocfs2"); + status = -EFBIG; + goto out; + } + + out: + return status; +} + static int ocfs2_initialize_super(struct super_block *sb, struct buffer_head *bh, int sector_size, @@ -2215,14 +2256,6 @@ static int ocfs2_initialize_super(struct super_block *sb, goto bail; } - if (ocfs2_clusters_to_blocks(osb->sb, le32_to_cpu(di->i_clusters) - 1) - > (u32)~0UL) { - mlog(ML_ERROR, "Volume might try to write to blocks beyond " - "what jbd can address in 32 bits.\n"); - status = -EINVAL; - goto bail; - } - if (ocfs2_setup_osb_uuid(osb, di->id2.i_super.s_uuid, sizeof(di->id2.i_super.s_uuid))) { mlog(ML_ERROR, "Out of memory trying to setup our uuid.\n"); @@ -2381,6 +2414,12 @@ static int ocfs2_check_volume(struct ocfs2_super *osb) goto finally; } + /* Now that journal has been initialized, check to make sure + entire volume is addressable. */ + status = ocfs2_check_addressable(osb); + if (status) + goto finally; + /* If the journal was unmounted cleanly then we don't want to * recover anything. Otherwise, journal_load will do that * dirty work for us :) */
Jan Kara
2010-Jul-21 17:27 UTC
[Ocfs2-devel] [PATCH 1/2] JBD2: Allow feature checks before journal recovery
> Before we start accessing a huge (> 16 TiB) OCFS2 volume, we need to > confirm that its journal supports 64-bit offsets. So we need to check > the journal's feature bits before recovering the journal. > > This is not possible with JBD2 at present, because the journal > superblock (where the feature bits reside) is not loaded from disk until > the journal is recovered. > > This patch loads the journal superblock in > jbd2_journal_check_used_features() if it has not already been loaded, > allowing us to check the feature bits before journal recovery. > > Signed-off-by: Patrick LoPresti <lopresti at gmail.com> > > diff --git a/fs/jbd2/journal.c b/fs/jbd2/journal.c > index bc2ff59..c5a864f 100644 > --- a/fs/jbd2/journal.c > +++ b/fs/jbd2/journal.c > @@ -1365,6 +1365,8 @@ int jbd2_journal_check_used_features (journal_t *journal, unsigned long compat, > > if (!compat && !ro && !incompat) > return 1; > + if (journal_get_superblock(journal)) > + return 0; > if (journal->j_format_version == 1) > return 0;This looks OK in principle. It would be even nicer to avoid all the checks journal_get_superblock() when the superblock is actually loaded so that we don't do them each time jbd2_journal_check_used_features is called... Honza -- Jan Kara <jack at suse.cz> SuSE CR Labs
Reasonably Related Threads
- [PATCH 1/3] ext3/ext4: Factor out disk addressability check
- [PATCH 0/3] ocfs2: Switch over to JBD2.
- [PATCH 1/3] ocfs2: Optimize inode allocation by remembering last group.
- [PATCH] use sb_getblk
- [PATCH 2/2] ocfs2: add error handling path when jbd2 enter ABORT status