1*59bfda1fSAndroid Build Coastguard Worker #if !defined(__FreeBSD__) && !defined(__NetBSD__) && !defined(__OpenBSD__)
2*59bfda1fSAndroid Build Coastguard Worker #define _XOPEN_SOURCE 600
3*59bfda1fSAndroid Build Coastguard Worker #define _DARWIN_C_SOURCE
4*59bfda1fSAndroid Build Coastguard Worker #ifndef _GNU_SOURCE
5*59bfda1fSAndroid Build Coastguard Worker #define _GNU_SOURCE
6*59bfda1fSAndroid Build Coastguard Worker #endif
7*59bfda1fSAndroid Build Coastguard Worker #endif
8*59bfda1fSAndroid Build Coastguard Worker #ifndef O_LARGEFILE
9*59bfda1fSAndroid Build Coastguard Worker #define O_LARGEFILE 0
10*59bfda1fSAndroid Build Coastguard Worker #endif
11*59bfda1fSAndroid Build Coastguard Worker #include <f2fs_fs.h>
12*59bfda1fSAndroid Build Coastguard Worker #include <unistd.h>
13*59bfda1fSAndroid Build Coastguard Worker #include <string.h>
14*59bfda1fSAndroid Build Coastguard Worker #include <stdlib.h>
15*59bfda1fSAndroid Build Coastguard Worker #include <stdio.h>
16*59bfda1fSAndroid Build Coastguard Worker #include <fcntl.h>
17*59bfda1fSAndroid Build Coastguard Worker #include <errno.h>
18*59bfda1fSAndroid Build Coastguard Worker #include <sys/types.h>
19*59bfda1fSAndroid Build Coastguard Worker #ifdef HAVE_SYS_IOCTL_H
20*59bfda1fSAndroid Build Coastguard Worker #include <sys/ioctl.h>
21*59bfda1fSAndroid Build Coastguard Worker #endif
22*59bfda1fSAndroid Build Coastguard Worker #include <sys/stat.h>
23*59bfda1fSAndroid Build Coastguard Worker #ifdef HAVE_SYS_SYSMACROS_H
24*59bfda1fSAndroid Build Coastguard Worker #include <sys/sysmacros.h>
25*59bfda1fSAndroid Build Coastguard Worker #endif
26*59bfda1fSAndroid Build Coastguard Worker #include <libgen.h>
27*59bfda1fSAndroid Build Coastguard Worker #ifdef HAVE_LINUX_HDREG_H
28*59bfda1fSAndroid Build Coastguard Worker #include <linux/hdreg.h>
29*59bfda1fSAndroid Build Coastguard Worker #endif
30*59bfda1fSAndroid Build Coastguard Worker #ifdef HAVE_LINUX_TYPES_H
31*59bfda1fSAndroid Build Coastguard Worker #include <linux/types.h>
32*59bfda1fSAndroid Build Coastguard Worker #endif
33*59bfda1fSAndroid Build Coastguard Worker #ifdef __KERNEL__
34*59bfda1fSAndroid Build Coastguard Worker #include <linux/fs.h>
35*59bfda1fSAndroid Build Coastguard Worker #endif
36*59bfda1fSAndroid Build Coastguard Worker #include <inttypes.h>
37*59bfda1fSAndroid Build Coastguard Worker
38*59bfda1fSAndroid Build Coastguard Worker #ifndef FIBMAP
39*59bfda1fSAndroid Build Coastguard Worker #define FIBMAP _IO(0x00, 1) /* bmap access */
40*59bfda1fSAndroid Build Coastguard Worker #endif
41*59bfda1fSAndroid Build Coastguard Worker
42*59bfda1fSAndroid Build Coastguard Worker struct file_ext {
43*59bfda1fSAndroid Build Coastguard Worker __u64 f_pos;
44*59bfda1fSAndroid Build Coastguard Worker __u32 start_blk;
45*59bfda1fSAndroid Build Coastguard Worker __u32 end_blk;
46*59bfda1fSAndroid Build Coastguard Worker __u32 blk_count;
47*59bfda1fSAndroid Build Coastguard Worker };
48*59bfda1fSAndroid Build Coastguard Worker
print_ext(struct file_ext * ext)49*59bfda1fSAndroid Build Coastguard Worker void print_ext(struct file_ext *ext)
50*59bfda1fSAndroid Build Coastguard Worker {
51*59bfda1fSAndroid Build Coastguard Worker if (ext->end_blk == 0)
52*59bfda1fSAndroid Build Coastguard Worker printf("%8llu %8d %8d %8d\n", ext->f_pos, 0, 0, ext->blk_count);
53*59bfda1fSAndroid Build Coastguard Worker else
54*59bfda1fSAndroid Build Coastguard Worker printf("%8llu %8d %8d %8d\n", ext->f_pos, ext->start_blk,
55*59bfda1fSAndroid Build Coastguard Worker ext->end_blk, ext->blk_count);
56*59bfda1fSAndroid Build Coastguard Worker }
57*59bfda1fSAndroid Build Coastguard Worker
58*59bfda1fSAndroid Build Coastguard Worker #if defined(HAVE_FSTAT64) && !defined(__OSX_AVAILABLE_BUT_DEPRECATED)
print_stat(struct stat64 * st)59*59bfda1fSAndroid Build Coastguard Worker void print_stat(struct stat64 *st)
60*59bfda1fSAndroid Build Coastguard Worker #else
61*59bfda1fSAndroid Build Coastguard Worker void print_stat(struct stat *st)
62*59bfda1fSAndroid Build Coastguard Worker #endif
63*59bfda1fSAndroid Build Coastguard Worker {
64*59bfda1fSAndroid Build Coastguard Worker printf("--------------------------------------------\n");
65*59bfda1fSAndroid Build Coastguard Worker printf("dev [%d:%d]\n", major(st->st_dev), minor(st->st_dev));
66*59bfda1fSAndroid Build Coastguard Worker printf("ino [0x%8"PRIx64" : %"PRIu64"]\n",
67*59bfda1fSAndroid Build Coastguard Worker st->st_ino, st->st_ino);
68*59bfda1fSAndroid Build Coastguard Worker printf("mode [0x%8x : %d]\n", st->st_mode, st->st_mode);
69*59bfda1fSAndroid Build Coastguard Worker printf("nlink [0x%8lx : %ld]\n",
70*59bfda1fSAndroid Build Coastguard Worker (unsigned long)st->st_nlink,
71*59bfda1fSAndroid Build Coastguard Worker (long)st->st_nlink);
72*59bfda1fSAndroid Build Coastguard Worker printf("uid [0x%8x : %d]\n", st->st_uid, st->st_uid);
73*59bfda1fSAndroid Build Coastguard Worker printf("gid [0x%8x : %d]\n", st->st_gid, st->st_gid);
74*59bfda1fSAndroid Build Coastguard Worker printf("size [0x%8"PRIx64" : %"PRIu64"]\n",
75*59bfda1fSAndroid Build Coastguard Worker (u64)st->st_size, (u64)st->st_size);
76*59bfda1fSAndroid Build Coastguard Worker printf("blksize [0x%8lx : %ld]\n",
77*59bfda1fSAndroid Build Coastguard Worker (unsigned long)st->st_blksize,
78*59bfda1fSAndroid Build Coastguard Worker (long)st->st_blksize);
79*59bfda1fSAndroid Build Coastguard Worker printf("blocks [0x%8"PRIx64" : %"PRIu64"]\n",
80*59bfda1fSAndroid Build Coastguard Worker (u64)st->st_blocks, (u64)st->st_blocks);
81*59bfda1fSAndroid Build Coastguard Worker printf("--------------------------------------------\n\n");
82*59bfda1fSAndroid Build Coastguard Worker }
83*59bfda1fSAndroid Build Coastguard Worker
84*59bfda1fSAndroid Build Coastguard Worker #if defined(HAVE_FSTAT64) && !defined(__OSX_AVAILABLE_BUT_DEPRECATED)
stat_bdev(struct stat64 * st,unsigned int * start_lba)85*59bfda1fSAndroid Build Coastguard Worker static void stat_bdev(struct stat64 *st, unsigned int *start_lba)
86*59bfda1fSAndroid Build Coastguard Worker #else
87*59bfda1fSAndroid Build Coastguard Worker static void stat_bdev(struct stat *st, unsigned int *start_lba)
88*59bfda1fSAndroid Build Coastguard Worker #endif
89*59bfda1fSAndroid Build Coastguard Worker {
90*59bfda1fSAndroid Build Coastguard Worker struct stat bdev_stat;
91*59bfda1fSAndroid Build Coastguard Worker #ifdef HDIO_GETGIO
92*59bfda1fSAndroid Build Coastguard Worker struct hd_geometry geom;
93*59bfda1fSAndroid Build Coastguard Worker #endif
94*59bfda1fSAndroid Build Coastguard Worker char devname[32] = { 0, };
95*59bfda1fSAndroid Build Coastguard Worker char linkname[32] = { 0, };
96*59bfda1fSAndroid Build Coastguard Worker int fd;
97*59bfda1fSAndroid Build Coastguard Worker
98*59bfda1fSAndroid Build Coastguard Worker sprintf(devname, "/sys/dev/block/%d:%d", major(st->st_dev), minor(st->st_dev));
99*59bfda1fSAndroid Build Coastguard Worker
100*59bfda1fSAndroid Build Coastguard Worker fd = open(devname, O_RDONLY);
101*59bfda1fSAndroid Build Coastguard Worker if (fd < 0)
102*59bfda1fSAndroid Build Coastguard Worker return;
103*59bfda1fSAndroid Build Coastguard Worker
104*59bfda1fSAndroid Build Coastguard Worker if (fstat(fd, &bdev_stat) < 0)
105*59bfda1fSAndroid Build Coastguard Worker goto out;
106*59bfda1fSAndroid Build Coastguard Worker
107*59bfda1fSAndroid Build Coastguard Worker if (S_ISBLK(bdev_stat.st_mode)) {
108*59bfda1fSAndroid Build Coastguard Worker #ifdef HDIO_GETGIO
109*59bfda1fSAndroid Build Coastguard Worker if (ioctl(fd, HDIO_GETGEO, &geom) < 0)
110*59bfda1fSAndroid Build Coastguard Worker *start_lba = 0;
111*59bfda1fSAndroid Build Coastguard Worker else
112*59bfda1fSAndroid Build Coastguard Worker *start_lba = geom.start;
113*59bfda1fSAndroid Build Coastguard Worker #else
114*59bfda1fSAndroid Build Coastguard Worker *start_lba = 0;
115*59bfda1fSAndroid Build Coastguard Worker #endif
116*59bfda1fSAndroid Build Coastguard Worker }
117*59bfda1fSAndroid Build Coastguard Worker
118*59bfda1fSAndroid Build Coastguard Worker if (readlink(devname, linkname, sizeof(linkname)) < 0)
119*59bfda1fSAndroid Build Coastguard Worker goto out;
120*59bfda1fSAndroid Build Coastguard Worker
121*59bfda1fSAndroid Build Coastguard Worker printf("----------------bdev info-------------------\n");
122*59bfda1fSAndroid Build Coastguard Worker printf("devname = %s\n", basename(linkname));
123*59bfda1fSAndroid Build Coastguard Worker printf("start_lba = %u\n", *start_lba);
124*59bfda1fSAndroid Build Coastguard Worker
125*59bfda1fSAndroid Build Coastguard Worker out:
126*59bfda1fSAndroid Build Coastguard Worker close(fd);
127*59bfda1fSAndroid Build Coastguard Worker
128*59bfda1fSAndroid Build Coastguard Worker }
129*59bfda1fSAndroid Build Coastguard Worker
main(int argc,char * argv[])130*59bfda1fSAndroid Build Coastguard Worker int main(int argc, char *argv[])
131*59bfda1fSAndroid Build Coastguard Worker {
132*59bfda1fSAndroid Build Coastguard Worker int fd;
133*59bfda1fSAndroid Build Coastguard Worker int ret = 0;
134*59bfda1fSAndroid Build Coastguard Worker char *filename;
135*59bfda1fSAndroid Build Coastguard Worker #if defined(HAVE_FSTAT64) && !defined(__OSX_AVAILABLE_BUT_DEPRECATED)
136*59bfda1fSAndroid Build Coastguard Worker struct stat64 st;
137*59bfda1fSAndroid Build Coastguard Worker #else
138*59bfda1fSAndroid Build Coastguard Worker struct stat st;
139*59bfda1fSAndroid Build Coastguard Worker #endif
140*59bfda1fSAndroid Build Coastguard Worker int total_blks;
141*59bfda1fSAndroid Build Coastguard Worker unsigned int i;
142*59bfda1fSAndroid Build Coastguard Worker struct file_ext ext;
143*59bfda1fSAndroid Build Coastguard Worker __u32 start_lba;
144*59bfda1fSAndroid Build Coastguard Worker __u32 blknum;
145*59bfda1fSAndroid Build Coastguard Worker
146*59bfda1fSAndroid Build Coastguard Worker if (argc != 2) {
147*59bfda1fSAndroid Build Coastguard Worker fprintf(stderr, "No filename\n");
148*59bfda1fSAndroid Build Coastguard Worker exit(-1);
149*59bfda1fSAndroid Build Coastguard Worker }
150*59bfda1fSAndroid Build Coastguard Worker filename = argv[1];
151*59bfda1fSAndroid Build Coastguard Worker
152*59bfda1fSAndroid Build Coastguard Worker fd = open(filename, O_RDONLY|O_LARGEFILE);
153*59bfda1fSAndroid Build Coastguard Worker if (fd < 0) {
154*59bfda1fSAndroid Build Coastguard Worker ret = errno;
155*59bfda1fSAndroid Build Coastguard Worker perror(filename);
156*59bfda1fSAndroid Build Coastguard Worker exit(-1);
157*59bfda1fSAndroid Build Coastguard Worker }
158*59bfda1fSAndroid Build Coastguard Worker
159*59bfda1fSAndroid Build Coastguard Worker fsync(fd);
160*59bfda1fSAndroid Build Coastguard Worker
161*59bfda1fSAndroid Build Coastguard Worker #if defined(HAVE_FSTAT64) && !defined(__OSX_AVAILABLE_BUT_DEPRECATED)
162*59bfda1fSAndroid Build Coastguard Worker if (fstat64(fd, &st) < 0) {
163*59bfda1fSAndroid Build Coastguard Worker #else
164*59bfda1fSAndroid Build Coastguard Worker if (fstat(fd, &st) < 0) {
165*59bfda1fSAndroid Build Coastguard Worker #endif
166*59bfda1fSAndroid Build Coastguard Worker ret = errno;
167*59bfda1fSAndroid Build Coastguard Worker perror(filename);
168*59bfda1fSAndroid Build Coastguard Worker goto out;
169*59bfda1fSAndroid Build Coastguard Worker }
170*59bfda1fSAndroid Build Coastguard Worker
171*59bfda1fSAndroid Build Coastguard Worker stat_bdev(&st, &start_lba);
172*59bfda1fSAndroid Build Coastguard Worker
173*59bfda1fSAndroid Build Coastguard Worker total_blks = (st.st_size + st.st_blksize - 1) / st.st_blksize;
174*59bfda1fSAndroid Build Coastguard Worker
175*59bfda1fSAndroid Build Coastguard Worker printf("\n----------------file info-------------------\n");
176*59bfda1fSAndroid Build Coastguard Worker printf("%s :\n", filename);
177*59bfda1fSAndroid Build Coastguard Worker print_stat(&st);
178*59bfda1fSAndroid Build Coastguard Worker printf("file_pos start_blk end_blk blks\n");
179*59bfda1fSAndroid Build Coastguard Worker
180*59bfda1fSAndroid Build Coastguard Worker blknum = 0;
181*59bfda1fSAndroid Build Coastguard Worker if (ioctl(fd, FIBMAP, &blknum) < 0) {
182*59bfda1fSAndroid Build Coastguard Worker ret = errno;
183*59bfda1fSAndroid Build Coastguard Worker perror("ioctl(FIBMAP)");
184*59bfda1fSAndroid Build Coastguard Worker goto out;
185*59bfda1fSAndroid Build Coastguard Worker }
186*59bfda1fSAndroid Build Coastguard Worker ext.f_pos = 0;
187*59bfda1fSAndroid Build Coastguard Worker ext.start_blk = blknum;
188*59bfda1fSAndroid Build Coastguard Worker ext.end_blk = blknum;
189*59bfda1fSAndroid Build Coastguard Worker ext.blk_count = 1;
190*59bfda1fSAndroid Build Coastguard Worker
191*59bfda1fSAndroid Build Coastguard Worker for (i = 1; i < total_blks; i++) {
192*59bfda1fSAndroid Build Coastguard Worker blknum = i;
193*59bfda1fSAndroid Build Coastguard Worker
194*59bfda1fSAndroid Build Coastguard Worker if (ioctl(fd, FIBMAP, &blknum) < 0) {
195*59bfda1fSAndroid Build Coastguard Worker ret = errno;
196*59bfda1fSAndroid Build Coastguard Worker perror("ioctl(FIBMAP)");
197*59bfda1fSAndroid Build Coastguard Worker goto out;
198*59bfda1fSAndroid Build Coastguard Worker }
199*59bfda1fSAndroid Build Coastguard Worker
200*59bfda1fSAndroid Build Coastguard Worker if ((blknum == 0 && blknum == ext.end_blk) || (ext.end_blk + 1) == blknum) {
201*59bfda1fSAndroid Build Coastguard Worker ext.end_blk = blknum;
202*59bfda1fSAndroid Build Coastguard Worker ext.blk_count++;
203*59bfda1fSAndroid Build Coastguard Worker } else {
204*59bfda1fSAndroid Build Coastguard Worker print_ext(&ext);
205*59bfda1fSAndroid Build Coastguard Worker ext.f_pos = (__u64)i * st.st_blksize;
206*59bfda1fSAndroid Build Coastguard Worker ext.start_blk = blknum;
207*59bfda1fSAndroid Build Coastguard Worker ext.end_blk = blknum;
208*59bfda1fSAndroid Build Coastguard Worker ext.blk_count = 1;
209*59bfda1fSAndroid Build Coastguard Worker }
210*59bfda1fSAndroid Build Coastguard Worker }
211*59bfda1fSAndroid Build Coastguard Worker
212*59bfda1fSAndroid Build Coastguard Worker print_ext(&ext);
213*59bfda1fSAndroid Build Coastguard Worker out:
214*59bfda1fSAndroid Build Coastguard Worker close(fd);
215*59bfda1fSAndroid Build Coastguard Worker return ret;
216*59bfda1fSAndroid Build Coastguard Worker }
217