OSDN Git Service

f2fs_utils: update f2fs utils to match 1.8.0
authorJin Qian <jinqian@google.com>
Fri, 28 Apr 2017 22:00:57 +0000 (15:00 -0700)
committerJin Qian <jinqian@google.com>
Fri, 5 May 2017 18:13:13 +0000 (11:13 -0700)
Expose f2fs_configuration via dlsym and use first device for output.

Test: format userdata to f2fs and boot
Bug: 37758867
Change-Id: Iee011f551f192f643f7b6443b37f65d354491f20

f2fs_utils/f2fs_dlutils.c
f2fs_utils/f2fs_ioutils.c
f2fs_utils/f2fs_sparseblock.c
f2fs_utils/f2fs_utils.c

index 40be416..2ba3f7c 100644 (file)
 #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() {
@@ -58,7 +59,8 @@ 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;
index 4c12096..d3bc727 100644 (file)
@@ -83,7 +83,7 @@ struct selabel_handle;
 
 #endif
 
-struct f2fs_configuration config;
+extern struct f2fs_configuration *c_dl;
 struct sparse_file *f2fs_sparse_file;
 
 struct buf_item {
@@ -96,9 +96,9 @@ struct buf_item *buf_list;
 
 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)
@@ -138,7 +138,7 @@ static int dev_write_sparse(void *buf, __u64 byte_offset, size_t byte_len)
        return 0;
 }
 
-void f2fs_finalize_device(struct f2fs_configuration *c)
+void f2fs_finalize_device()
 {
 }
 
@@ -162,18 +162,22 @@ int dev_read(void  *buf, __u64 offset, size_t len)
 
 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.
index d5c1f3a..27225c6 100644 (file)
@@ -28,9 +28,9 @@
       #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)
 {
@@ -132,27 +132,28 @@ static void dbg_print_info_struct(struct f2fs_info *info)
     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");
 }
 
@@ -362,7 +363,7 @@ static int get_sit_summary(int fd, struct f2fs_info *info, struct f2fs_checkpoin
     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))
@@ -505,9 +506,9 @@ int run_on_used_blocks(u64 startblock, struct f2fs_info *info, int (*func)(u64 p
 
             /* 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;
                 }
index 6254c08..5223680 100644 (file)
@@ -42,15 +42,11 @@ struct selabel_handle;
 
 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;
@@ -64,10 +60,15 @@ int make_f2fs_sparse_fd(int fd, long long len,
                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);