mirror of
https://gitee.com/openharmony/third_party_f2fs-tools
synced 2024-11-23 10:10:00 +00:00
mkfs.f2fs: Windows Android SDK support
This patch enables cross compilation for Windows Android SDK by using ANDROID_WINDOWS_HOST. Signed-off-by: Hyojun Kim <hyojun@google.com>
This commit is contained in:
parent
789ac2df1f
commit
b44f7262a1
@ -60,3 +60,7 @@
|
||||
#define HAVE_LIBSELINUX 1
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if defined(_WIN32)
|
||||
#define HAVE_LSEEK64
|
||||
#endif
|
||||
|
@ -53,6 +53,14 @@
|
||||
# define UNUSED(x) x
|
||||
#endif
|
||||
|
||||
#ifdef ANDROID_WINDOWS_HOST
|
||||
#undef HAVE_LINUX_TYPES_H
|
||||
typedef uint64_t u_int64_t;
|
||||
typedef uint32_t u_int32_t;
|
||||
typedef uint16_t u_int16_t;
|
||||
typedef uint8_t u_int8_t;
|
||||
#endif
|
||||
|
||||
typedef u_int64_t u64;
|
||||
typedef u_int32_t u32;
|
||||
typedef u_int16_t u16;
|
||||
@ -460,6 +468,7 @@ struct f2fs_configuration {
|
||||
*/
|
||||
#define __round_mask(x, y) ((__typeof__(x))((y)-1))
|
||||
#define round_down(x, y) ((x) & ~__round_mask(x, y))
|
||||
|
||||
#define min(x, y) ({ \
|
||||
typeof(x) _min1 = (x); \
|
||||
typeof(y) _min2 = (y); \
|
||||
@ -547,11 +556,13 @@ enum {
|
||||
/*
|
||||
* For superblock
|
||||
*/
|
||||
#pragma pack(1)
|
||||
struct f2fs_device {
|
||||
__u8 path[MAX_PATH_LEN];
|
||||
__le32 total_segments;
|
||||
} __attribute__((packed));
|
||||
|
||||
#pragma pack(1)
|
||||
struct f2fs_super_block {
|
||||
__le32 magic; /* Magic Number */
|
||||
__le16 major_ver; /* Major Version */
|
||||
@ -608,6 +619,7 @@ struct f2fs_super_block {
|
||||
#define CP_ORPHAN_PRESENT_FLAG 0x00000002
|
||||
#define CP_UMOUNT_FLAG 0x00000001
|
||||
|
||||
#pragma pack(1)
|
||||
struct f2fs_checkpoint {
|
||||
__le64 checkpoint_ver; /* checkpoint block version number */
|
||||
__le64 user_block_count; /* # of user blocks */
|
||||
@ -644,6 +656,7 @@ struct f2fs_checkpoint {
|
||||
*/
|
||||
#define F2FS_ORPHANS_PER_BLOCK 1020
|
||||
|
||||
#pragma pack(1)
|
||||
struct f2fs_orphan_block {
|
||||
__le32 ino[F2FS_ORPHANS_PER_BLOCK]; /* inode numbers */
|
||||
__le32 reserved; /* reserved */
|
||||
@ -656,6 +669,7 @@ struct f2fs_orphan_block {
|
||||
/*
|
||||
* For NODE structure
|
||||
*/
|
||||
#pragma pack(1)
|
||||
struct f2fs_extent {
|
||||
__le32 fofs; /* start file offset of the extent */
|
||||
__le32 blk_addr; /* start block address of the extent */
|
||||
@ -722,6 +736,7 @@ struct f2fs_extent {
|
||||
#define file_is_encrypt(fi) ((fi)->i_advise & FADVISE_ENCRYPT_BIT)
|
||||
#define file_enc_name(fi) ((fi)->i_advise & FADVISE_ENC_NAME_BIT)
|
||||
|
||||
#pragma pack(1)
|
||||
struct f2fs_inode {
|
||||
__le16 i_mode; /* file mode */
|
||||
__u8 i_advise; /* file hints */
|
||||
@ -762,10 +777,13 @@ struct f2fs_inode {
|
||||
double_indirect(1) node id */
|
||||
} __attribute__((packed));
|
||||
|
||||
|
||||
#pragma pack(1)
|
||||
struct direct_node {
|
||||
__le32 addr[ADDRS_PER_BLOCK]; /* array of data block address */
|
||||
} __attribute__((packed));
|
||||
|
||||
#pragma pack(1)
|
||||
struct indirect_node {
|
||||
__le32 nid[NIDS_PER_BLOCK]; /* array of data block address */
|
||||
} __attribute__((packed));
|
||||
@ -779,7 +797,7 @@ enum {
|
||||
|
||||
#define XATTR_NODE_OFFSET ((((unsigned int)-1) << OFFSET_BIT_SHIFT) \
|
||||
>> OFFSET_BIT_SHIFT)
|
||||
|
||||
#pragma pack(1)
|
||||
struct node_footer {
|
||||
__le32 nid; /* node id */
|
||||
__le32 ino; /* inode nunmber */
|
||||
@ -788,6 +806,7 @@ struct node_footer {
|
||||
__le32 next_blkaddr; /* next node page block address */
|
||||
} __attribute__((packed));
|
||||
|
||||
#pragma pack(1)
|
||||
struct f2fs_node {
|
||||
/* can be one of three types: inode, direct, and indirect types */
|
||||
union {
|
||||
@ -804,12 +823,14 @@ struct f2fs_node {
|
||||
#define NAT_ENTRY_PER_BLOCK (PAGE_CACHE_SIZE / sizeof(struct f2fs_nat_entry))
|
||||
#define NAT_BLOCK_OFFSET(start_nid) (start_nid / NAT_ENTRY_PER_BLOCK)
|
||||
|
||||
#pragma pack(1)
|
||||
struct f2fs_nat_entry {
|
||||
__u8 version; /* latest version of cached nat entry */
|
||||
__le32 ino; /* inode number */
|
||||
__le32 block_addr; /* block address */
|
||||
} __attribute__((packed));
|
||||
|
||||
#pragma pack(1)
|
||||
struct f2fs_nat_block {
|
||||
struct f2fs_nat_entry entries[NAT_ENTRY_PER_BLOCK];
|
||||
} __attribute__((packed));
|
||||
@ -846,12 +867,14 @@ struct f2fs_nat_block {
|
||||
((le16_to_cpu((raw_sit)->vblocks) & ~SIT_VBLOCKS_MASK) \
|
||||
>> SIT_VBLOCKS_SHIFT)
|
||||
|
||||
#pragma pack(1)
|
||||
struct f2fs_sit_entry {
|
||||
__le16 vblocks; /* reference above */
|
||||
__u8 valid_map[SIT_VBLOCK_MAP_SIZE]; /* bitmap for valid blocks */
|
||||
__le64 mtime; /* segment age for cleaning */
|
||||
} __attribute__((packed));
|
||||
|
||||
#pragma pack(1)
|
||||
struct f2fs_sit_block {
|
||||
struct f2fs_sit_entry entries[SIT_ENTRY_PER_BLOCK];
|
||||
} __attribute__((packed));
|
||||
@ -877,10 +900,12 @@ struct f2fs_sit_block {
|
||||
#define SUM_ENTRIES_SIZE (SUMMARY_SIZE * ENTRIES_IN_SUM)
|
||||
|
||||
/* a summary entry for a 4KB-sized block in a segment */
|
||||
#pragma pack(1)
|
||||
struct f2fs_summary {
|
||||
__le32 nid; /* parent node id */
|
||||
union {
|
||||
__u8 reserved[3];
|
||||
#pragma pack(1)
|
||||
struct {
|
||||
__u8 version; /* node version number */
|
||||
__le16 ofs_in_node; /* block index in parent node */
|
||||
@ -892,6 +917,7 @@ struct f2fs_summary {
|
||||
#define SUM_TYPE_NODE (1)
|
||||
#define SUM_TYPE_DATA (0)
|
||||
|
||||
#pragma pack(1)
|
||||
struct summary_footer {
|
||||
unsigned char entry_type; /* SUM_TYPE_XXX */
|
||||
__le32 check_sum; /* summary checksum */
|
||||
@ -923,31 +949,37 @@ enum {
|
||||
SIT_JOURNAL
|
||||
};
|
||||
|
||||
#pragma pack(1)
|
||||
struct nat_journal_entry {
|
||||
__le32 nid;
|
||||
struct f2fs_nat_entry ne;
|
||||
} __attribute__((packed));
|
||||
|
||||
#pragma pack(1)
|
||||
struct nat_journal {
|
||||
struct nat_journal_entry entries[NAT_JOURNAL_ENTRIES];
|
||||
__u8 reserved[NAT_JOURNAL_RESERVED];
|
||||
} __attribute__((packed));
|
||||
|
||||
#pragma pack(1)
|
||||
struct sit_journal_entry {
|
||||
__le32 segno;
|
||||
struct f2fs_sit_entry se;
|
||||
} __attribute__((packed));
|
||||
|
||||
#pragma pack(1)
|
||||
struct sit_journal {
|
||||
struct sit_journal_entry entries[SIT_JOURNAL_ENTRIES];
|
||||
__u8 reserved[SIT_JOURNAL_RESERVED];
|
||||
} __attribute__((packed));
|
||||
|
||||
#pragma pack(1)
|
||||
struct f2fs_extra_info {
|
||||
__le64 kbytes_written;
|
||||
__u8 reserved[EXTRA_INFO_RESERVED];
|
||||
} __attribute__((packed));
|
||||
|
||||
#pragma pack(1)
|
||||
struct f2fs_journal {
|
||||
union {
|
||||
__le16 n_nats;
|
||||
@ -962,6 +994,7 @@ struct f2fs_journal {
|
||||
} __attribute__((packed));
|
||||
|
||||
/* 4KB-sized summary block structure */
|
||||
#pragma pack(1)
|
||||
struct f2fs_summary_block {
|
||||
struct f2fs_summary entries[ENTRIES_IN_SUM];
|
||||
struct f2fs_journal journal;
|
||||
@ -1001,6 +1034,7 @@ typedef __le32 f2fs_hash_t;
|
||||
NR_DENTRY_IN_BLOCK + SIZE_OF_DENTRY_BITMAP))
|
||||
|
||||
/* One directory entry slot representing F2FS_SLOT_LEN-sized file name */
|
||||
#pragma pack(1)
|
||||
struct f2fs_dir_entry {
|
||||
__le32 hash_code; /* hash code of file name */
|
||||
__le32 ino; /* inode number */
|
||||
@ -1009,6 +1043,7 @@ struct f2fs_dir_entry {
|
||||
} __attribute__((packed));
|
||||
|
||||
/* 4KB-sized directory entry block */
|
||||
#pragma pack(1)
|
||||
struct f2fs_dentry_block {
|
||||
/* validity bitmap for directory entries in each block */
|
||||
__u8 dentry_bitmap[SIZE_OF_DENTRY_BITMAP];
|
||||
|
@ -44,12 +44,14 @@ enum quota_type {
|
||||
|
||||
#define QT_TREEOFF 1 /* Offset of tree in file in blocks */
|
||||
|
||||
#pragma pack(1)
|
||||
struct v2_disk_dqheader {
|
||||
u_int32_t dqh_magic; /* Magic number identifying file */
|
||||
u_int32_t dqh_version; /* File version */
|
||||
} __attribute__ ((packed));
|
||||
|
||||
/* Header with type and version specific information */
|
||||
#pragma pack(1)
|
||||
struct v2_disk_dqinfo {
|
||||
u_int32_t dqi_bgrace; /* Time before block soft limit becomes hard limit */
|
||||
u_int32_t dqi_igrace; /* Time before inode soft limit becomes hard limit */
|
||||
@ -59,6 +61,7 @@ struct v2_disk_dqinfo {
|
||||
u_int32_t dqi_free_entry; /* Number of block with at least one free entry */
|
||||
} __attribute__ ((packed));
|
||||
|
||||
#pragma pack(1)
|
||||
struct v2r1_disk_dqblk {
|
||||
__le32 dqb_id; /* id this quota applies to */
|
||||
__le32 dqb_pad;
|
||||
|
112
lib/libf2fs.c
112
lib/libf2fs.c
@ -20,8 +20,10 @@
|
||||
#endif
|
||||
#include <time.h>
|
||||
#include <sys/stat.h>
|
||||
#ifndef ANDROID_WINDOWS_HOST
|
||||
#include <sys/mount.h>
|
||||
#include <sys/ioctl.h>
|
||||
#endif
|
||||
#ifdef HAVE_SYS_SYSMACROS_H
|
||||
#include <sys/sysmacros.h>
|
||||
#endif
|
||||
@ -42,8 +44,11 @@
|
||||
#define MODELINQUIRY 0x12,0x00,0x00,0x00,0x4A,0x00
|
||||
#endif
|
||||
|
||||
#ifndef _WIN32 /* O_BINARY is windows-specific flag */
|
||||
#ifndef ANDROID_WINDOWS_HOST /* O_BINARY is windows-specific flag */
|
||||
#define O_BINARY 0
|
||||
#else
|
||||
/* On Windows, wchar_t is 8 bit sized and it causes compilation errors. */
|
||||
#define wchar_t int
|
||||
#endif
|
||||
|
||||
/*
|
||||
@ -528,6 +533,9 @@ __u32 f2fs_inode_chksum(struct f2fs_node *node)
|
||||
*/
|
||||
const char *get_rootdev()
|
||||
{
|
||||
#ifdef ANDROID_WINDOWS_HOST
|
||||
return NULL;
|
||||
#else
|
||||
struct stat sb;
|
||||
int fd, ret;
|
||||
char buf[32];
|
||||
@ -568,6 +576,7 @@ const char *get_rootdev()
|
||||
snprintf(rootdev, PATH_MAX + 1, "/dev/%s", buf);
|
||||
|
||||
return rootdev;
|
||||
#endif
|
||||
}
|
||||
|
||||
/*
|
||||
@ -643,6 +652,9 @@ static int is_mounted(const char *mpt, const char *device)
|
||||
|
||||
int f2fs_dev_is_umounted(char *path)
|
||||
{
|
||||
#ifdef ANDROID_WINDOWS_HOST
|
||||
return 0;
|
||||
#else
|
||||
struct stat st_buf;
|
||||
int is_rootdev = 0;
|
||||
int ret = 0;
|
||||
@ -701,6 +713,7 @@ int f2fs_dev_is_umounted(char *path)
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
#endif
|
||||
}
|
||||
|
||||
int f2fs_devs_are_umounted(void)
|
||||
@ -742,6 +755,7 @@ void get_kernel_version(__u8 *version)
|
||||
#define BLKSSZGET DKIOCGETBLOCKCOUNT
|
||||
#endif /* APPLE_DARWIN */
|
||||
|
||||
#ifndef ANDROID_WINDOWS_HOST
|
||||
int get_device_info(int i)
|
||||
{
|
||||
int32_t fd = 0;
|
||||
@ -890,6 +904,102 @@ int get_device_info(int i)
|
||||
return 0;
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
#include "windows.h"
|
||||
#include "winioctl.h"
|
||||
|
||||
#if (_WIN32_WINNT >= 0x0500)
|
||||
#define HAVE_GET_FILE_SIZE_EX 1
|
||||
#endif
|
||||
|
||||
static int win_get_device_size(const char *file, uint64_t *device_size)
|
||||
{
|
||||
HANDLE dev;
|
||||
PARTITION_INFORMATION pi;
|
||||
DISK_GEOMETRY gi;
|
||||
DWORD retbytes;
|
||||
#ifdef HAVE_GET_FILE_SIZE_EX
|
||||
LARGE_INTEGER filesize;
|
||||
#else
|
||||
DWORD filesize;
|
||||
#endif /* HAVE_GET_FILE_SIZE_EX */
|
||||
|
||||
dev = CreateFile(file, GENERIC_READ,
|
||||
FILE_SHARE_READ | FILE_SHARE_WRITE ,
|
||||
NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
|
||||
|
||||
if (dev == INVALID_HANDLE_VALUE)
|
||||
return EBADF;
|
||||
if (DeviceIoControl(dev, IOCTL_DISK_GET_PARTITION_INFO,
|
||||
&pi, sizeof(PARTITION_INFORMATION),
|
||||
&pi, sizeof(PARTITION_INFORMATION),
|
||||
&retbytes, NULL)) {
|
||||
|
||||
*device_size = pi.PartitionLength.QuadPart;
|
||||
|
||||
} else if (DeviceIoControl(dev, IOCTL_DISK_GET_DRIVE_GEOMETRY,
|
||||
&gi, sizeof(DISK_GEOMETRY),
|
||||
&gi, sizeof(DISK_GEOMETRY),
|
||||
&retbytes, NULL)) {
|
||||
|
||||
*device_size = gi.BytesPerSector *
|
||||
gi.SectorsPerTrack *
|
||||
gi.TracksPerCylinder *
|
||||
gi.Cylinders.QuadPart;
|
||||
|
||||
#ifdef HAVE_GET_FILE_SIZE_EX
|
||||
} else if (GetFileSizeEx(dev, &filesize)) {
|
||||
*device_size = filesize.QuadPart;
|
||||
}
|
||||
#else
|
||||
} else {
|
||||
filesize = GetFileSize(dev, NULL);
|
||||
if (INVALID_FILE_SIZE != filesize)
|
||||
return -1;
|
||||
*device_size = filesize;
|
||||
}
|
||||
#endif /* HAVE_GET_FILE_SIZE_EX */
|
||||
|
||||
CloseHandle(dev);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int get_device_info(int i)
|
||||
{
|
||||
struct device_info *dev = c.devices + i;
|
||||
uint64_t device_size = 0;
|
||||
int32_t fd = 0;
|
||||
|
||||
/* Block device target is not supported on Windows. */
|
||||
if (!c.sparse_mode) {
|
||||
if (win_get_device_size(dev->path, &device_size)) {
|
||||
MSG(0, "\tError: Failed to get device size!\n");
|
||||
return -1;
|
||||
}
|
||||
} else {
|
||||
device_size = c.device_size;
|
||||
}
|
||||
if (c.sparse_mode) {
|
||||
fd = open((char *)dev->path, O_WRONLY | O_CREAT | O_TRUNC | O_BINARY, 0644);
|
||||
} else {
|
||||
fd = open((char *)dev->path, O_RDWR | O_BINARY);
|
||||
}
|
||||
if (fd < 0) {
|
||||
MSG(0, "\tError: Failed to open the device!\n");
|
||||
return -1;
|
||||
}
|
||||
dev->fd = fd;
|
||||
dev->total_sectors = device_size / dev->sector_size;
|
||||
c.start_sector = 0;
|
||||
c.sector_size = dev->sector_size;
|
||||
c.sectors_per_blk = F2FS_BLKSIZE / c.sector_size;
|
||||
c.total_sectors += dev->total_sectors;
|
||||
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
int f2fs_get_device_info(void)
|
||||
{
|
||||
int i;
|
||||
|
@ -18,9 +18,11 @@
|
||||
#include <mntent.h>
|
||||
#endif
|
||||
#include <time.h>
|
||||
#ifndef ANDROID_WINDOWS_HOST
|
||||
#include <sys/stat.h>
|
||||
#include <sys/mount.h>
|
||||
#include <sys/ioctl.h>
|
||||
#endif
|
||||
#ifdef HAVE_LINUX_HDREG_H
|
||||
#include <linux/hdreg.h>
|
||||
#endif
|
||||
@ -261,6 +263,7 @@ int dev_reada_block(__u64 blk_addr)
|
||||
|
||||
int f2fs_fsync_device(void)
|
||||
{
|
||||
#ifndef ANDROID_WINDOWS_HOST
|
||||
int i;
|
||||
|
||||
for (i = 0; i < c.ndevs; i++) {
|
||||
@ -269,7 +272,7 @@ int f2fs_fsync_device(void)
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -354,12 +357,13 @@ int f2fs_finalize_device(void)
|
||||
* in the block device page cache.
|
||||
*/
|
||||
for (i = 0; i < c.ndevs; i++) {
|
||||
#ifndef ANDROID_WINDOWS_HOST
|
||||
ret = fsync(c.devices[i].fd);
|
||||
if (ret < 0) {
|
||||
MSG(0, "\tError: Could not conduct fsync!!!\n");
|
||||
break;
|
||||
}
|
||||
|
||||
#endif
|
||||
ret = close(c.devices[i].fd);
|
||||
if (ret < 0) {
|
||||
MSG(0, "\tError: Failed to close device file!!!\n");
|
||||
|
@ -15,7 +15,9 @@
|
||||
#include <unistd.h>
|
||||
#include <fcntl.h>
|
||||
#include <sys/stat.h>
|
||||
#ifndef ANDROID_WINDOWS_HOST
|
||||
#include <sys/ioctl.h>
|
||||
#endif
|
||||
#include <libgen.h>
|
||||
|
||||
#include <f2fs_fs.h>
|
||||
|
@ -13,8 +13,10 @@
|
||||
#include <fcntl.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#ifndef ANDROID_WINDOWS_HOST
|
||||
#include <sys/stat.h>
|
||||
#include <sys/mount.h>
|
||||
#endif
|
||||
#include <time.h>
|
||||
#include <uuid/uuid.h>
|
||||
|
||||
|
@ -14,7 +14,9 @@
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/stat.h>
|
||||
#ifndef ANDROID_WINDOWS_HOST
|
||||
#include <sys/mount.h>
|
||||
#endif
|
||||
#include <time.h>
|
||||
#include <uuid/uuid.h>
|
||||
#include <errno.h>
|
||||
|
@ -20,7 +20,9 @@
|
||||
|
||||
#include <stdio.h>
|
||||
#include <unistd.h>
|
||||
#ifndef ANDROID_WINDOWS_HOST
|
||||
#include <sys/ioctl.h>
|
||||
#endif
|
||||
#include <sys/stat.h>
|
||||
#include <fcntl.h>
|
||||
|
||||
@ -40,6 +42,7 @@
|
||||
|
||||
static int trim_device(int i)
|
||||
{
|
||||
#ifndef ANDROID_WINDOWS_HOST
|
||||
unsigned long long range[2];
|
||||
struct stat stat_buf;
|
||||
struct device_info *dev = c.devices + i;
|
||||
@ -83,6 +86,8 @@ static int trim_device(int i)
|
||||
}
|
||||
} else
|
||||
return -1;
|
||||
#endif
|
||||
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user