From owner-svn-src-head@freebsd.org Wed Apr 18 22:24:45 2018 Return-Path: Delivered-To: svn-src-head@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 7CE7AF86E1F; Wed, 18 Apr 2018 22:24:45 +0000 (UTC) (envelope-from mckusick@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client CN "mxrelay.nyi.freebsd.org", Issuer "Let's Encrypt Authority X3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 1EA6E71E3A; Wed, 18 Apr 2018 22:24:45 +0000 (UTC) (envelope-from mckusick@FreeBSD.org) Received: from repo.freebsd.org (repo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 13BDF20F39; Wed, 18 Apr 2018 22:24:45 +0000 (UTC) (envelope-from mckusick@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id w3IMOi4r047314; Wed, 18 Apr 2018 22:24:44 GMT (envelope-from mckusick@FreeBSD.org) Received: (from mckusick@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id w3IMOi4i047313; Wed, 18 Apr 2018 22:24:44 GMT (envelope-from mckusick@FreeBSD.org) Message-Id: <201804182224.w3IMOi4i047313@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: mckusick set sender to mckusick@FreeBSD.org using -f From: Kirk McKusick Date: Wed, 18 Apr 2018 22:24:44 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r332741 - head/tools/diag/prtblknos X-SVN-Group: head X-SVN-Commit-Author: mckusick X-SVN-Commit-Paths: head/tools/diag/prtblknos X-SVN-Commit-Revision: 332741 X-SVN-Commit-Repository: base MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-head@freebsd.org X-Mailman-Version: 2.1.25 Precedence: list List-Id: SVN commit messages for the src tree for head/-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 18 Apr 2018 22:24:45 -0000 Author: mckusick Date: Wed Apr 18 22:24:44 2018 New Revision: 332741 URL: https://svnweb.freebsd.org/changeset/base/332741 Log: Check the inode type and only attempt to print block lists for regular files, directories, and symbolic links that require external storage. Correct the handling of files with holes and files that have one or more large blocks and end with a fragment. Reported by: bde Modified: head/tools/diag/prtblknos/prtblknos.c Modified: head/tools/diag/prtblknos/prtblknos.c ============================================================================== --- head/tools/diag/prtblknos/prtblknos.c Wed Apr 18 21:31:13 2018 (r332740) +++ head/tools/diag/prtblknos/prtblknos.c Wed Apr 18 22:24:44 2018 (r332741) @@ -49,21 +49,65 @@ prtblknos(disk, dp) struct uufsd *disk; union dinode *dp; { - int i, len, lbn, frags, numblks, blksperindir; + int i, len, lbn, mode, frags, numblks, blksperindir; ufs2_daddr_t blkno; struct fs *fs; off_t size; fs = (struct fs *)&disk->d_sb; - if (fs->fs_magic == FS_UFS1_MAGIC) + if (fs->fs_magic == FS_UFS1_MAGIC) { size = dp->dp1.di_size; - else + mode = dp->dp1.di_mode; + } else { size = dp->dp2.di_size; - numblks = howmany(size, fs->fs_bsize); - if (numblks == 0) { - printf(" empty file\n"); + mode = dp->dp2.di_mode; + } + switch (mode & IFMT) { + case IFIFO: + printf("fifo\n"); return; + case IFCHR: + printf("character device\n"); + return; + case IFBLK: + printf("block device\n"); + return; + case IFSOCK: + printf("socket\n"); + return; + case IFWHT: + printf("whiteout\n"); + return; + case IFLNK: + if (size == 0) { + printf("empty symbolic link\n"); + return; + } + if (size < fs->fs_maxsymlinklen) { + printf("symbolic link referencing %s\n", + (fs->fs_magic == FS_UFS1_MAGIC) ? + (char *)dp->dp1.di_db : + (char *)dp->dp2.di_db); + return; + } + printf("symbolic link\n"); + break; + case IFREG: + if (size == 0) { + printf("empty file\n"); + return; + } + printf("regular file, size %ld\n", size); + break; + case IFDIR: + if (size == 0) { + printf("empty directory\n"); + return; + } + printf("directory, size %ld\n", size); + break; } + numblks = howmany(size, fs->fs_bsize); len = numblks < UFS_NDADDR ? numblks : UFS_NDADDR; for (i = 0; i < len; i++) { if (i < numblks - 1) @@ -110,6 +154,11 @@ indirprt(disk, level, blksperindir, lbn, blkno, lastlb int i, last; fs = (struct fs *)&disk->d_sb; + if (blkno == 0) { + printblk(fs, lbn, blkno, + blksperindir * NINDIR(fs) * fs->fs_frag, lastlbn); + return; + } printblk(fs, lbn, blkno, fs->fs_frag, -level); /* read in the indirect block. */ if (bread(disk, fsbtodb(fs, blkno), indir, fs->fs_bsize) == -1) @@ -178,12 +227,12 @@ printblk(fs, lbn, blkno, numblks, lastlbn) if (lastlbn <= 0) goto flush; if (seq == 0) { - seq = 1; + seq = howmany(numblks, fs->fs_frag); firstblk = blkno; return; } if (lbn == 0) { - seq = 1; + seq = howmany(numblks, fs->fs_frag); lastblk = 0; firstblk = blkno; lastindirblk = 0; @@ -192,8 +241,8 @@ printblk(fs, lbn, blkno, numblks, lastlbn) if (lbn < lastlbn && ((firstblk == 0 && blkno == 0) || (firstblk == BLK_NOCOPY && blkno == BLK_NOCOPY) || (firstblk == BLK_SNAP && blkno == BLK_SNAP) || - blkno == firstblk + seq * numblks)) { - seq++; + blkno == firstblk + seq * fs->fs_frag)) { + seq += howmany(numblks, fs->fs_frag); return; } flush: