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