From owner-svn-src-all@FreeBSD.ORG Sun Feb 3 12:17:51 2013 Return-Path: Delivered-To: svn-src-all@freebsd.org Received: from mx1.freebsd.org (mx1.FreeBSD.org [8.8.178.115]) by hub.freebsd.org (Postfix) with ESMTP id 3DA29E4B; Sun, 3 Feb 2013 12:17:51 +0000 (UTC) (envelope-from trasz@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) by mx1.freebsd.org (Postfix) with ESMTP id 215D7632; Sun, 3 Feb 2013 12:17:51 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.5/8.14.5) with ESMTP id r13CHpuG069453; Sun, 3 Feb 2013 12:17:51 GMT (envelope-from trasz@svn.freebsd.org) Received: (from trasz@localhost) by svn.freebsd.org (8.14.5/8.14.5/Submit) id r13CHnX5069446; Sun, 3 Feb 2013 12:17:49 GMT (envelope-from trasz@svn.freebsd.org) Message-Id: <201302031217.r13CHnX5069446@svn.freebsd.org> From: Edward Tomasz Napierala Date: Sun, 3 Feb 2013 12:17:49 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-9@freebsd.org Subject: svn commit: r246284 - in stable/9: sbin/dumpfs sbin/growfs sbin/newfs sys/geom/label sys/ufs/ffs X-SVN-Group: stable-9 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 03 Feb 2013 12:17:51 -0000 Author: trasz Date: Sun Feb 3 12:17:49 2013 New Revision: 246284 URL: http://svnweb.freebsd.org/changeset/base/246284 Log: MFC r242379: Fix problem with geom_label(4) not recognizing UFS labels on filesystems extended using growfs(8). The problem here is that geom_label checks if the filesystem size recorded in UFS superblock is equal to the provider (i.e. device) size. This check cannot be removed due to backward compatibility. On the other hand, in most cases growfs(8) cannot set fs_size in the superblock to match the provider size, because, differently from newfs(8), it cannot recompute cylinder group sizes. To fix this problem, add another superblock field, fs_providersize, used only for this purpose. The geom_label(4) will attach if either fs_size (filesystem created with newfs(8)) or fs_providersize (filesystem expanded using growfs(8)) matches the device size. PR: kern/165962 Reviewed by: mckusick Sponsored by: FreeBSD Foundation Modified: stable/9/sbin/dumpfs/dumpfs.c stable/9/sbin/growfs/growfs.c stable/9/sbin/newfs/mkfs.c stable/9/sbin/newfs/newfs.c stable/9/sbin/newfs/newfs.h stable/9/sys/geom/label/g_label_ufs.c stable/9/sys/ufs/ffs/fs.h Directory Properties: stable/9/sbin/dumpfs/ (props changed) stable/9/sbin/growfs/ (props changed) stable/9/sbin/newfs/ (props changed) stable/9/sys/ (props changed) Modified: stable/9/sbin/dumpfs/dumpfs.c ============================================================================== --- stable/9/sbin/dumpfs/dumpfs.c Sun Feb 3 10:26:24 2013 (r246283) +++ stable/9/sbin/dumpfs/dumpfs.c Sun Feb 3 12:17:49 2013 (r246284) @@ -277,8 +277,9 @@ dumpfs(const char *name) printf("unknown flags (%#x)", fsflags); putchar('\n'); printf("fsmnt\t%s\n", afs.fs_fsmnt); - printf("volname\t%s\tswuid\t%ju\n", - afs.fs_volname, (uintmax_t)afs.fs_swuid); + printf("volname\t%s\tswuid\t%ju\tprovidersize\t%ju\n", + afs.fs_volname, (uintmax_t)afs.fs_swuid, + (uintmax_t)afs.fs_providersize); printf("\ncs[].cs_(nbfree,ndir,nifree,nffree):\n\t"); afs.fs_csp = calloc(1, afs.fs_cssize); if (bread(&disk, fsbtodb(&afs, afs.fs_csaddr), afs.fs_csp, afs.fs_cssize) == -1) Modified: stable/9/sbin/growfs/growfs.c ============================================================================== --- stable/9/sbin/growfs/growfs.c Sun Feb 3 10:26:24 2013 (r246283) +++ stable/9/sbin/growfs/growfs.c Sun Feb 3 12:17:49 2013 (r246284) @@ -1504,6 +1504,7 @@ main(int argc, char **argv) } sblock.fs_size = dbtofsb(&osblock, size / DEV_BSIZE); + sblock.fs_providersize = dbtofsb(&osblock, mediasize / DEV_BSIZE); /* * Are we really growing? Modified: stable/9/sbin/newfs/mkfs.c ============================================================================== --- stable/9/sbin/newfs/mkfs.c Sun Feb 3 10:26:24 2013 (r246283) +++ stable/9/sbin/newfs/mkfs.c Sun Feb 3 12:17:49 2013 (r246284) @@ -263,6 +263,7 @@ restart: } sblock.fs_fsbtodb = ilog2(sblock.fs_fsize / sectorsize); sblock.fs_size = fssize = dbtofsb(&sblock, fssize); + sblock.fs_providersize = dbtofsb(&sblock, mediasize / sectorsize); /* * Before the filesystem is finally initialized, mark it Modified: stable/9/sbin/newfs/newfs.c ============================================================================== --- stable/9/sbin/newfs/newfs.c Sun Feb 3 10:26:24 2013 (r246283) +++ stable/9/sbin/newfs/newfs.c Sun Feb 3 12:17:49 2013 (r246284) @@ -94,6 +94,7 @@ int lflag; /* enable multilabel for fi int nflag; /* do not create .snap directory */ int tflag; /* enable TRIM */ intmax_t fssize; /* file system size */ +off_t mediasize; /* device size */ int sectorsize; /* bytes/sector */ int realsectorsize; /* bytes/sector in hardware */ int fsize = 0; /* fragment size */ @@ -135,7 +136,6 @@ main(int argc, char *argv[]) char *cp, *special; intmax_t reserved; int ch, i, rval; - off_t mediasize; char part_name; /* partition name, default to full disk */ part_name = 'c'; Modified: stable/9/sbin/newfs/newfs.h ============================================================================== --- stable/9/sbin/newfs/newfs.h Sun Feb 3 10:26:24 2013 (r246283) +++ stable/9/sbin/newfs/newfs.h Sun Feb 3 12:17:49 2013 (r246284) @@ -87,6 +87,7 @@ extern int lflag; /* enable multilabel extern int nflag; /* do not create .snap directory */ extern int tflag; /* enable TRIM */ extern intmax_t fssize; /* file system size */ +extern off_t mediasize; /* device size */ extern int sectorsize; /* bytes/sector */ extern int realsectorsize; /* bytes/sector in hardware*/ extern int fsize; /* fragment size */ Modified: stable/9/sys/geom/label/g_label_ufs.c ============================================================================== --- stable/9/sys/geom/label/g_label_ufs.c Sun Feb 3 10:26:24 2013 (r246283) +++ stable/9/sys/geom/label/g_label_ufs.c Sun Feb 3 12:17:49 2013 (r246284) @@ -86,7 +86,8 @@ g_label_ufs_taste_common(struct g_consum pp->mediasize / fs->fs_fsize == fs->fs_old_size) { /* 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_size) || + (pp->mediasize / fs->fs_fsize == fs->fs_providersize))) { /* Valid UFS2. */ } else { g_free(fs); Modified: stable/9/sys/ufs/ffs/fs.h ============================================================================== --- stable/9/sys/ufs/ffs/fs.h Sun Feb 3 10:26:24 2013 (r246283) +++ stable/9/sys/ufs/ffs/fs.h Sun Feb 3 12:17:49 2013 (r246284) @@ -332,7 +332,8 @@ struct fs { int32_t fs_old_cpc; /* cyl per cycle in postbl */ int32_t fs_maxbsize; /* maximum blocking factor permitted */ int64_t fs_unrefs; /* number of unreferenced inodes */ - int64_t fs_sparecon64[16]; /* old rotation block list head */ + int64_t fs_providersize; /* size of underlying GEOM provider */ + int64_t fs_sparecon64[15]; /* old rotation block list head */ int64_t fs_sblockloc; /* byte offset of standard superblock */ struct csum_total fs_cstotal; /* (u) cylinder summary information */ ufs_time_t fs_time; /* last time written */