Then, you mean like the below?
I hardly see any benefit in this way, because we still have to define
all the stuff.
#ifdef HAVE_LINUX_TYPES_H
#include <linux/fiemap.h>
#endif
#ifndef HAVE_LINUX_TYPES_H
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];
};
#define FIEMAP _IOWR('f', 11, struct fiemap)
#endif
2020년 9월 8일 (화) 오전 10:42, Chao Yu <[email protected]>님이 작성:
>
> On 2020/9/8 8:52, Daeho Jeong wrote:
> > I've thought about this.
> > We need to support this tool for different OS, not only for Linux.
> > So, is it ok to include linux/fiemap.h for this?
> > Actually, since FIEMAP and other stuff were defined in f2fs_io.c
> > directly before, I thought that there was some reason for doing that
> > and I followed the convention.
> >
> > What do you think?
>
> Yes, that's good point.
>
> I noticed that f2fs_io.h has similar concern:
>
> #ifdef HAVE_LINUX_TYPES_H
> #include <linux/types.h>
> #endif
>
> ...
>
> #ifndef HAVE_LINUX_TYPES_H
> typedef u8 __u8;
> typedef u16 __u16;
> typedef u32 __u32;
> typedef u16 __le16;
> typedef u32 __le32;
> typedef u16 __be16;
> typedef u32 __be32;
> #endif
>
> So how about implementing as above?
>
> Thanks,
>
> >
> > 2020년 9월 4일 (금) 오후 12:39, Daeho Jeong <[email protected]>님이 작성:
> >>
> >> It's way better~ :)
> >>
> >> 2020년 9월 4일 (금) 오후 12:11, Chao Yu <[email protected]>님이 작성:
> >>>
> >>>
> >>>
> >>> On 2020/9/3 10:44, Daeho Jeong wrote:
> >>>> 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];
> >>>> +};
> >>>
> >>> We don't need to copy & paste fiemap related structure here.
> >>>
> >>> Let's just include <linux/fiemap.h> in f2fs_io.h
> >>>
> >>> Thanks,
> >>>
> >>>> +
> >>>> +#ifndef FIEMAP
> >>>> +#define FIEMAP _IOWR('f', 11, struct
> >>>> fiemap)
> >>>> +#endif
> >>>> +
> >>>> struct f2fs_gc_range {
> >>>> u32 sync;
> >>>> u64 start;
> >>>>
> > .
> >
_______________________________________________
Linux-f2fs-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel