xref: /aosp_15_r20/external/f2fs-tools/tools/fibmap.c (revision 59bfda1f02d633cd6b8b69f31eee485d40f6eef6)
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