svn commit: r235918 - head/sys/geom/label

Jung-uk Kim jkim at FreeBSD.org
Thu May 24 22:17:43 UTC 2012


-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

On 2012-05-24 16:59:58 -0400, Jung-uk Kim wrote:
> On 2012-05-24 12:48:33 -0400, Edward Tomasz Napierala wrote:
>> Author: trasz Date: Thu May 24 16:48:33 2012 New Revision: 235918
>>  URL: http://svn.freebsd.org/changeset/base/235918
>> 
>> Log: Make g_label(4) ignore provider size when looking for UFS 
>> labels. Without it, it fails to create labels for filesystems 
>> resized by growfs(8).
>> 
>> PR:		kern/165962 Submitted by:	Olivier Cochard-Labbe <olivier at
>> cochard dot me>
>> 
>> Modified: head/sys/geom/label/g_label_ufs.c
> 
> This commit broke my fstab based on ufsid.  I have something like
> this in my fstab:
> 
> /dev/ufsid/44b3df81873011b5 /    ufs rw,noatime 1 1 
> /dev/ufsid/463b935456452bbd /tmp ufs rw,noatime 2 2 
> /dev/ufsid/44b3dfc4bfcc4c30 /usr ufs rw,noatime 2 2 
> /dev/ufsid/463b934b955f63ff /var ufs rw,noatime 2 2
> 
> Mounting / as read-only went fine and I had /dev/ada0s1a, 
> /dev/ada0s1d, etc.  Strangely, I also had matching ufsid's under 
> /dev/ufsid, e.g., /dev/ufsid/<some_ufsid>a,
> /dev/ufsid/<some_ufsid>d, etc.  However, once I do 'mount -u -w /',
> everything disappears except for root's ufsid.
> 
> Reverting this commit fixed the problem for me.

The attached patch fixed my problem and kern/165962.

Jung-uk Kim
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2.0.19 (FreeBSD)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/

iEYEARECAAYFAk++s4YACgkQmlay1b9qnVO5uACglaXhj9ZXwpUiroMUxqkbHF/v
Qm0An0lHidiRMenHsDLTaiC0Wqz0cYB6
=k1Ff
-----END PGP SIGNATURE-----
-------------- next part --------------
Index: sys/geom/label/g_label_ufs.c
===================================================================
--- sys/geom/label/g_label_ufs.c	(revision 235941)
+++ sys/geom/label/g_label_ufs.c	(working copy)
@@ -51,8 +51,9 @@ static void
 g_label_ufs_taste_common(struct g_consumer *cp, char *label, size_t size, int what)
 {
 	struct g_provider *pp;
+	struct fs *fs;
+	off_t fs_size;
 	int sb, superblock;
-	struct fs *fs;
 
 	g_topology_assert_not();
 	pp = cp->provider;
@@ -82,11 +83,19 @@ g_label_ufs_taste_common(struct g_consumer *cp, ch
 		if (fs == NULL)
 			continue;
 		/* 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) {
-		    	/* Valid UFS2. */
-		} else {
+		switch (fs->fs_magic) {
+		case FS_UFS1_MAGIC:
+		case FS_UFS2_MAGIC:
+			if (fs->fs_fsize > 0) {
+				if (what == G_LABEL_UFS_VOLUME)
+					break;
+				fs_size = (fs->fs_magic == FS_UFS1_MAGIC) ?
+				    fs->fs_old_size : fs->fs_size;
+				if (pp->mediasize / fs->fs_fsize == fs_size)
+					break;
+			}
+			/* FALLTHROUGH */
+		default:
 			g_free(fs);
 			continue;
 		}


More information about the svn-src-all mailing list