Whamcloud - gitweb
Don't write changes to the backup superblocks by default
[tools/e2fsprogs.git] / misc / filefrag.c
index 0a8b29d..27675b1 100644 (file)
@@ -44,9 +44,16 @@ int verbose = 0;
 #define FIBMAP    _IO(0x00,1)  /* bmap access */
 #define FIGETBSZ   _IO(0x00,2) /* get the block size used for bmap */
 
-#define EXT3_EXTENTS_FL                        0x00080000 /* Inode uses extents */
+#define EXT4_EXTENTS_FL                        0x00080000 /* Inode uses extents */
 #define        EXT3_IOC_GETFLAGS               _IOR('f', 1, long)
 
+static unsigned int div_ceil(unsigned int a, unsigned int b)
+{
+       if (!a)
+               return 0;
+       return ((a - 1) / b) + 1;
+}
+
 static unsigned long get_bmap(int fd, unsigned long block)
 {
        int     ret;
@@ -69,10 +76,14 @@ static unsigned long get_bmap(int fd, unsigned long block)
 static void frag_report(const char *filename)
 {
        struct statfs   fsinfo;
+#ifdef HAVE_FSTAT64
        struct stat64   fileinfo;
+#else
+       struct stat     fileinfo;
+#endif
        int             bs;
-       long            i, fd;
-       unsigned long   block, last_block = 0, numblocks;
+       long            fd;
+       unsigned long   block, last_block = 0, numblocks, i;
        long            bpib;   /* Blocks per indirect block */
        long            cylgroups;
        int             discont = 0, expected;
@@ -83,7 +94,11 @@ static void frag_report(const char *filename)
                perror("statfs");
                return;
        }
+#ifdef HAVE_FSTAT64
        if (stat64(filename, &fileinfo) < 0) {
+#else
+       if (stat(filename, &fileinfo) < 0) {
+#endif
                perror("stat");
                return;
        }
@@ -95,14 +110,19 @@ static void frag_report(const char *filename)
            (fsinfo.f_type == 0xef53))
                is_ext2++;
        if (verbose) {
-               printf("Filesystem type is: %x\n", fsinfo.f_type);
+               printf("Filesystem type is: %lx\n", 
+                      (unsigned long) fsinfo.f_type);
        }
-       cylgroups = (fsinfo.f_blocks + fsinfo.f_bsize*8-1) / fsinfo.f_bsize*8;
+       cylgroups = div_ceil(fsinfo.f_blocks, fsinfo.f_bsize*8);
        if (verbose) {
                printf("Filesystem cylinder groups is approximately %ld\n", 
                       cylgroups);
        }
-       fd = open(filename, O_RDONLY | O_LARGEFILE);
+#ifdef HAVE_OPEN64
+       fd = open64(filename, O_RDONLY);
+#else
+       fd = open(filename, O_RDONLY);
+#endif
        if (fd < 0) {
                perror("open");
                return;
@@ -114,7 +134,7 @@ static void frag_report(const char *filename)
        }
        if (ioctl(fd, EXT3_IOC_GETFLAGS, &flags) < 0)
                flags = 0;
-       if (flags & EXT3_EXTENTS_FL) {
+       if (flags & EXT4_EXTENTS_FL) {
                printf("File is stored in extents format\n");
                is_ext2 = 0;
        }