mirror of
https://github.com/torvalds/linux.git
synced 2024-12-26 21:02:19 +00:00
15922f5dbf
If a filesystem has a busted stripe alignment configuration on disk (e.g. because broken RAID firmware told mkfs that swidth was smaller than sunit), then the filesystem will refuse to mount due to the stripe validation failing. This failure is triggering during distro upgrades from old kernels lacking this check to newer kernels with this check, and currently the only way to fix it is with offline xfs_db surgery. This runtime validity checking occurs when we read the superblock for the first time and causes the mount to fail immediately. This prevents the rewrite of stripe unit/width via mount options that occurs later in the mount process. Hence there is no way to recover this situation without resorting to offline xfs_db rewrite of the values. However, we parse the mount options long before we read the superblock, and we know if the mount has been asked to re-write the stripe alignment configuration when we are reading the superblock and verifying it for the first time. Hence we can conditionally ignore stripe verification failures if the mount options specified will correct the issue. We validate that the new stripe unit/width are valid before we overwrite the superblock values, so we can ignore the invalid config at verification and fail the mount later if the new values are not valid. This, at least, gives users the chance of correcting the issue after a kernel upgrade without having to resort to xfs-db hacks. Signed-off-by: Dave Chinner <dchinner@redhat.com> Reviewed-by: Christoph Hellwig <hch@lst.de> Reviewed-by: "Darrick J. Wong" <djwong@kernel.org> Signed-off-by: Chandan Babu R <chandanbabu@kernel.org>
45 lines
1.5 KiB
C
45 lines
1.5 KiB
C
// SPDX-License-Identifier: GPL-2.0
|
|
/*
|
|
* Copyright (c) 2000-2005 Silicon Graphics, Inc.
|
|
* All Rights Reserved.
|
|
*/
|
|
#ifndef __XFS_SB_H__
|
|
#define __XFS_SB_H__
|
|
|
|
struct xfs_mount;
|
|
struct xfs_sb;
|
|
struct xfs_dsb;
|
|
struct xfs_trans;
|
|
struct xfs_fsop_geom;
|
|
struct xfs_perag;
|
|
|
|
extern void xfs_log_sb(struct xfs_trans *tp);
|
|
extern int xfs_sync_sb(struct xfs_mount *mp, bool wait);
|
|
extern int xfs_sync_sb_buf(struct xfs_mount *mp);
|
|
extern void xfs_sb_mount_common(struct xfs_mount *mp, struct xfs_sb *sbp);
|
|
extern void xfs_sb_from_disk(struct xfs_sb *to, struct xfs_dsb *from);
|
|
extern void xfs_sb_to_disk(struct xfs_dsb *to, struct xfs_sb *from);
|
|
extern void xfs_sb_quota_from_disk(struct xfs_sb *sbp);
|
|
extern bool xfs_sb_good_version(struct xfs_sb *sbp);
|
|
extern uint64_t xfs_sb_version_to_features(struct xfs_sb *sbp);
|
|
|
|
extern int xfs_update_secondary_sbs(struct xfs_mount *mp);
|
|
|
|
#define XFS_FS_GEOM_MAX_STRUCT_VER (5)
|
|
extern void xfs_fs_geometry(struct xfs_mount *mp, struct xfs_fsop_geom *geo,
|
|
int struct_version);
|
|
extern int xfs_sb_read_secondary(struct xfs_mount *mp,
|
|
struct xfs_trans *tp, xfs_agnumber_t agno,
|
|
struct xfs_buf **bpp);
|
|
extern int xfs_sb_get_secondary(struct xfs_mount *mp,
|
|
struct xfs_trans *tp, xfs_agnumber_t agno,
|
|
struct xfs_buf **bpp);
|
|
|
|
bool xfs_validate_stripe_geometry(struct xfs_mount *mp,
|
|
__s64 sunit, __s64 swidth, int sectorsize, bool may_repair,
|
|
bool silent);
|
|
|
|
uint8_t xfs_compute_rextslog(xfs_rtbxlen_t rtextents);
|
|
|
|
#endif /* __XFS_SB_H__ */
|