Prevented unnecessary superblock rewrites if old version in superblock chain
Because multiple, out-of-date superblocks can exist in our superblock chain, we need to be careful to make sure newer superblock entries override older superblock entries. If we see an older on-disk minor version in the superblock chain, we were correctly overriding the on-disk minor version, but we were also leaving the "needs superblock" bit set in our consistency state. This isn't a hard-error, but would lead to a superblock rewrite every mount. The rewrite would make no progress, as the out-of-date version is effectively immutable at this point, and just waste prog cycles. This should fix that by clearing the "needs superblock" bit if we see a newer on-disk minor version.
This commit is contained in:
@@ -4469,6 +4469,7 @@ static int lfs_mount_(lfs_t *lfs, const struct lfs_config *cfg) {
|
|||||||
// found older minor version? set an in-device only bit in the
|
// found older minor version? set an in-device only bit in the
|
||||||
// gstate so we know we need to rewrite the superblock before
|
// gstate so we know we need to rewrite the superblock before
|
||||||
// the first write
|
// the first write
|
||||||
|
bool needssuperblock = false;
|
||||||
if (minor_version < lfs_fs_disk_version_minor(lfs)) {
|
if (minor_version < lfs_fs_disk_version_minor(lfs)) {
|
||||||
LFS_DEBUG("Found older minor version "
|
LFS_DEBUG("Found older minor version "
|
||||||
"v%"PRIu16".%"PRIu16" < v%"PRIu16".%"PRIu16,
|
"v%"PRIu16".%"PRIu16" < v%"PRIu16".%"PRIu16,
|
||||||
@@ -4476,10 +4477,11 @@ static int lfs_mount_(lfs_t *lfs, const struct lfs_config *cfg) {
|
|||||||
minor_version,
|
minor_version,
|
||||||
lfs_fs_disk_version_major(lfs),
|
lfs_fs_disk_version_major(lfs),
|
||||||
lfs_fs_disk_version_minor(lfs));
|
lfs_fs_disk_version_minor(lfs));
|
||||||
|
needssuperblock = true;
|
||||||
|
}
|
||||||
// note this bit is reserved on disk, so fetching more gstate
|
// note this bit is reserved on disk, so fetching more gstate
|
||||||
// will not interfere here
|
// will not interfere here
|
||||||
lfs_fs_prepsuperblock(lfs, true);
|
lfs_fs_prepsuperblock(lfs, needssuperblock);
|
||||||
}
|
|
||||||
|
|
||||||
// check superblock configuration
|
// check superblock configuration
|
||||||
if (superblock.name_max) {
|
if (superblock.name_max) {
|
||||||
|
|||||||
Reference in New Issue
Block a user