mjy@sdti.SDTI.COM (Michael J. Young) (01/21/89)
This is an official upgrade to bring fsanalyze from v4.1 PL2 to v4.2. This version contains the following new functionality: 1. A new option '-n' has been added which causes fsanalyze to report the pathnames of the most-fragmented files, rather than just the inode numbers. This option uses ncheck to do its dirty work. Thanks to Chip Rosenthal (chip@vector.UUCP) for providing the code for this. 2. A new option '-t' makes it possible to specify the number of files to include in the most-fragmented file list. The default is still NUMOFFEND (10). 3. A new option '-s' causes fsanalyze to send progress reports to stderr. This is sometimes useful when the output of fsanalyze is being captured to a file or piped to another process. Please apply the following patches to the 4.1 PL2 source and run 'make'. Note: make sure you have applied patches 1 & 2 before applying this patch. If you have not received the two previous patches, they may be obtained from me at mjy@sdti.SDTI.COM. ------------------ Index: Changes Prereq: 4.1 *** ../prev/Changes Fri Jan 20 10:12:38 1989 --- Changes Fri Jan 20 10:14:37 1989 *************** *** 92,94 Release 4.1 contains no major changes from 3.04, but resulted from placing the code under SCCS. --- 92,104 ----- Release 4.1 contains no major changes from 3.04, but resulted from placing the code under SCCS. + + Release 4.2 adds three new options: + '-n' causes fsanalyze to report the pathnames of the most + fragmented files. The pathnames are generated by + invoking ncheck. + '-s' causes fsanalyze to report its progress on stderr. + This is sometimes useful when the output of fsanalyze + is being captured to a file or piped to another process. + '-t' may be used to specify how many files to report in the + most-fragmented file list. The default is still 10 files. Index: Mkfile.sun Prereq: 4.1.1.1 *** ../prev/Mkfile.sun Fri Jan 20 10:13:59 1989 --- Mkfile.sun Fri Jan 20 10:14:40 1989 *************** *** 1,4 ! ## @(#)$Id: Mkfile.sun, V4.1.1.1 89/01/10 10:48:45 $ ## ## FSANALYZE makefile ## Version : 4.1.1.1 - 89/01/10 10:48:45 --- 1,4 ----- ! ## @(#)$Id: Mkfile.sun, V4.2 89/01/20 10:10:40 $ ## ## FSANALYZE makefile ## Version : 4.2 - 89/01/20 10:10:40 *************** *** 1,7 ## @(#)$Id: Mkfile.sun, V4.1.1.1 89/01/10 10:48:45 $ ## ## FSANALYZE makefile ! ## Version : 4.1.1.1 - 89/01/10 10:48:45 ## One of the things FSANALYZE displays is a list of the most fragmented ## files. OFFEND determines how many of those files to report. --- 1,7 ----- ## @(#)$Id: Mkfile.sun, V4.2 89/01/20 10:10:40 $ ## ## FSANALYZE makefile ! ## Version : 4.2 - 89/01/20 10:10:40 ## One of the things FSANALYZE displays is a list of the most fragmented ## files. OFFEND determines how many of those files to report. Index: Mkfile.sys5 Prereq: 4.1.1.1 *** ../prev/Mkfile.sys5 Fri Jan 20 10:14:00 1989 --- Mkfile.sys5 Fri Jan 20 10:14:41 1989 *************** *** 1,4 ! ## @(#)$Id: Mkfile.sys5, V4.1.1.1 89/01/10 10:48:48 $ ## ## FSANALYZE makefile ## Version : 4.1.1.1 - 89/01/10 10:48:48 --- 1,4 ----- ! ## @(#)$Id: Mkfile.sys5, V4.2 89/01/20 10:10:43 $ ## ## FSANALYZE makefile ## Version : 4.2 - 89/01/20 10:10:43 *************** *** 1,7 ## @(#)$Id: Mkfile.sys5, V4.1.1.1 89/01/10 10:48:48 $ ## ## FSANALYZE makefile ! ## Version : 4.1.1.1 - 89/01/10 10:48:48 ## One of the things FSANALYZE displays is a list of the most fragmented ## files. OFFEND determines how many of those files to report. --- 1,7 ----- ## @(#)$Id: Mkfile.sys5, V4.2 89/01/20 10:10:43 $ ## ## FSANALYZE makefile ! ## Version : 4.2 - 89/01/20 10:10:43 ## One of the things FSANALYZE displays is a list of the most fragmented ## files. OFFEND determines how many of those files to report. Index: Mkfile.uport Prereq: 4.1.1.1 *** ../prev/Mkfile.uport Fri Jan 20 10:14:01 1989 --- Mkfile.uport Fri Jan 20 10:14:41 1989 *************** *** 1,4 ! ## @(#)$Id: Mkfile.uport, V4.1.1.1 89/01/10 10:48:51 $ ## ## FSANALYZE makefile ## Version : 4.1.1.1 - 89/01/10 10:48:51 --- 1,4 ----- ! ## @(#)$Id: Mkfile.uport, V4.2 89/01/20 10:10:46 $ ## ## FSANALYZE makefile ## Version : 4.2 - 89/01/20 10:10:46 *************** *** 1,7 ## @(#)$Id: Mkfile.uport, V4.1.1.1 89/01/10 10:48:51 $ ## ## FSANALYZE makefile ! ## Version : 4.1.1.1 - 89/01/10 10:48:51 ## One of the things FSANALYZE displays is a list of the most fragmented ## files. OFFEND determines how many of those files to report. --- 1,7 ----- ## @(#)$Id: Mkfile.uport, V4.2 89/01/20 10:10:46 $ ## ## FSANALYZE makefile ! ## Version : 4.2 - 89/01/20 10:10:46 ## One of the things FSANALYZE displays is a list of the most fragmented ## files. OFFEND determines how many of those files to report. Index: Mkfile.xenix Prereq: 4.1.1.1 *** ../prev/Mkfile.xenix Fri Jan 20 10:14:02 1989 --- Mkfile.xenix Fri Jan 20 10:14:42 1989 *************** *** 1,4 ! ## @(#)$Id: Mkfile.xenix, V4.1.1.1 89/01/10 10:48:54 $ ## ## FSANALYZE makefile ## Version : 4.1.1.1 - 89/01/10 10:48:54 --- 1,4 ----- ! ## @(#)$Id: Mkfile.xenix, V4.2 89/01/20 10:10:49 $ ## ## FSANALYZE makefile ## Version : 4.2 - 89/01/20 10:10:49 *************** *** 1,7 ## @(#)$Id: Mkfile.xenix, V4.1.1.1 89/01/10 10:48:54 $ ## ## FSANALYZE makefile ! ## Version : 4.1.1.1 - 89/01/10 10:48:54 ## One of the things FSANALYZE displays is a list of the most fragmented ## files. OFFEND determines how many of those files to report. --- 1,7 ----- ## @(#)$Id: Mkfile.xenix, V4.2 89/01/20 10:10:49 $ ## ## FSANALYZE makefile ! ## Version : 4.2 - 89/01/20 10:10:49 ## One of the things FSANALYZE displays is a list of the most fragmented ## files. OFFEND determines how many of those files to report. Index: README Prereq: 4.1.1.2 *** ../prev/README Fri Jan 20 10:12:47 1989 --- README Fri Jan 20 10:14:43 1989 *************** *** 1,5 FSANALYZE - File System Analyzer tool ! Version : 4.1.1.2 - 88/11/30 15:53:38 Author : Michael J. Young USmail : Software Development Technologies, Inc. --- 1,5 ----- FSANALYZE - File System Analyzer tool ! Version : 4.2 - 89/01/20 10:10:53 Author : Michael J. Young USmail : Software Development Technologies, Inc. Index: chkfile.c Prereq: 4.1.1.1 *** ../prev/chkfile.c Fri Jan 20 10:14:05 1989 --- chkfile.c Fri Jan 20 10:14:45 1989 *************** *** 1,4 ! static char sccsid[] = "@(#)$Id: chkfile.c, V4.1.1.1 89/01/10 10:48:57 $"; /* * chkfile.c - analyze file --- 1,4 ----- ! static char sccsid[] = "@(#)$Id: chkfile.c, V4.2 89/01/20 10:10:56 $"; /* * chkfile.c - analyze file *************** *** 2,8 /* * chkfile.c - analyze file ! * Version : 4.1.1.1 - 89/01/10 10:48:57 * * Author : Michael J. Young * USmail : Software Development Technologies, Inc. --- 2,8 ----- /* * chkfile.c - analyze file ! * Version : 4.2 - 89/01/20 10:10:56 * * Author : Michael J. Young * USmail : Software Development Technologies, Inc. *************** *** 39,44 * * Thu Jan 5 10:53:25 EST 1989 - Gerry Swislow (gerry@certif.UUCP), * Fixed bugs in some debugging statements! */ #include "fsconfig.h" --- 39,47 ----- * * Thu Jan 5 10:53:25 EST 1989 - Gerry Swislow (gerry@certif.UUCP), * Fixed bugs in some debugging statements! + * + * Fri Jan 20 09:41:20 EST 1989 - M. Young (mjy@sdti.SDTI.COM), + * Added '-s' flag */ #include "fsconfig.h" *************** *** 397,402 struct dinode i_node[MAXINOPB]; /* holds a block of inodes */ struct file_data data; /* per-inode statistics */ for (i = first_inode; i < num_inodes(fil_sys); i+=inopb(fil_sys)){ /* --- 400,409 ----- struct dinode i_node[MAXINOPB]; /* holds a block of inodes */ struct file_data data; /* per-inode statistics */ + if (status_flag){ + fprintf (stderr, "Scanning %ld inodes...\n", (long) num_inodes(fil_sys)); + } + for (i = first_inode; i < num_inodes(fil_sys); i+=inopb(fil_sys)){ if (status_flag){ *************** *** 398,403 struct file_data data; /* per-inode statistics */ for (i = first_inode; i < num_inodes(fil_sys); i+=inopb(fil_sys)){ /* * for efficiency, read a block of i-nodes at a time --- 405,414 ----- } for (i = first_inode; i < num_inodes(fil_sys); i+=inopb(fil_sys)){ + + if (status_flag){ + fprintf (stderr, "inode %-20d\r", i); + } /* * for efficiency, read a block of i-nodes at a time Index: fragm.c Prereq: 4.1 *** ../prev/fragm.c Fri Jan 20 10:12:53 1989 --- fragm.c Fri Jan 20 10:14:46 1989 *************** *** 1,4 ! static char sccsid[] = "@(#)$Id: fragm.c, V4.1 88/11/16 17:29:42 $"; /* * fragm.c - fragmentation analysis --- 1,4 ----- ! static char sccsid[] = "@(#)$Id: fragm.c, V4.2 89/01/20 10:11:04 $"; /* * fragm.c - fragmentation analysis *************** *** 2,8 /* * fragm.c - fragmentation analysis ! * Version : 4.1 - 88/11/16 17:29:42 * * Author : Michael J. Young * USmail : Software Development Technologies, Inc. --- 2,8 ----- /* * fragm.c - fragmentation analysis ! * Version : 4.2 - 89/01/20 10:11:04 * * Author : Michael J. Young * USmail : Software Development Technologies, Inc. *************** *** 33,38 * * Wed Nov 16 11:31:32 EST 1988 - M. Young (mjy@sdti.SDTI.COM), * Placed under SCCS */ /* --- 33,41 ----- * * Wed Nov 16 11:31:32 EST 1988 - M. Young (mjy@sdti.SDTI.COM), * Placed under SCCS + * + * Tue Jan 10 15:50:33 EST 1989 - M. Young (mjy@sdti.SDTI.COM), + * Workaround for braindamaged compiler that can't divide 0L/(long). */ /* *************** *** 104,111 { off_t bytes_per_cyl; ! bytes_per_cyl = (off_t)cyl_size * DEV_BSIZE; ! return (file_size / bytes_per_cyl); } /* --- 107,119 ----- { off_t bytes_per_cyl; ! if (file_size == 0){ ! return 0L; ! } ! else { ! bytes_per_cyl = (off_t)cyl_size * DEV_BSIZE; ! return (file_size / bytes_per_cyl); ! } } /* Index: fsanalyze.8 Prereq: 4.1.1.1 *** ../prev/fsanalyze.8 Fri Jan 20 10:13:36 1989 --- fsanalyze.8 Fri Jan 20 10:14:47 1989 *************** *** 5,11 .SH SYNOPSIS .B fsanalyze [ ! .B \-deiov [ .B \-b# ] [ --- 5,11 ----- .SH SYNOPSIS .B fsanalyze [ ! .B \-deinosv [ .B \-b# ] [ *************** *** 12,17 .B \-c# ] [ .B \-g# ] ] .B special [ --- 12,19 ----- .B \-c# ] [ .B \-g# + ] [ + .B \-t# ] ] .B special [ *************** *** 93,98 another source of file system overhead. Expressed as an absolute number and a percentage of the file system size. .LP .I Fsanalyze also lists the 10 most fragmented inodes in the file system. They are listed in decreasing order of fragmentation --- 95,101 ----- another source of file system overhead. Expressed as an absolute number and a percentage of the file system size. .LP + By default, .I Fsanalyze also lists the 10 most fragmented inodes in the file system. The number of files listed may be changed using the *************** *** 95,101 .LP .I Fsanalyze also lists the 10 most fragmented inodes in the file system. ! They are listed in decreasing order of fragmentation based on the absolute number of fragments. For example a 100-block file that contains 40 individual fragments is 39.39% fragmented (39 seeks / 99 potential seeks), but is listed before a 2-block file that contains 2 --- 98,107 ----- By default, .I Fsanalyze also lists the 10 most fragmented inodes in the file system. ! The number of files listed may be changed using the ! .B \-t ! option. ! The files are listed in decreasing order of fragmentation based on the absolute number of fragments. For example a 100-block file that contains 40 individual fragments is 39.39% fragmented (39 seeks / 99 potential seeks), but is listed before a 2-block file that contains 2 *************** *** 139,145 assume '#' sectors per disk cylinder -- by default, this value is determined by information in the superblock. .IP \fB\-d\fR ! display inode numbers as they are examined. This flag makes it easy to chart the progress of fsanalyze through the file system. Used mainly for debugging. .IP \fB\-e\fR --- 145,151 ----- assume '#' sectors per disk cylinder -- by default, this value is determined by information in the superblock. .IP \fB\-d\fR ! Display inode numbers as they are examined. This flag makes it easy to chart the progress of fsanalyze through the file system. Used mainly for debugging. .IP \fB\-e\fR *************** *** 154,159 .IP \fB\-i\fR report double and triple indirection - the inode numbers are reported for files that contain double and/or triple data-block indirection. .IP \fB\-o\fR overrides file system integrity checks. The file system will be analyzed even if --- 160,172 ----- .IP \fB\-i\fR report double and triple indirection - the inode numbers are reported for files that contain double and/or triple data-block indirection. + .IP \fB\-n\fR + shows the pathname of the files in the list of most fragmented files. + If an inode contains multiple links, only one pathname will be displayed, + but the display will note that there are other links. This option may + cause + .I fsanalyze + to take longer to complete. .IP \fB\-o\fR overrides file system integrity checks. The file system will be analyzed even if *************** *** 162,167 .I fsanalyze may give erroneous results if used on a damaged file system, but the file system itself will not be affected. .IP \fB\-v\fR causes the current version number and patch level to be displayed. .SH EXAMPLES --- 175,192 ----- .I fsanalyze may give erroneous results if used on a damaged file system, but the file system itself will not be affected. + .IP \fB\-s\fR + causes + .I fsanalyze + to display progress messages on + .I stderr . + This option is useful when the output of fsanalyze is being captured to a + file or piped to another process. + .IP \fB\-t#\fR + causes + .I fsanalyze + to list the '#' most fragmented files in its report. The + default is 10. .IP \fB\-v\fR causes the current version number and patch level to be displayed. .SH EXAMPLES *************** *** 187,190 .br Internet : mjy@sdti.SDTI.COM .SH VERSION ! 4.1.1.1 \- 88/12/14 11:07:34 --- 212,215 ----- .br Internet : mjy@sdti.SDTI.COM .SH VERSION ! 4.2 \- 89/01/20 10:11:09 Index: fsanalyze.c Prereq: 4.1.1.2 *** ../prev/fsanalyze.c Fri Jan 20 10:14:07 1989 --- fsanalyze.c Fri Jan 20 10:14:48 1989 *************** *** 1,4 ! static char sccsid[] = "@(#)$Id: fsanalyze.c, V4.1.1.2 89/01/10 10:49:05 $"; /* * fsanalyze.c - file system analyzer --- 1,4 ----- ! static char sccsid[] = "@(#)$Id: fsanalyze.c, V4.2 89/01/20 10:11:13 $"; /* * fsanalyze.c - file system analyzer *************** *** 2,8 /* * fsanalyze.c - file system analyzer ! * Version : 4.1.1.2 - 89/01/10 10:49:05 * * Author : Michael J. Young * USmail : Software Development Technologies, Inc. --- 2,8 ----- /* * fsanalyze.c - file system analyzer ! * Version : 4.2 - 89/01/20 10:11:13 * * Author : Michael J. Young * USmail : Software Development Technologies, Inc. *************** *** 79,84 * Mon Jan 9 13:08:04 EST 1989 - Wietse Z. Venema (wietse@wzv.UUCP), * Fixed faulty test in error() which caused floating-point error * when invoked on an non-existent filesystem. */ /* --- 79,87 ----- * Mon Jan 9 13:08:04 EST 1989 - Wietse Z. Venema (wietse@wzv.UUCP), * Fixed faulty test in error() which caused floating-point error * when invoked on an non-existent filesystem. + * + * Fri Jan 20 09:40:06 EST 1989 - M. Young (mjy@sdti.SDTI.COM), + * Added '-s' flag. */ /* *************** *** 145,151 /* * no individual files to check, scan entire file system */ ! printf ("Analyzing file system %s...\n", special); /* * scan through all i-nodes in the file system --- 148,159 ----- /* * no individual files to check, scan entire file system */ ! if (status_flag){ ! fprintf (stderr, "Analyzing file system %s...\n", special); ! } ! else { ! printf ("Analyzing file system %s...\n", special); ! } /* * scan through all i-nodes in the file system Index: fsanalyze.h Prereq: 4.1.1.3 *** ../prev/fsanalyze.h Fri Jan 20 10:14:09 1989 --- fsanalyze.h Fri Jan 20 10:14:50 1989 *************** *** 1,4 ! /* @(#)$Id: fsanalyze.h, V4.1.1.3 89/01/10 11:19:58 $ */ /* * fsanalyze.h - file system analyzer header file --- 1,4 ----- ! /* @(#)$Id: fsanalyze.h, V4.2 89/01/20 10:11:16 $ */ /* * fsanalyze.h - file system analyzer header file *************** *** 2,8 /* * fsanalyze.h - file system analyzer header file ! * Version : 4.1.1.3 - 89/01/10 11:19:58 * * Author : Michael J. Young * USmail : Software Development Technologies, Inc. --- 2,8 ----- /* * fsanalyze.h - file system analyzer header file ! * Version : 4.2 - 89/01/20 10:11:16 * * Author : Michael J. Young * USmail : Software Development Technologies, Inc. *************** *** 52,57 * Tue Jan 10 11:19:30 EST 1989 - M. Young (mjy@sdti.SDTI.COM), * Changed format of IS_SPECIAL to prevent some braindamaged * compilers from barfing on degenerate conditionals */ #include <sys/stat.h> --- 52,66 ----- * Tue Jan 10 11:19:30 EST 1989 - M. Young (mjy@sdti.SDTI.COM), * Changed format of IS_SPECIAL to prevent some braindamaged * compilers from barfing on degenerate conditionals + * + * Tue Jan 10 14:07:10 EST 1989 - M. Young (mjy@sdti.SDTI.COM), + * Added support for displaying pathnames of most fragmented files. + * Also added support for user-specified number of fragmented files + * to report. Based on code developed by Chip Rosenthal + * (chip@vector.UUCP). + * + * Fri Jan 20 09:46:19 EST 1989 - M. Young (mjy@sdti.SDTI.COM), + * Added '-s' flag. */ #include <sys/stat.h> *************** *** 120,125 */ struct file_data { int inode; /* i-node number */ long total_blocks; /* total blocks in file (incl * indirect blocks */ long data_blocks; /* total data blocks in file */ --- 129,135 ----- */ struct file_data { int inode; /* i-node number */ + char *pathname; /* pathname of file at this inode */ long total_blocks; /* total blocks in file (incl * indirect blocks */ long data_blocks; /* total data blocks in file */ *************** *** 193,199 extern long unuseable; /* unuseable bytes due to external * fragmentation */ ! extern struct file_data file_log[]; /* worst offenders */ /* --- 203,209 ----- extern long unuseable; /* unuseable bytes due to external * fragmentation */ ! extern struct file_data *file_log; /* worst offenders */ /* *************** *** 207,212 * examined */ extern boolean override; /* override bad fs test */ /*************************************************************************** * Function Declarations * --- 217,224 ----- * examined */ extern boolean override; /* override bad fs test */ + extern boolean show_names; /* display pathname of severly + * fragmanted i-nodes */ extern int num_fragmented; /* number of most-fragmented files * to report */ *************** *** 208,213 extern boolean override; /* override bad fs test */ /*************************************************************************** * Function Declarations * ***************************************************************************/ --- 220,231 ----- extern boolean show_names; /* display pathname of severly * fragmanted i-nodes */ + extern int num_fragmented; /* number of most-fragmented files + * to report */ + + extern boolean status_flag; /* if TRUE, display progress messages + * on stderr */ + /*************************************************************************** * Function Declarations * ***************************************************************************/ *************** *** 227,232 */ extern daddr_t blk_no(); /* get block number from inode structure */ extern void get_inodes(); /* fetch inode(s) */ /* * from fragm.c --- 245,252 ----- */ extern daddr_t blk_no(); /* get block number from inode structure */ extern void get_inodes(); /* fetch inode(s) */ + extern char *Smalloc(); /* safe malloc() */ + extern char *Srealloc(); /* safe realloc() */ /* * from fragm.c *************** *** 232,237 * from fragm.c */ extern void test_fragmentation(); /* fragmentation analyzer */ /* * from chkfile.c --- 252,258 ----- * from fragm.c */ extern void test_fragmentation(); /* fragmentation analyzer */ + extern long minimum_seeks(); /* mimimum number of seeks per file */ /* * from chkfile.c Index: fsconfig.h Prereq: 4.1.1.3 *** ../prev/fsconfig.h Fri Jan 20 10:14:12 1989 --- fsconfig.h Fri Jan 20 10:14:52 1989 *************** *** 1,4 ! /* @(#)$Id: fsconfig.h, V4.1.1.3 89/01/10 10:49:14 $ */ /* * fsconfig.h - fsanalyze configuration-specific definitions --- 1,4 ----- ! /* @(#)$Id: fsconfig.h, V4.2 89/01/20 10:11:21 $ */ /* * fsconfig.h - fsanalyze configuration-specific definitions *************** *** 2,8 /* * fsconfig.h - fsanalyze configuration-specific definitions ! * Version : 4.1.1.3 - 89/01/10 10:49:14 * * Author : Michael J. Young * USmail : Software Development Technologies, Inc. --- 2,8 ----- /* * fsconfig.h - fsanalyze configuration-specific definitions ! * Version : 4.2 - 89/01/20 10:11:21 * * Author : Michael J. Young * USmail : Software Development Technologies, Inc. Index: init.c Prereq: 4.1.1.2 *** ../prev/init.c Fri Jan 20 10:14:14 1989 --- init.c Fri Jan 20 10:14:53 1989 *************** *** 1,4 ! static char sccsid[] = "@(#)$Id: init.c, V4.1.1.2 89/01/10 10:49:22 $"; /* * init.c - initialization and usage code --- 1,4 ----- ! static char sccsid[] = "@(#)$Id: init.c, V4.2 89/01/20 10:11:26 $"; /* * init.c - initialization and usage code *************** *** 2,8 /* * init.c - initialization and usage code ! * Version : 4.1.1.2 - 89/01/10 10:49:22 * * Author : Michael J. Young * USmail : Software Development Technologies, Inc. --- 2,8 ----- /* * init.c - initialization and usage code ! * Version : 4.2 - 89/01/20 10:11:26 * * Author : Michael J. Young * USmail : Software Development Technologies, Inc. *************** *** 44,49 * Tue Jan 10 10:10:38 EST 1989 - M. Young (mjy@sdti.SDTI.COM), * Is_ok() and is_mounted() macros now work correctly, thanks to * enlightenment from Mark Nudelman (UNIX386!mark). */ #include "fsconfig.h" --- 44,58 ----- * Tue Jan 10 10:10:38 EST 1989 - M. Young (mjy@sdti.SDTI.COM), * Is_ok() and is_mounted() macros now work correctly, thanks to * enlightenment from Mark Nudelman (UNIX386!mark). + * + * Tue Jan 10 14:09:13 EST 1989 - M. Young (mjy@sdti.SDTI.COM), + * Added support to display pathnames of most fragmented files. + * Also added flag to support user-specified number of fragmented + * files to report. Based on code developed by Chip Rosenthal + * (chip@vector.UUCP). + * + * Fri Jan 20 09:42:14 EST 1989 - M. Young (mjy@sdti.SDTI.COM), + * Added '-s' flag. */ #include "fsconfig.h" *************** *** 81,86 * examined */ boolean override = FALSE; /* override bad fs test */ /* * version : prints out the current version of fsanalyze */ --- 90,104 ----- * examined */ boolean override = FALSE; /* override bad fs test */ + boolean show_names = FALSE; /* display pathname of severly + * fragmanted i-nodes */ + + int num_fragmented = NUMOFFEND; /* number of most-fragmented + * files to report */ + + boolean status_flag = FALSE; /* if TRUE, display progress + * on stderr */ + /* * version : prints out the current version of fsanalyze */ *************** *** 86,92 */ void version(){ printf ("\nFile System Analyzer\n"); ! printf ("Version : 4.1 - 89/01/10 10:49:22, Patch Level #%d\n", patch_level); } /* --- 104,110 ----- */ void version(){ printf ("\nFile System Analyzer\n"); ! printf ("Version : 4.2 - 89/01/20 10:11:26, Patch Level #%d\n", patch_level); } /* *************** *** 95,101 */ void usage(){ version(); ! printf ("Usage : fsanalyze [-[deio] [-b#] [-c#] [-g#] ] special [file] ...\n"); printf ("\nIf the [file] argument(s) are missing, the entire file system\n"); printf ("is scanned. Otherwise, only the specified files are examined.\n"); printf ("Valid option are:\n\n"); --- 113,119 ----- */ void usage(){ version(); ! printf ("Usage : fsanalyze [-[deinosv] [-b#] [-c#] [-g#] [-t#] ] special [file] ...\n"); printf ("\nIf the [file] argument(s) are missing, the entire file system\n"); printf ("is scanned. Otherwise, only the specified files are examined.\n"); printf ("Valid option are:\n\n"); *************** *** 108,113 printf ("\tg#\tassume an inter-block gap of '#' sectors;\n"); printf ("\t\toverrides information contained in superblock.\n"); printf ("\ti\treport data block double and triple indirection\n"); printf ("\to\toverride error checking on file system argument\n"); printf ("\tv\tdisplay current version number and patch level\n"); exit(1); --- 126,132 ----- printf ("\tg#\tassume an inter-block gap of '#' sectors;\n"); printf ("\t\toverrides information contained in superblock.\n"); printf ("\ti\treport data block double and triple indirection\n"); + printf ("\tn\tdisplay pathnames of most fragmented files.\n"); printf ("\to\toverride error checking on file system argument\n"); printf ("\ts\tdisplay progress messages on stderr\n"); printf ("\tt#\tnumber of most-fragmented files to be reported\n"); *************** *** 109,114 printf ("\t\toverrides information contained in superblock.\n"); printf ("\ti\treport data block double and triple indirection\n"); printf ("\to\toverride error checking on file system argument\n"); printf ("\tv\tdisplay current version number and patch level\n"); exit(1); } --- 128,135 ----- printf ("\ti\treport data block double and triple indirection\n"); printf ("\tn\tdisplay pathnames of most fragmented files.\n"); printf ("\to\toverride error checking on file system argument\n"); + printf ("\ts\tdisplay progress messages on stderr\n"); + printf ("\tt#\tnumber of most-fragmented files to be reported\n"); printf ("\tv\tdisplay current version number and patch level\n"); exit(1); } *************** *** 223,229 int argc; char *argv[]; { ! int i; /* loop counter */ char *cp; /* cmd-line flag pointer */ boolean special_found = FALSE; /* TRUE = found special arg */ boolean done; /* means of escaping while loop --- 244,250 ----- int argc; char *argv[]; { ! int i,j; /* loop counter */ char *cp; /* cmd-line flag pointer */ boolean special_found = FALSE; /* TRUE = found special arg */ boolean done; /* means of escaping while loop *************** *** 300,305 rpt_indirects = TRUE; break; /* override bad fs test */ case 'o': override = TRUE; --- 321,333 ----- rpt_indirects = TRUE; break; + + /* display pathname of severly + * fragmanted i-nodes */ + case 'n': + show_names = TRUE; + break; + /* override bad fs test */ case 'o': override = TRUE; *************** *** 305,310 override = TRUE; break; case 'v': version(); exit(0); --- 333,358 ----- override = TRUE; break; + /* display status messages */ + case 's': + status_flag = TRUE; + break; + + /* number of fragmented files to report */ + case 't': + if (cp[1]){ + num_fragmented = atoi (++cp); + done = TRUE; /* force end of while loop */ + } + else { + num_fragmented = atoi (argv[++i]); + } + if (num_fragmented < 0){ + fprintf (stderr, "Illegal value for 't' option. Assuming 0\n"); + num_fragmented = 0; + } + break; + case 'v': version(); exit(0); *************** *** 343,348 cyl_size = sec_per_cyl(fil_sys); } return i; /* return # of next argument to be processed */ } --- 391,406 ----- cyl_size = sec_per_cyl(fil_sys); } + /* + * create and initialize worst-fragmented array + */ + if (num_fragmented != 0){ + file_log = (struct file_data *)Smalloc (num_fragmented * sizeof (struct file_data)); + for (j = 0; j < num_fragmented; j++){ + init_stats (&file_log[j], 0, 0L); + } + } + return i; /* return # of next argument to be processed */ } Index: patchlevel.h Prereq: 4.1.1.2 *** ../prev/patchlevel.h Fri Jan 20 10:14:16 1989 --- patchlevel.h Fri Jan 20 10:14:54 1989 *************** *** 1,4 ! /* @(#)$Id: patchlevel.h, V4.1.1.2 89/01/10 10:49:29 $ */ /* * patchlevel.h - current patch level --- 1,4 ----- ! /* @(#)$Id: patchlevel.h, V4.2 89/01/20 10:11:33 $ */ /* * patchlevel.h - current patch level *************** *** 2,8 /* * patchlevel.h - current patch level ! * Version : 4.1.1.2 - 89/01/10 10:49:29 * * Author : Michael J. Young * USmail : Software Development Technologies, Inc. --- 2,8 ----- /* * patchlevel.h - current patch level ! * Version : 4.2 - 89/01/20 10:11:33 * * Author : Michael J. Young * USmail : Software Development Technologies, Inc. *************** *** 22,26 * ========================================================================= */ ! #define patch_level 2 --- 22,26 ----- * ========================================================================= */ ! #define patch_level 0 Index: report.c Prereq: 4.1.1.2 *** ../prev/report.c Fri Jan 20 10:14:18 1989 --- report.c Fri Jan 20 10:14:55 1989 *************** *** 1,4 ! static char sccsid[] = "@(#)$Id: report.c, V4.1.1.2 89/01/10 10:49:31 $"; /* * report.c - print analysis report --- 1,4 ----- ! static char sccsid[] = "@(#)$Id: report.c, V4.2 89/01/20 10:11:36 $"; /* * report.c - print analysis report *************** *** 2,8 /* * report.c - print analysis report ! * Version : 4.1.1.2 - 89/01/10 10:49:31 * * Author : Michael J. Young * USmail : Software Development Technologies, Inc. --- 2,8 ----- /* * report.c - print analysis report ! * Version : 4.2 - 89/01/20 10:11:36 * * Author : Michael J. Young * USmail : Software Development Technologies, Inc. *************** *** 40,45 * * Thu Jan 5 10:31:21 EST 1989 - Rob McMahon (cudcv@warwick.ac.uk), * Added conditionals for NFS file systems */ #include "fsconfig.h" --- 40,53 ----- * * Thu Jan 5 10:31:21 EST 1989 - Rob McMahon (cudcv@warwick.ac.uk), * Added conditionals for NFS file systems + * + * Tue Jan 10 14:12:01 EST 1989 - M. Young (mjy@sdti.SDTI.COM), + * Added support to display pathnames of most fragmented files. + * Also permits user to specify number of most-fragmented files to report. + * Based heavily on code developed by Chip Rosenthal (chip@vector.UUCP). + * + * Fri Jan 20 09:40:46 EST 1989 - M. Young (mjy@sdti.SDTI.COM), + * Added '-s' flag. */ #include "fsconfig.h" *************** *** 46,51 #include "fsanalyze.h" /* * print_report : calculates percentages and prints a summary report of * file system statistics */ --- 54,149 ----- #include "fsanalyze.h" /* + * printstats : displays the statistics of the specified file. If the + * argument is NULL, a page header is displayed instead. + */ + void printstats(f) + struct file_data *f; + { + if ( f == NULL ) { + printf(" i-node Size Fragments %% Dist "); + } + else { + printf("%6d %6ld %6ld %6.2f%% %6.1f", + f->inode, f->total_blocks, f->seeks+1, f->fragm*100, f->rel_cost); + } + } + + + /* + * get_pathnames() - find names of the most fragmented files + */ + #ifndef LPNMAX + # define LPNMAX 128 + #endif + + void get_pathnames() + { + static char buf[1024], path[LPNMAX]; + char *c; + int i, n; + FILE *pp; + extern char *strcpy(), *strcat(), *malloc(), *realloc(); + + if (status_flag){ + fprintf (stderr, "Scanning for pathnames of most fragmented files...\n"); + } + + /* + * Initialize the pathnames list. + */ + for ( i = 0 ; i < num_fragmented ; ++i ){ + file_log[i].pathname = NULL; + } + + (void) strcpy(buf,"ncheck -i "); + for ( i = 0 ; i < num_fragmented && file_log[i].inode > 0 ; ++i ) { + c = buf + strlen(buf); + (void) sprintf(c,"%d ",(int)file_log[i].inode); + } + (void) strcat(buf,special); + + if ( (pp=popen(buf,"r")) == (FILE *) NULL ) { + perror("pipe to 'ncheck'"); + return; + } + + /* + * Sample "ncheck" output" + * /dev/root: + * 1563 /bin/adb + * 2566 /bin/rmail + * 2566 /bin/smail + * 2547 /etc/fsanalyze + * 2583 /etc/renice + * 2368 /usr/lib/Llibccgi.a + */ + while ( fgets(buf,sizeof buf,pp) != NULL ) { + if ( sscanf(buf,"%d %s",&n,path) != 2 || n <= 0 ){ + continue; + } + for ( i = 0 ; i < num_fragmented ; ++i ) { + if ( file_log[i].inode != n ){ + continue; + } + if ( file_log[i].pathname == NULL ) { + file_log[i].pathname = Srealloc(NULL,strlen(path)+1); + (void) strcpy(file_log[i].pathname,path); + } + else { + file_log[i].pathname = Srealloc(file_log[i].pathname, + strlen(file_log[i].pathname)+strlen(path)+3); + (void) strcat(file_log[i].pathname,", "); + (void) strcat(file_log[i].pathname,path); + } + } + } + + (void) pclose(pp); + return; + } + + /* * print_report : calculates percentages and prints a summary report of * file system statistics */ *************** *** 49,55 * print_report : calculates percentages and prints a summary report of * file system statistics */ ! void print_report (){ char minibuf[32]; /* line buffer */ long num_files; /* number of inodes used * in file system */ --- 147,154 ----- * print_report : calculates percentages and prints a summary report of * file system statistics */ ! void print_report () ! { char minibuf[32]; /* line buffer */ long num_files; /* number of inodes used * in file system */ *************** *** 76,81 wasted_p; /* wasted space due to external frag */ /* * calculate percentages for report */ fragm = potential_seeks ? (float)seeks/(float)potential_seeks : 0.0; --- 175,186 ----- wasted_p; /* wasted space due to external frag */ /* + * get names of severly fragmented files + */ + if ( show_names ) + get_pathnames(); + + /* * calculate percentages for report */ fragm = potential_seeks ? (float)seeks/(float)potential_seeks : 0.0; *************** *** 167,191 sparse_files, sparse_p*100); printf ("Unused bytes in last blocks = %ld (%.2f%%)\n", unuseable, wasted_p*100); ! printf (" %d Most Fragmented Files\n",NUMOFFEND); ! printf (" i-node Size Fragments %% Dist i-node Size Fragments %% Dist\n"); ! for (i = 0; i < NUMOFFEND/2; i++){ ! if (file_log[i].inode != 0){ ! printf ("%6d %6ld %6ld %6.2f%% %6.1f", ! file_log[i].inode, ! file_log[i].total_blocks, ! file_log[i].seeks+1, ! file_log[i].fragm*100, ! file_log[i].rel_cost); ! if (file_log[i+(NUMOFFEND/2)].inode != 0){ ! printf (" %6d %6ld %6ld %6.2f%% %6.1f", ! file_log[i+(NUMOFFEND/2)].inode, ! file_log[i+(NUMOFFEND/2)].total_blocks, ! file_log[i+(NUMOFFEND/2)].seeks+1, ! file_log[i+(NUMOFFEND/2)].fragm*100, ! file_log[i+(NUMOFFEND/2)].rel_cost); ! } ! printf ("\n"); } else break; } --- 272,288 ----- sparse_files, sparse_p*100); printf ("Unused bytes in last blocks = %ld (%.2f%%)\n", unuseable, wasted_p*100); ! if (num_fragmented != 0){ ! printf (" %d Most Fragmented Files\n",num_fragmented); ! ! if ( show_names ) { ! printstats(NULL); ! printf(" Pathname\n"); ! for ( i = 0 ; i < num_fragmented && file_log[i].inode != 0 ; i++ ) { ! printstats(&file_log[i]); ! printf(" %s\n", ( file_log[i].pathname != NULL ? ! file_log[i].pathname : "<unknown>" ) ); ! } } else { printstats(NULL); *************** *** 187,193 } printf ("\n"); } ! else break; } } --- 284,305 ----- file_log[i].pathname : "<unknown>" ) ); } } ! else { ! printstats(NULL); ! putchar(' '); ! printstats(NULL); ! putchar('\n'); ! for (i = 0 ; i < (num_fragmented+1)/2; i++){ ! if (file_log[i].inode != 0){ ! printstats(&file_log[i]); ! if ((i + (num_fragmented+1)/2) < num_fragmented && ! file_log[i+(num_fragmented+1)/2].inode != 0){ ! printf (" "); ! printstats(&file_log[i+(num_fragmented+1)/2]); ! } ! putchar('\n'); ! } ! } ! } } } *************** *** 190,193 else break; } } - --- 303,305 ----- } } } Index: stats.c Prereq: 4.1 *** ../prev/stats.c Fri Jan 20 10:13:01 1989 --- stats.c Fri Jan 20 10:14:56 1989 *************** *** 1,4 ! static char sccsid[] = "@(#)$Id: stats.c, V4.1 88/11/16 17:31:26 $"; /* * stats.c - file system statistics --- 1,4 ----- ! static char sccsid[] = "@(#)$Id: stats.c, V4.2 89/01/20 10:11:44 $"; /* * stats.c - file system statistics *************** *** 2,8 /* * stats.c - file system statistics ! * Version : 4.1 - 88/11/16 17:31:26 * * Author : Michael J. Young * USmail : Software Development Technologies, Inc. --- 2,8 ----- /* * stats.c - file system statistics ! * Version : 4.2 - 89/01/20 10:11:44 * * Author : Michael J. Young * USmail : Software Development Technologies, Inc. *************** *** 33,38 * * Wed Nov 16 11:31:32 EST 1988 - M. Young (mjy@sdti.SDTI.COM), * Placed under SCCS */ #include "fsconfig.h" --- 33,41 ----- * * Wed Nov 16 11:31:32 EST 1988 - M. Young (mjy@sdti.SDTI.COM), * Placed under SCCS + * + * Tue Jan 10 15:41:38 EST 1989 - M. Young (mjy@sdti.SDTI.COM), + * Support for user-specified number of most-fragmented files to report */ #include "fsconfig.h" *************** *** 71,77 long unuseable = 0; /* unuseable bytes due to external * fragmentation */ ! struct file_data file_log[NUMOFFEND] = {0}; /* worst offenders */ /* * init_stats : initializes per-file statistics structure --- 74,80 ----- long unuseable = 0; /* unuseable bytes due to external * fragmentation */ ! struct file_data *file_log = NULL; /* worst offenders */ /* * init_stats : initializes per-file statistics structure *************** *** 124,130 /* * update worst offender array */ ! for (i = 0; i < NUMOFFEND; i++){ if (data->seeks > file_log[i].seeks){ for (j = NUMOFFEND-1; j > i; j--){ file_log[j] = file_log[j-1]; --- 127,133 ----- /* * update worst offender array */ ! for (i = 0; i < num_fragmented; i++){ if (data->seeks > file_log[i].seeks){ for (j = num_fragmented-1; j > i; j--){ file_log[j] = file_log[j-1]; *************** *** 126,132 */ for (i = 0; i < NUMOFFEND; i++){ if (data->seeks > file_log[i].seeks){ ! for (j = NUMOFFEND-1; j > i; j--){ file_log[j] = file_log[j-1]; } file_log[i] = *data; --- 129,135 ----- */ for (i = 0; i < num_fragmented; i++){ if (data->seeks > file_log[i].seeks){ ! for (j = num_fragmented-1; j > i; j--){ file_log[j] = file_log[j-1]; } file_log[i] = *data; Index: util.c Prereq: 4.1.1.1 *** ../prev/util.c Fri Jan 20 10:14:19 1989 --- util.c Fri Jan 20 10:14:57 1989 *************** *** 1,4 ! static char sccsid[] = "@(#)$Id: util.c, V4.1.1.1 89/01/10 10:49:39 $"; /* * util.c - inode utilities --- 1,4 ----- ! static char sccsid[] = "@(#)$Id: util.c, V4.2 89/01/20 10:11:48 $"; /* * util.c - inode utilities *************** *** 2,8 /* * util.c - inode utilities ! * Version : 4.1.1.1 - 89/01/10 10:49:39 * * Author : Michael J. Young * USmail : Software Development Technologies, Inc. --- 2,8 ----- /* * util.c - inode utilities ! * Version : 4.2 - 89/01/20 10:11:48 * * Author : Michael J. Young * USmail : Software Development Technologies, Inc. *************** *** 36,41 * * Thu Jan 5 10:29:19 EST 1989 - Rob McMahon (cudcv@warwick.ac.uk), * Added conditionals for NFS file systems */ #include "fsconfig.h" --- 36,45 ----- * * Thu Jan 5 10:29:19 EST 1989 - Rob McMahon (cudcv@warwick.ac.uk), * Added conditionals for NFS file systems + * + * Tue Jan 10 14:21:03 EST 1989 - M. Young (mjy@sdti.SDTI.COM), + * Added Srealloc() and Smalloc(), based on code by Chip Rosenthal + * (chip@vector.UUCP) */ #include "fsconfig.h" *************** *** 88,92 /* NOTREACHED */ } } } --- 92,129 ----- /* NOTREACHED */ } } + } + + /* + * Smalloc : safe malloc() + */ + char *Smalloc(size) + int size; + { + char *s; + extern char *malloc(), *realloc(); + + s = malloc(size); + if ( s == NULL ) { + error (0, "malloc: out of space\n"); + } + return s; + } + + /* + * Srealloc : safe realloc() + */ + char *Srealloc(ptr,size) + char *ptr; + int size; + { + char *s; + extern char *malloc(), *realloc(); + + s = ( ptr == NULL ? malloc(size) : realloc(ptr,size) ); + if ( s == NULL ) { + error (0, "malloc: out of space\n"); + } + return s; } -- Mike Young Software Development Technologies, Inc., Sudbury MA Tel: +1 508 443 5779 Internet: mjy@sdti.sdti.com UUCP: {harvard,mit-eddie}!sdti!mjy