• D
    xfs: rework attr2 feature and mount options · e23b55d5
    Dave Chinner 提交于
    The attr2 feature is somewhat unique in that it has both a superblock
    feature bit to enable it and mount options to enable and disable it.
    
    Back when it was first introduced in 2005, attr2 was disabled unless
    either the attr2 superblock feature bit was set, or the attr2 mount
    option was set. If the superblock feature bit was not set but the
    mount option was set, then when the first attr2 format inode fork
    was created, it would set the superblock feature bit. This is as it
    should be - the superblock feature bit indicated the presence of the
    attr2 on disk format.
    
    The noattr2 mount option, however, did not affect the superblock
    feature bit. If noattr2 was specified, the on-disk superblock
    feature bit was ignored and the code always just created attr1
    format inode forks.  If neither of the attr2 or noattr2 mounts
    option were specified, then the behaviour was determined by the
    superblock feature bit.
    
    This was all pretty sane.
    
    Fast foward 3 years, and we are dealing with fallout from the
    botched sb_features2 addition and having to deal with feature
    mismatches between the sb_features2 and sb_bad_features2 fields. The
    attr2 feature bit was one of these flags. The reconciliation was
    done well after mount option parsing and, unfortunately, the feature
    reconciliation had a bug where it ignored the noattr2 mount option.
    
    For reasons lost to the mists of time, it was decided that resolving
    this issue in commit 7c12f296 ("[XFS] Fix up noattr2 so that it
    will properly update the versionnum and features2 fields.") required
    noattr2 to clear the superblock attr2 feature bit.  This greatly
    complicated the attr2 behaviour and broke rules about feature bits
    needing to be set when those specific features are present in the
    filesystem.
    
    By complicated, I mean that it introduced problems due to feature
    bit interactions with log recovery. All of the superblock feature
    bit checks are done prior to log recovery, but if we crash after
    removing a feature bit, then on the next mount we see the feature
    bit in the unrecovered superblock, only to have it go away after the
    log has been replayed.  This means our mount time feature processing
    could be all wrong.
    
    Hence you can mount with noattr2, crash shortly afterwards, and
    mount again without attr2 or noattr2 and still have attr2 enabled
    because the second mount sees attr2 still enabled in the superblock
    before recovery runs and removes the feature bit. It's just a mess.
    
    Further, this is all legacy code as the v5 format requires attr2 to
    be enabled at all times and it cannot be disabled.  i.e. the noattr2
    mount option returns an error when used on v5 format filesystems.
    
    To straighten this all out, this patch reverts the attr2/noattr2
    mount option behaviour back to the original behaviour. There is no
    reason for disabling attr2 these days, so we will only do this when
    the noattr2 mount option is set. This will not remove the superblock
    feature bit. The superblock bit will provide the default behaviour
    and only track whether attr2 is present on disk or not. The attr2
    mount option will enable the creation of attr2 format inode forks,
    and if the superblock feature bit is not set it will be added when
    the first attr2 inode fork is created.
    Signed-off-by: NDave Chinner <dchinner@redhat.com>
    Reviewed-by: NDarrick J. Wong <djwong@kernel.org>
    Signed-off-by: NDarrick J. Wong <djwong@kernel.org>
    e23b55d5
xfs_mount.c 36.4 KB