From: Daeho Jeong <[email protected]>

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 <[email protected]>
---
Changes in v2:
 - Move declaration to header file
---
 tools/f2fs_io/f2fs_io.c | 37 +++++++++++++++++--------------------
 tools/f2fs_io/f2fs_io.h | 26 ++++++++++++++++++++++++++
 2 files changed, 43 insertions(+), 20 deletions(-)

diff --git a/tools/f2fs_io/f2fs_io.c b/tools/f2fs_io/f2fs_io.c
index abb655a..9a651c0 100644
--- a/tools/f2fs_io/f2fs_io.c
+++ b/tools/f2fs_io/f2fs_io.c
@@ -631,27 +631,17 @@ 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"\
 
 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);
@@ -659,21 +649,28 @@ 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",
+                                       fm->fm_start / F2FS_BLKSIZE, count);
        for (i = 0; i < count; i++) {
-               blknum = offset + i;
-
-               if (ioctl(fd, FIBMAP, &blknum) < 0)
-                       die_errno("FIBMAP failed");
+               if (ioctl(fd, FIEMAP, fm) < 0)
+                       die_errno("FIEMAP failed");
 
-               printf("%u ", blknum);
+               phy_addr = fm->fm_extent[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);
 }
 
diff --git a/tools/f2fs_io/f2fs_io.h b/tools/f2fs_io/f2fs_io.h
index bd19ff9..62d6e7b 100644
--- a/tools/f2fs_io/f2fs_io.h
+++ b/tools/f2fs_io/f2fs_io.h
@@ -38,6 +38,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
@@ -132,6 +135,29 @@ typedef u32        __be32;
 #define FS_CASEFOLD_FL                 0x40000000 /* Folder is case 
insensitive */
 #endif
 
+struct fiemap_extent {
+       u64 fe_logical;
+       u64 fe_physical;
+       u64 fe_length;
+       u64 fe_reserved64[2];
+       u32 fe_flags;
+       u32 fe_reserved[3];
+};
+
+struct fiemap {
+       u64 fm_start;
+       u64 fm_length;
+       u32 fm_flags;
+       u32 fm_mapped_extents;
+       u32 fm_extent_count;
+       u32 fm_reserved;
+       struct fiemap_extent fm_extent[0];
+};
+
+#ifndef FIEMAP
+#define FIEMAP                         _IOWR('f', 11, struct fiemap)
+#endif
+
 struct f2fs_gc_range {
        u32 sync;
        u64 start;
-- 
2.28.0.526.ge36021eeef-goog



_______________________________________________
Linux-f2fs-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel

Reply via email to