git: af433832f752 - main - geom_label: Remove an old sysinstall(8) workaround

Jessica Clarke jrtc27 at freebsd.org
Mon Jul 5 19:58:58 UTC 2021


On 5 Jul 2021, at 19:56, Cy Schubert <Cy.Schubert at cschubert.com> wrote:
> 
> In message <E77F3B91-8B43-4936-AFFB-B96C8580467A at freebsd.org>, Jessica 
> Clarke w
> rites:
>> On 5 Jul 2021, at 19:36, Cy Schubert <Cy.Schubert at cschubert.com> wrote:
>>> 
>>> In message <202107051517.165FHsfD012512 at gitrepo.freebsd.org>, Jessica 
>>> Clarke wr
>>> ites:
>>>> The branch main has been updated by jrtc27:
>>>> 
>>>> URL: https://cgit.FreeBSD.org/src/commit/?id=af433832f7520840c22edd1fe1266
>> c1a
>>>> 5cb781ad
>>>> 
>>>> commit af433832f7520840c22edd1fe1266c1a5cb781ad
>>>> Author:     Jessica Clarke <jrtc27 at FreeBSD.org>
>>>> AuthorDate: 2021-07-05 15:15:32 +0000
>>>> Commit:     Jessica Clarke <jrtc27 at FreeBSD.org>
>>>> CommitDate: 2021-07-05 15:15:32 +0000
>>>> 
>>>>   geom_label: Remove an old sysinstall(8) workaround
>>>> 
>>>>   We removed sysinstall(8) back in 2011, so this workaround should be lon
>> g
>>>>   since unnecessary. This workaround can end up breaking cases that are
>>>>   hit in the real world, such as dd'ing a small pre-built disk image to a
>>>>   large partition that you intend to grow on first boot and uses a UFS
>>>>   disk label for / in its /etc/fstab (as the only reliable thing a raw UF
>> S
>>>>   image can reference).
>>>> 
>>>>   Reviewed by:    imp, mckusick
>>>>   Differential Revision:  https://reviews.freebsd.org/D30825
>>>> ---
>>>> sys/geom/label/g_label_ufs.c | 35 +++++------------------------------
>>>> 1 file changed, 5 insertions(+), 30 deletions(-)
>>>> 
>>>> diff --git a/sys/geom/label/g_label_ufs.c b/sys/geom/label/g_label_ufs.c
>>>> index ababbaa4b43a..70d59488d7b6 100644
>>>> --- a/sys/geom/label/g_label_ufs.c
>>>> +++ b/sys/geom/label/g_label_ufs.c
>>>> @@ -49,19 +49,8 @@ __FBSDID("$FreeBSD$");
>>>> #define	G_LABEL_UFS_ID		1
>>>> 
>>>> /*
>>>> - * G_LABEL_UFS_CMP returns true if difference between provider mediasize
>>>> - * and filesystem size is less than G_LABEL_UFS_MAXDIFF sectors
>>>> - */
>>>> -#define	G_LABEL_UFS_CMP(prov, fsys, size) 			
>>>> 	   \
>>>> -	( abs( ((fsys)->size) - ( (prov)->mediasize / (fsys)->fs_fsize ))  \
>>>> -				< G_LABEL_UFS_MAXDIFF )
>>>> -#define	G_LABEL_UFS_MAXDIFF	0x100
>>>> -
>>>> -/*
>>>> - * Try to find a superblock on the provider. If successful, then
>>>> - * check that the size in the superblock corresponds to the size
>>>> - * of the underlying provider. Finally, look for a volume label
>>>> - * and create an appropriate provider based on that.
>>>> + * Try to find a superblock on the provider. If successful, look for a vo
>> lum
>>>> e
>>>> + * label and create an appropriate provider based on that.
>>>> */
>>>> static void
>>>> g_label_ufs_taste_common(struct g_consumer *cp, char *label, size_t size, 
>> in
>>>> t what)
>>>> @@ -81,24 +70,10 @@ g_label_ufs_taste_common(struct g_consumer *cp, char *
>> lab
>>>> el, size_t size, int wh
>>>> 		return;
>>>> 	}
>>>> 
>>>> -	/*
>>>> -	 * 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_fsize > 0 &&
>>>> -	    ( G_LABEL_UFS_CMP(pp, fs, fs_old_size)
>>>> -		|| G_LABEL_UFS_CMP(pp, fs, fs_providersize))) {
>>>> +	/* Check for magic. */
>>>> +	if (fs->fs_magic == FS_UFS1_MAGIC && fs->fs_fsize > 0) {
>>>> 		/* Valid UFS1. */
>>>> -	} else if (fs->fs_magic == FS_UFS2_MAGIC && fs->fs_fsize > 0 &&
>>>> -	    ( G_LABEL_UFS_CMP(pp, fs, fs_size)
>>>> -		|| G_LABEL_UFS_CMP(pp, fs, fs_providersize))) {
>>>> +	} else if (fs->fs_magic == FS_UFS2_MAGIC && fs->fs_fsize > 0) {
>>>> 		/* Valid UFS2. */
>>>> 	} else {
>>>> 		goto out;
>>>> 
>>> 
>>> On one of my machines which uses UFS filesystems (sandbox) also fails:
>>> 
>>> bob# ls /dev/ufs
>>> s10-amd64	s13-amd64	s13-amd64e	test
>>> s11-amd64	s13-amd64a	s13-amd64f	testa
>>> s12-amd64	s13-amd64d	s13-i386
>>> bob# mount /alt/s11-amd64/root
>>> bob# ls /dev/ufs
>>> s10-amd64	s12-amd64	test
>>> s11-amd64	s13-i386	testa
>>> bob# 
>>> 
>>> After the mount of /alt/s11-amd64/root, s10-amd64 the s13-* filesystems 
>>> become unavailble  They share the same fdisk slice, using different 
>>> bsdlabel partitions within the slice.
>>> 
>>> My laptop zfs pool is on a partition in the same slice as its UFS 
>>> filesystems. Looks like once a filesystem on a slice has been mounted, the 
>>> other partitions within the slice are no longer available following this 
>>> commit.
>> 
>> Hm, what does bsdlabel on the disk say? My guess is your disk is set up
>> in the bogus manner mentioned in that comment. Is it an old machine
>> installed by sysinstall(8)?
> 
> A little more investigation shows that on the two affected machines, UFS 
> partitions are at offset 0 of their respective slices. For legacy 
> environments this will require some kind of workaround or boot off a rescue 
> disk (which I do have) to dump/recreate/restore the partitions at an offset 
> that is not zero. The problem is quite logical.
> 
> Doing the work to recreate the partitions doesn't bother me but other 
> people may trip across this. Your call.

How about something like D31068?

Jess



More information about the dev-commits-src-all mailing list