mirror of
https://gitee.com/openharmony/third_party_f2fs-tools
synced 2024-11-23 01:59:54 +00:00
f2fs_io: change fibmap to fiemap
Currently we support fiemap command using fibmap. It's simple and easy to use, but we cannot use this for compressed file. To support more different types of files, we need to change this to use fiemap. Signed-off-by: Daeho Jeong <daehojeong@google.com> Reviewed-by: Chao Yu <yuchao0@huawei.com> [Jaegeuk Kim: add Android build] Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
This commit is contained in:
parent
d41dcbdf46
commit
717d70db60
@ -93,6 +93,7 @@ AC_CHECK_HEADERS(m4_flatten([
|
||||
linux/posix_acl.h
|
||||
linux/types.h
|
||||
linux/xattr.h
|
||||
linux/fiemap.h
|
||||
mach/mach_time.h
|
||||
mntent.h
|
||||
scsi/sg.h
|
||||
|
@ -7,6 +7,8 @@
|
||||
#define HAVE_POSIX_ACL_H 1
|
||||
#define HAVE_LINUX_TYPES_H 1
|
||||
#define HAVE_LINUX_XATTR_H 1
|
||||
#define HAVE_LINUX_FS_H 1
|
||||
#define HAVE_LINUX_FIEMAP_H 1
|
||||
#define HAVE_MNTENT_H 1
|
||||
#define HAVE_STDLIB_H 1
|
||||
#define HAVE_STRING_H 1
|
||||
|
@ -1,7 +1,7 @@
|
||||
## Makefile.am
|
||||
|
||||
if LINUX
|
||||
AM_CPPFLAGS = -I./include
|
||||
AM_CPPFLAGS = -I../../include
|
||||
AM_CFLAGS = -Wall
|
||||
sbin_PROGRAMS = f2fs_io
|
||||
f2fs_io_SOURCES = f2fs_io.c
|
||||
|
@ -42,6 +42,8 @@
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "config.h"
|
||||
#endif
|
||||
#include <android_config.h>
|
||||
|
||||
#include "f2fs_io.h"
|
||||
|
||||
struct cmd_desc {
|
||||
@ -662,27 +664,18 @@ static void do_randread(int argc, char **argv, const struct cmd_desc *cmd)
|
||||
exit(0);
|
||||
}
|
||||
|
||||
struct file_ext {
|
||||
__u32 f_pos;
|
||||
__u32 start_blk;
|
||||
__u32 end_blk;
|
||||
__u32 blk_count;
|
||||
};
|
||||
|
||||
#ifndef FIBMAP
|
||||
#define FIBMAP _IO(0x00, 1) /* bmap access */
|
||||
#endif
|
||||
|
||||
#define fiemap_desc "get block address in file"
|
||||
#define fiemap_help \
|
||||
"f2fs_io fiemap [offset in 4kb] [count] [file_path]\n\n"\
|
||||
|
||||
#if defined(HAVE_LINUX_FIEMAP_H) && defined(HAVE_LINUX_FS_H)
|
||||
static void do_fiemap(int argc, char **argv, const struct cmd_desc *cmd)
|
||||
{
|
||||
u64 offset;
|
||||
u32 blknum;
|
||||
unsigned count, i;
|
||||
int fd;
|
||||
__u64 phy_addr;
|
||||
struct fiemap *fm = xmalloc(sizeof(struct fiemap) +
|
||||
sizeof(struct fiemap_extent));
|
||||
|
||||
if (argc != 4) {
|
||||
fputs("Excess arguments\n\n", stderr);
|
||||
@ -690,23 +683,37 @@ static void do_fiemap(int argc, char **argv, const struct cmd_desc *cmd)
|
||||
exit(1);
|
||||
}
|
||||
|
||||
offset = atoi(argv[1]);
|
||||
fm->fm_start = atoi(argv[1]) * F2FS_BLKSIZE;
|
||||
fm->fm_length = F2FS_BLKSIZE;
|
||||
fm->fm_extent_count = 1;
|
||||
count = atoi(argv[2]);
|
||||
|
||||
fd = xopen(argv[3], O_RDONLY | O_LARGEFILE, 0);
|
||||
|
||||
printf("Fiemap: offset = %08"PRIx64" len = %d\n", offset, count);
|
||||
printf("Fiemap: offset = %08"PRIx64" len = %d\n",
|
||||
(u64)fm->fm_start / F2FS_BLKSIZE, count);
|
||||
for (i = 0; i < count; i++) {
|
||||
blknum = offset + i;
|
||||
if (ioctl(fd, FS_IOC_FIEMAP, fm) < 0)
|
||||
die_errno("FIEMAP failed");
|
||||
|
||||
if (ioctl(fd, FIBMAP, &blknum) < 0)
|
||||
die_errno("FIBMAP failed");
|
||||
|
||||
printf("%u ", blknum);
|
||||
phy_addr = fm->fm_extents[0].fe_physical / F2FS_BLKSIZE;
|
||||
if (phy_addr == NEW_ADDR)
|
||||
printf("NEW_ADDR ");
|
||||
else
|
||||
printf("%llu ", phy_addr);
|
||||
fm->fm_start += F2FS_BLKSIZE;
|
||||
}
|
||||
printf("\n");
|
||||
free(fm);
|
||||
exit(0);
|
||||
}
|
||||
#else
|
||||
static void do_fiemap(int UNUSED(argc), char **UNUSED(argv),
|
||||
const struct cmd_desc *UNUSED(cmd))
|
||||
{
|
||||
die("Not support for this platform");
|
||||
}
|
||||
#endif
|
||||
|
||||
#define gc_urgent_desc "start/end/run gc_urgent for given time period"
|
||||
#define gc_urgent_help \
|
||||
|
@ -10,6 +10,13 @@
|
||||
#ifdef HAVE_LINUX_TYPES_H
|
||||
#include <linux/types.h>
|
||||
#endif
|
||||
#ifdef HAVE_LINUX_FIEMAP_H
|
||||
#include <linux/fiemap.h>
|
||||
#endif
|
||||
#ifdef HAVE_LINUX_FS_H
|
||||
#include <linux/fs.h>
|
||||
#endif
|
||||
|
||||
#include <sys/types.h>
|
||||
|
||||
#ifdef UNUSED
|
||||
@ -38,6 +45,9 @@ typedef u16 __be16;
|
||||
typedef u32 __be32;
|
||||
#endif
|
||||
|
||||
#define F2FS_BLKSIZE 4096
|
||||
#define NEW_ADDR 0xFFFFFFFF
|
||||
|
||||
#ifndef FS_IOC_GETFLAGS
|
||||
#define FS_IOC_GETFLAGS _IOR('f', 1, long)
|
||||
#endif
|
||||
|
Loading…
Reference in New Issue
Block a user