|
@@ -45,7 +45,6 @@
|
|
#include "xfs_fsops.h"
|
|
#include "xfs_fsops.h"
|
|
#include "xfs_utils.h"
|
|
#include "xfs_utils.h"
|
|
|
|
|
|
-STATIC int xfs_mount_log_sb(xfs_mount_t *, __int64_t);
|
|
|
|
STATIC int xfs_uuid_mount(xfs_mount_t *);
|
|
STATIC int xfs_uuid_mount(xfs_mount_t *);
|
|
STATIC void xfs_unmountfs_wait(xfs_mount_t *);
|
|
STATIC void xfs_unmountfs_wait(xfs_mount_t *);
|
|
|
|
|
|
@@ -682,7 +681,7 @@ xfs_initialize_perag_data(xfs_mount_t *mp, xfs_agnumber_t agcount)
|
|
* Update alignment values based on mount options and sb values
|
|
* Update alignment values based on mount options and sb values
|
|
*/
|
|
*/
|
|
STATIC int
|
|
STATIC int
|
|
-xfs_update_alignment(xfs_mount_t *mp, __uint64_t *update_flags)
|
|
|
|
|
|
+xfs_update_alignment(xfs_mount_t *mp)
|
|
{
|
|
{
|
|
xfs_sb_t *sbp = &(mp->m_sb);
|
|
xfs_sb_t *sbp = &(mp->m_sb);
|
|
|
|
|
|
@@ -736,11 +735,11 @@ xfs_update_alignment(xfs_mount_t *mp, __uint64_t *update_flags)
|
|
if (xfs_sb_version_hasdalign(sbp)) {
|
|
if (xfs_sb_version_hasdalign(sbp)) {
|
|
if (sbp->sb_unit != mp->m_dalign) {
|
|
if (sbp->sb_unit != mp->m_dalign) {
|
|
sbp->sb_unit = mp->m_dalign;
|
|
sbp->sb_unit = mp->m_dalign;
|
|
- *update_flags |= XFS_SB_UNIT;
|
|
|
|
|
|
+ mp->m_update_flags |= XFS_SB_UNIT;
|
|
}
|
|
}
|
|
if (sbp->sb_width != mp->m_swidth) {
|
|
if (sbp->sb_width != mp->m_swidth) {
|
|
sbp->sb_width = mp->m_swidth;
|
|
sbp->sb_width = mp->m_swidth;
|
|
- *update_flags |= XFS_SB_WIDTH;
|
|
|
|
|
|
+ mp->m_update_flags |= XFS_SB_WIDTH;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
} else if ((mp->m_flags & XFS_MOUNT_NOALIGN) != XFS_MOUNT_NOALIGN &&
|
|
} else if ((mp->m_flags & XFS_MOUNT_NOALIGN) != XFS_MOUNT_NOALIGN &&
|
|
@@ -905,7 +904,6 @@ xfs_mountfs(
|
|
xfs_sb_t *sbp = &(mp->m_sb);
|
|
xfs_sb_t *sbp = &(mp->m_sb);
|
|
xfs_inode_t *rip;
|
|
xfs_inode_t *rip;
|
|
__uint64_t resblks;
|
|
__uint64_t resblks;
|
|
- __int64_t update_flags = 0LL;
|
|
|
|
uint quotamount, quotaflags;
|
|
uint quotamount, quotaflags;
|
|
int uuid_mounted = 0;
|
|
int uuid_mounted = 0;
|
|
int error = 0;
|
|
int error = 0;
|
|
@@ -933,7 +931,7 @@ xfs_mountfs(
|
|
"XFS: correcting sb_features alignment problem");
|
|
"XFS: correcting sb_features alignment problem");
|
|
sbp->sb_features2 |= sbp->sb_bad_features2;
|
|
sbp->sb_features2 |= sbp->sb_bad_features2;
|
|
sbp->sb_bad_features2 = sbp->sb_features2;
|
|
sbp->sb_bad_features2 = sbp->sb_features2;
|
|
- update_flags |= XFS_SB_FEATURES2 | XFS_SB_BAD_FEATURES2;
|
|
|
|
|
|
+ mp->m_update_flags |= XFS_SB_FEATURES2 | XFS_SB_BAD_FEATURES2;
|
|
|
|
|
|
/*
|
|
/*
|
|
* Re-check for ATTR2 in case it was found in bad_features2
|
|
* Re-check for ATTR2 in case it was found in bad_features2
|
|
@@ -947,11 +945,11 @@ xfs_mountfs(
|
|
if (xfs_sb_version_hasattr2(&mp->m_sb) &&
|
|
if (xfs_sb_version_hasattr2(&mp->m_sb) &&
|
|
(mp->m_flags & XFS_MOUNT_NOATTR2)) {
|
|
(mp->m_flags & XFS_MOUNT_NOATTR2)) {
|
|
xfs_sb_version_removeattr2(&mp->m_sb);
|
|
xfs_sb_version_removeattr2(&mp->m_sb);
|
|
- update_flags |= XFS_SB_FEATURES2;
|
|
|
|
|
|
+ mp->m_update_flags |= XFS_SB_FEATURES2;
|
|
|
|
|
|
/* update sb_versionnum for the clearing of the morebits */
|
|
/* update sb_versionnum for the clearing of the morebits */
|
|
if (!sbp->sb_features2)
|
|
if (!sbp->sb_features2)
|
|
- update_flags |= XFS_SB_VERSIONNUM;
|
|
|
|
|
|
+ mp->m_update_flags |= XFS_SB_VERSIONNUM;
|
|
}
|
|
}
|
|
|
|
|
|
/*
|
|
/*
|
|
@@ -960,7 +958,7 @@ xfs_mountfs(
|
|
* allocator alignment is within an ag, therefore ag has
|
|
* allocator alignment is within an ag, therefore ag has
|
|
* to be aligned at stripe boundary.
|
|
* to be aligned at stripe boundary.
|
|
*/
|
|
*/
|
|
- error = xfs_update_alignment(mp, &update_flags);
|
|
|
|
|
|
+ error = xfs_update_alignment(mp);
|
|
if (error)
|
|
if (error)
|
|
goto error1;
|
|
goto error1;
|
|
|
|
|
|
@@ -1137,10 +1135,12 @@ xfs_mountfs(
|
|
}
|
|
}
|
|
|
|
|
|
/*
|
|
/*
|
|
- * If fs is not mounted readonly, then update the superblock changes.
|
|
|
|
|
|
+ * If this is a read-only mount defer the superblock updates until
|
|
|
|
+ * the next remount into writeable mode. Otherwise we would never
|
|
|
|
+ * perform the update e.g. for the root filesystem.
|
|
*/
|
|
*/
|
|
- if (update_flags && !(mp->m_flags & XFS_MOUNT_RDONLY)) {
|
|
|
|
- error = xfs_mount_log_sb(mp, update_flags);
|
|
|
|
|
|
+ if (mp->m_update_flags && !(mp->m_flags & XFS_MOUNT_RDONLY)) {
|
|
|
|
+ error = xfs_mount_log_sb(mp, mp->m_update_flags);
|
|
if (error) {
|
|
if (error) {
|
|
cmn_err(CE_WARN, "XFS: failed to write sb changes");
|
|
cmn_err(CE_WARN, "XFS: failed to write sb changes");
|
|
goto error4;
|
|
goto error4;
|
|
@@ -1820,7 +1820,7 @@ xfs_uuid_mount(
|
|
* be altered by the mount options, as well as any potential sb_features2
|
|
* be altered by the mount options, as well as any potential sb_features2
|
|
* fixup. Only the first superblock is updated.
|
|
* fixup. Only the first superblock is updated.
|
|
*/
|
|
*/
|
|
-STATIC int
|
|
|
|
|
|
+int
|
|
xfs_mount_log_sb(
|
|
xfs_mount_log_sb(
|
|
xfs_mount_t *mp,
|
|
xfs_mount_t *mp,
|
|
__int64_t fields)
|
|
__int64_t fields)
|