Index: sys/geom/label/g_label_ufs.c =================================================================== --- sys/geom/label/g_label_ufs.c +++ sys/geom/label/g_label_ufs.c @@ -45,6 +45,9 @@ #define G_LABEL_UFS_VOLUME 0 #define G_LABEL_UFS_ID 1 +#define G_LABEL_DIFF(a, b) abs(a - b) +#define G_LABEL_MAX_DIFF 0x100 + static const int superblocks[] = SBLOCKSEARCH; static void @@ -82,18 +85,28 @@ if (fs == NULL) continue; /* - * Check for magic. We also need to check if file system size is equal + * Check for magic. We also need to check if file system size is almost equal * to providers size, because sysinstall(8) used to bogusly put first * partition at offset 0 instead of 16, and glabel/ufs would find file * system on slice instead of partition. + * + * In addition, media size can be a bit bigger than file system size. For instance, + * mkuzip can append bytes to align data to large sector size (it improves + * compression rates). */ + if (fs->fs_magic == FS_UFS1_MAGIC || fs->fs_magic == FS_UFS2_MAGIC){ + G_LABEL_DEBUG(1, "%s %s params: %jd, %d, %d, %jd\n", + fs->fs_magic == FS_UFS1_MAGIC ? "UFS1" : "UFS2", pp->name, + pp->mediasize, fs->fs_fsize, fs->fs_old_size, fs->fs_providersize); + } + if (fs->fs_magic == FS_UFS1_MAGIC && fs->fs_fsize > 0 && - ((pp->mediasize / fs->fs_fsize == fs->fs_old_size) || - (pp->mediasize / fs->fs_fsize == fs->fs_providersize))) { + ((G_LABEL_DIFF(pp->mediasize / fs->fs_fsize, fs->fs_old_size) < G_LABEL_MAX_DIFF) || + (G_LABEL_DIFF(pp->mediasize / fs->fs_fsize, fs->fs_providersize) < G_LABEL_MAX_DIFF))) { /* Valid UFS1. */ } else if (fs->fs_magic == FS_UFS2_MAGIC && fs->fs_fsize > 0 && - ((pp->mediasize / fs->fs_fsize == fs->fs_size) || - (pp->mediasize / fs->fs_fsize == fs->fs_providersize))) { + ((G_LABEL_DIFF(pp->mediasize / fs->fs_fsize, fs->fs_size) < G_LABEL_MAX_DIFF) || + (G_LABEL_DIFF(pp->mediasize / fs->fs_fsize, fs->fs_providersize) < G_LABEL_MAX_DIFF))) { /* Valid UFS2. */ } else { g_free(fs);