Date: Wed, 18 Apr 2018 22:24:44 +0000 (UTC) From: Kirk McKusick <mckusick@FreeBSD.org> To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r332741 - head/tools/diag/prtblknos Message-ID: <201804182224.w3IMOi4i047313@repo.freebsd.org>
next in thread | raw e-mail | index | archive | help
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:
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201804182224.w3IMOi4i047313>