You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
79 lines
1.6 KiB
79 lines
1.6 KiB
/*
|
|
* Copyright 2000 by Hans Reiser, licensing governed by reiserfs/README
|
|
*/
|
|
|
|
#include <stdio.h>
|
|
#include <sys/types.h>
|
|
#include <sys/stat.h>
|
|
#include <fcntl.h>
|
|
#include <linux/fs.h>
|
|
#include <errno.h>
|
|
|
|
int main(int argc, char **argv)
|
|
{
|
|
int fd;
|
|
int block;
|
|
int first_block;
|
|
int last_block;
|
|
int totals_block;
|
|
int fragments;
|
|
int i;
|
|
int n;
|
|
|
|
for (n = 1; n < argc; n++) {
|
|
if (argc < 2) {
|
|
printf
|
|
("Used to see file maps \nUsage: %s filename1 [[..[filename2]...filename(N-1)] filenameN]\n",
|
|
argv[0]);
|
|
return 0;
|
|
}
|
|
fd = open(argv[n], O_RDONLY);
|
|
if (fd == -1) {
|
|
perror("open failed");
|
|
continue;
|
|
}
|
|
// printf ("file %s occupies blocks: \n", argv[1]);
|
|
// printf ("START\tEND\tCOUNT\n");
|
|
i = 0;
|
|
block = 0;
|
|
first_block = 0;
|
|
last_block = 0;
|
|
fragments = 0;
|
|
totals_block = 0;
|
|
|
|
while (ioctl(fd, FIBMAP, &block) == 0) {
|
|
if (first_block == 0) {
|
|
last_block = block - 1;
|
|
first_block = block;
|
|
}
|
|
if (block != last_block + 1) {
|
|
// printf ("%d\t%d\t%d\n",first_block,last_block,last_block-first_block+1);
|
|
totals_block += last_block - first_block + 1;
|
|
fragments++;
|
|
first_block = block;
|
|
last_block = block;
|
|
} else {
|
|
last_block++;
|
|
}
|
|
|
|
if (!block) {
|
|
//printf ("Fragments: %d\tBlocks: %d\n",fragments,totals_block);
|
|
//printf ("%d:%d\t",fragments,totals_block);
|
|
//if (fragments == 1) printf(".",totals_block);
|
|
//else printf("%d_",fragments,totals_block);
|
|
printf("%d\n", fragments);
|
|
break;
|
|
}
|
|
|
|
i++;
|
|
block = i;
|
|
}
|
|
if (errno) {
|
|
perror("FIBMAP failed");
|
|
}
|
|
close(fd);
|
|
// printf ("\n");
|
|
}
|
|
return 0;
|
|
}
|