#define F2FS_DYN_LIB "libf2fs_fmt_host_dyn.so"
int (*f2fs_format_device_dl)(void);
-void (*f2fs_init_configuration_dl)(struct f2fs_configuration *);
+void (*f2fs_init_configuration_dl)(void);
+struct f2fs_configuration *c_dl;
int f2fs_format_device(void) {
assert(f2fs_format_device_dl);
return f2fs_format_device_dl();
}
-void f2fs_init_configuration(struct f2fs_configuration *config) {
+void f2fs_init_configuration(void) {
assert(f2fs_init_configuration_dl);
- f2fs_init_configuration_dl(config);
+ f2fs_init_configuration_dl();
}
int dlopenf2fs() {
}
f2fs_format_device_dl = dlsym(f2fs_lib, "f2fs_format_device");
f2fs_init_configuration_dl = dlsym(f2fs_lib, "f2fs_init_configuration");
- if (!f2fs_format_device_dl || !f2fs_init_configuration_dl) {
+ c_dl = dlsym(f2fs_lib, "c");
+ if (!f2fs_format_device_dl || !f2fs_init_configuration_dl || !c_dl) {
return -1;
}
return 0;
#endif
-struct f2fs_configuration config;
+extern struct f2fs_configuration *c_dl;
struct sparse_file *f2fs_sparse_file;
struct buf_item {
static int dev_write_fd(void *buf, __u64 offset, size_t len)
{
- if (lseek64(config.fd, (off64_t)offset, SEEK_SET) < 0)
+ if (lseek64(c_dl->devices[0].fd, (off64_t)offset, SEEK_SET) < 0)
return -1;
- ssize_t written = write(config.fd, buf, len);
+ ssize_t written = write(c_dl->devices[0].fd, buf, len);
if (written == -1)
return -1;
if ((size_t)written != len)
return 0;
}
-void f2fs_finalize_device(struct f2fs_configuration *c)
+void f2fs_finalize_device()
{
}
int dev_write(void *buf, __u64 offset, size_t len)
{
- if (config.fd >= 0) {
+ if (c_dl->devices[0].fd >= 0) {
return dev_write_fd(buf, offset, len);
} else {
return dev_write_sparse(buf, offset, len);
}
}
+int dev_write_block(void *buf, __u64 offset)
+{
+ return dev_write(buf, offset << F2FS_BLKSIZE_BITS, F2FS_BLKSIZE);
+}
int dev_fill(void *buf, __u64 offset, size_t len)
{
int ret;
- if (config.fd >= 0) {
+ if (c_dl->devices[0].fd >= 0) {
return dev_write_fd(buf, offset, len);
}
// sparse file fills with zero by default.
#member, le64_to_cpu((ptr)->member), le64_to_cpu((ptr)->member) ); \
} while (0);
-#define segno_in_journal(sum, i) ((sum)->sit_j.entries[i].segno)
+#define segno_in_journal(jnl, i) ((jnl)->sit_j.entries[i].segno)
-#define sit_in_journal(sum, i) ((sum)->sit_j.entries[i].se)
+#define sit_in_journal(jnl, i) ((jnl)->sit_j.entries[i].se)
static void dbg_print_raw_sb_info(struct f2fs_super_block *sb)
{
SLOGD("+--------------------------------------------------------+\n");
SLOGD("| F2FS_INFO |\n");
SLOGD("+--------------------------------------------------------+\n");
- SLOGD("blocks_per_segment: %"PRIu64, info->blocks_per_segment);
+ SLOGD("blocks_per_segment: %" PRIu64, info->blocks_per_segment);
SLOGD("block_size: %d", info->block_size);
SLOGD("sit_bmp loc: %p", info->sit_bmp);
SLOGD("sit_bmp_size: %d", info->sit_bmp_size);
- SLOGD("blocks_per_sit: %"PRIu64, info->blocks_per_sit);
+ SLOGD("blocks_per_sit: %" PRIu64, info->blocks_per_sit);
SLOGD("sit_blocks loc: %p", info->sit_blocks);
SLOGD("sit_sums loc: %p", info->sit_sums);
- SLOGD("sit_sums num: %d", le16_to_cpu(info->sit_sums->n_sits));
+ SLOGD("sit_sums num: %d", le16_to_cpu(info->sit_sums->journal.n_sits));
unsigned int i;
- for(i = 0; i < (le16_to_cpu(info->sit_sums->n_sits)); i++) {
- SLOGD("entry %d in journal entries is for segment %d",i, le32_to_cpu(segno_in_journal(info->sit_sums, i)));
+ for(i = 0; i < (le16_to_cpu(info->sit_sums->journal.n_sits)); i++) {
+ SLOGD("entry %d in journal entries is for segment %d", i,
+ le32_to_cpu(segno_in_journal(&info->sit_sums->journal, i)));
}
- SLOGD("cp_blkaddr: %"PRIu64, info->cp_blkaddr);
- SLOGD("cp_valid_cp_blkaddr: %"PRIu64, info->cp_valid_cp_blkaddr);
- SLOGD("sit_blkaddr: %"PRIu64, info->sit_blkaddr);
- SLOGD("nat_blkaddr: %"PRIu64, info->nat_blkaddr);
- SLOGD("ssa_blkaddr: %"PRIu64, info->ssa_blkaddr);
- SLOGD("main_blkaddr: %"PRIu64, info->main_blkaddr);
- SLOGD("total_user_used: %"PRIu64, info->total_user_used);
- SLOGD("total_blocks: %"PRIu64, info->total_blocks);
+ SLOGD("cp_blkaddr: %" PRIu64, info->cp_blkaddr);
+ SLOGD("cp_valid_cp_blkaddr: %" PRIu64, info->cp_valid_cp_blkaddr);
+ SLOGD("sit_blkaddr: %" PRIu64, info->sit_blkaddr);
+ SLOGD("nat_blkaddr: %" PRIu64, info->nat_blkaddr);
+ SLOGD("ssa_blkaddr: %" PRIu64, info->ssa_blkaddr);
+ SLOGD("main_blkaddr: %" PRIu64, info->main_blkaddr);
+ SLOGD("total_user_used: %" PRIu64, info->total_user_used);
+ SLOGD("total_blocks: %" PRIu64, info->total_blocks);
SLOGD("\n\n");
}
if (is_set_ckpt_flags(cp, CP_COMPACT_SUM_FLAG)) {
if (read_structure_blk(fd, info->cp_valid_cp_blkaddr + le32_to_cpu(cp->cp_pack_start_sum), buffer, 1))
return -1;
- memcpy(&info->sit_sums->n_sits, &buffer[SUM_JOURNAL_SIZE], SUM_JOURNAL_SIZE);
+ memcpy(&info->sit_sums->journal.n_sits, &buffer[SUM_JOURNAL_SIZE], SUM_JOURNAL_SIZE);
} else {
u64 blk_addr;
if (is_set_ckpt_flags(cp, CP_UMOUNT_FLAG))
/* check the SIT entries in the journal */
found = 0;
- for(i = 0; i < le16_to_cpu(info->sit_sums->n_sits); i++) {
- if (le32_to_cpu(segno_in_journal(info->sit_sums, i)) == segnum) {
- sit_entry = &sit_in_journal(info->sit_sums, i);
+ for(i = 0; i < le16_to_cpu(info->sit_sums->journal.n_sits); i++) {
+ if (le32_to_cpu(segno_in_journal(&info->sit_sums->journal, i)) == segnum) {
+ sit_entry = &sit_in_journal(&info->sit_sums->journal, i);
found = 1;
break;
}
extern void flush_sparse_buffs();
-struct f2fs_configuration config;
+extern struct f2fs_configuration *c_dl;
struct sparse_file *f2fs_sparse_file;
extern int dlopenf2fs();
static void reset_f2fs_info() {
- // Reset all the global data structures used by make_f2fs so it
- // can be called again.
- memset(&config, 0, sizeof(config));
- config.fd = -1;
if (f2fs_sparse_file) {
sparse_file_destroy(f2fs_sparse_file);
f2fs_sparse_file = NULL;
return -1;
}
reset_f2fs_info();
- f2fs_init_configuration(&config);
+ f2fs_init_configuration();
len &= ~((__u64)(F2FS_BLKSIZE - 1));
- config.total_sectors = len / config.sector_size;
- config.start_sector = 0;
+ c_dl->ndevs = 1;
+ c_dl->devices[0].total_sectors = len / c_dl->devices[0].sector_size;
+ c_dl->sector_size = c_dl->devices[0].sector_size;
+ c_dl->sectors_per_blk = F2FS_BLKSIZE / c_dl->sector_size;
+ c_dl->total_sectors = c_dl->devices[0].total_sectors;
+ c_dl->start_sector = 0;
+ c_dl->trim = 0;
f2fs_sparse_file = sparse_file_new(F2FS_BLKSIZE, len);
f2fs_format_device();
sparse_file_write(f2fs_sparse_file, fd, /*gzip*/0, /*sparse*/1, /*crc*/0);