Date: Wed, 24 Jan 2007 15:37:39 -0500 (EST) From: Toby Burress <kurin@delete.org> To: FreeBSD-gnats-submit@FreeBSD.org Subject: bin/108320: dumpfs(8) lists wrong file system size [PATCH?] Message-ID: <20070124203739.C87DD8446A@cobalt.delete.org> Resent-Message-ID: <200701242110.l0OLAJuu000629@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
>Number: 108320 >Category: bin >Synopsis: dumpfs(8) lists wrong file system size [PATCH?] >Confidential: no >Severity: serious >Priority: medium >Responsible: freebsd-bugs >State: open >Quarter: >Keywords: >Date-Required: >Class: sw-bug >Submitter-Id: current-users >Arrival-Date: Wed Jan 24 21:10:18 GMT 2007 >Closed-Date: >Last-Modified: >Originator: Toby Burress >Release: FreeBSD 6.1-RELEASE amd64 >Organization: >Environment: /usr/src/sbin/dumpfs >Description: When using dumpfs(8) to check the file system size, and in particular dumpfs -m to find a command that creates the file system, the size listed is smaller than the actual size of the file system. >How-To-Repeat: Run the following shell script (without warranty, etc etc, it doesn't do anything bad but don't blame me if your power supply explodes) and note the df lines. #!/bin/sh touch testfile FS=`mdconfig -a -t vnode -f testfile -s 200M` fdisk -I /dev/${FS} bsdlabel -w /dev/${FS}s1 newfs /dev/${FS}s1a dumpfs -m /dev/${FS}s1a > newfsfile mount /dev/${FS}s1a /mnt df -h /mnt umount /dev/${FS}s1a sh newfsfile mount /dev/${FS}s1a /mnt df -h /mnt umount /dev/${FS}s1a mdconfig -d -u ${FS} rm testfile newfsfile >Fix: In my case the reported file system size is 4 times too small. This just happens to be the size of the "ncg" parameter. So I think a fix might be: --- dumpfs.c.old Fri Apr 9 15:58:27 2004 +++ dumpfs.c Wed Jan 24 14:57:19 2007 @@ -135,7 +135,7 @@ printf("superblock location\t%jd\tid\t[ %x %x ]\n", (intmax_t)afs.fs_sblockloc, afs.fs_id[0], afs.fs_id[1]); printf("ncg\t%d\tsize\t%jd\tblocks\t%jd\n", - afs.fs_ncg, (intmax_t)fssize, (intmax_t)afs.fs_dsize); + afs.fs_ncg, (intmax_t)fssize * afs.fs_ncg, (intmax_t)afs.fs_dsize); break; case 1: fssize = afs.fs_old_size; @@ -144,7 +144,7 @@ afs.fs_magic, ctime(&fstime)); printf("id\t[ %x %x ]\n", afs.fs_id[0], afs.fs_id[1]); printf("ncg\t%d\tsize\t%jd\tblocks\t%jd\n", - afs.fs_ncg, (intmax_t)fssize, (intmax_t)afs.fs_dsize); + afs.fs_ncg, (intmax_t)fssize * afs.fs_ncg, (intmax_t)afs.fs_dsize); break; default: goto err; @@ -367,7 +367,7 @@ break; } /* -p..r unimplemented */ - printf("-s %jd ", (intmax_t)fs->fs_size); + printf("-s %jd ", (intmax_t)fs->fs_size * fs->fs_ncg); printf("%s ", disk.d_name); printf("\n"); Of course, long experience has taught me that I never know what I'm talking about, so even though this gives the right answers, maybe the fix is somewhere else? Either way, dumpfs is wrong and needs to be fixed. >Release-Note: >Audit-Trail: >Unformatted:
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20070124203739.C87DD8446A>