mirror of
https://git.kernel.org/pub/scm/fs/ext2/e2fsprogs.git
synced 2024-11-24 18:43:53 +08:00
47fee2ef6a
Currently there are many uses of ext2fs_close() which might be wrong. First of all ext2fs_close() does not set the ext2_filsys pointer to NULL so the caller is responsible for clearing it, however there are some cases there we do not do it. Second of all very small number of users of ext2fs_close() actually check the return value. If there is a problem in ext2fs_close() it will not even free the ext2_filsys structure, but majority of users expect it to do so. To fix both problems this commit introduces a new helper ext2fs_close_free() which will not only check for the return value and free the ext2_filsys structure if the call to ext2fs_close2() failed, but it will also set the ext2_filsys pointer to NULL. Replace every use of ext2fs_close() in e2fsprogs tools with ext2fs_close_free() - there is no real reason to keep using ext2fs_close(). Signed-off-by: Lukas Czerner <lczerner@redhat.com> Signed-off-by: Theodore Ts'o <tytso@mit.edu> Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>
142 lines
2.9 KiB
C
142 lines
2.9 KiB
C
/*
|
|
* scantest.c - test the speed of the inode scan routine
|
|
*/
|
|
|
|
#include "config.h"
|
|
#include <string.h>
|
|
#include <fcntl.h>
|
|
#include <ctype.h>
|
|
#include <termios.h>
|
|
#include <time.h>
|
|
#ifdef HAVE_GETOPT_H
|
|
#include <getopt.h>
|
|
#endif
|
|
#include <unistd.h>
|
|
#include <sys/ioctl.h>
|
|
#ifdef HAVE_MALLOC_H
|
|
#include <malloc.h>
|
|
#endif
|
|
#include <sys/resource.h>
|
|
|
|
#include "et/com_err.h"
|
|
#include "../version.h"
|
|
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
#include <unistd.h>
|
|
#include <stdlib.h>
|
|
#include <sys/stat.h>
|
|
#include <sys/types.h>
|
|
#include <sys/time.h>
|
|
|
|
#include "ext2fs/ext2_fs.h"
|
|
#include "ext2fs/ext2fs.h"
|
|
|
|
|
|
extern int isatty(int);
|
|
|
|
const char * device_name = NULL;
|
|
|
|
/*
|
|
* This structure is used for keeping track of how much resources have
|
|
* been used for a particular pass of e2fsck.
|
|
*/
|
|
struct resource_track {
|
|
struct timeval time_start;
|
|
struct timeval user_start;
|
|
struct timeval system_start;
|
|
void *brk_start;
|
|
};
|
|
|
|
struct resource_track global_rtrack;
|
|
|
|
void init_resource_track(struct resource_track *track)
|
|
{
|
|
struct rusage r;
|
|
|
|
track->brk_start = sbrk(0);
|
|
gettimeofday(&track->time_start, 0);
|
|
getrusage(RUSAGE_SELF, &r);
|
|
track->user_start = r.ru_utime;
|
|
track->system_start = r.ru_stime;
|
|
}
|
|
|
|
static __inline__ float timeval_subtract(struct timeval *tv1,
|
|
struct timeval *tv2)
|
|
{
|
|
return ((tv1->tv_sec - tv2->tv_sec) +
|
|
((float) (tv1->tv_usec - tv2->tv_usec)) / 1000000);
|
|
}
|
|
|
|
static void print_resource_track(struct resource_track *track)
|
|
{
|
|
struct rusage r;
|
|
struct timeval time_end;
|
|
|
|
gettimeofday(&time_end, 0);
|
|
getrusage(RUSAGE_SELF, &r);
|
|
|
|
printf(_("Memory used: %d, elapsed time: %6.3f/%6.3f/%6.3f\n"),
|
|
(int) (((char *) sbrk(0)) - ((char *) track->brk_start)),
|
|
timeval_subtract(&time_end, &track->time_start),
|
|
timeval_subtract(&r.ru_utime, &track->user_start),
|
|
timeval_subtract(&r.ru_stime, &track->system_start));
|
|
}
|
|
|
|
|
|
|
|
int main (int argc, char *argv[])
|
|
{
|
|
errcode_t retval = 0;
|
|
int exit_value = 0;
|
|
int i;
|
|
ext2_filsys fs;
|
|
ext2_inode_scan scan;
|
|
ext2_ino_t ino;
|
|
struct ext2_inode inode;
|
|
|
|
printf(_("size of inode=%d\n"), sizeof(inode));
|
|
|
|
device_name = "/dev/hda3";
|
|
|
|
init_resource_track(&global_rtrack);
|
|
|
|
retval = ext2fs_open(device_name, 0,
|
|
0, 0, unix_io_manager, &fs);
|
|
if (retval) {
|
|
com_err(argv[0], retval, _("while trying to open %s"),
|
|
device_name);
|
|
exit(1);
|
|
}
|
|
|
|
retval = ext2fs_open_inode_scan(fs, 0, &scan);
|
|
if (retval) {
|
|
com_err(argv[0], retval, _("while opening inode scan"));
|
|
exit(1);
|
|
}
|
|
retval = ext2fs_get_next_inode(scan, &ino, &inode);
|
|
if (retval) {
|
|
com_err(argv[0], retval, _("while starting inode scan"));
|
|
exit(1);
|
|
}
|
|
while (ino) {
|
|
if (!inode.i_links_count)
|
|
goto next;
|
|
printf("%lu\n", inode.i_blocks);
|
|
next:
|
|
retval = ext2fs_get_next_inode(scan, &ino, &inode);
|
|
if (retval) {
|
|
com_err(argv[0], retval,
|
|
_("while doing inode scan"));
|
|
exit(1);
|
|
}
|
|
}
|
|
|
|
|
|
ext2fs_close_free(&fs);
|
|
|
|
print_resource_track(&global_rtrack);
|
|
|
|
return exit_value;
|
|
}
|