aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJP Abgrall <jpa@google.com>2014-03-31 15:33:01 -0700
committerJaegeuk Kim <jaegeuk.kim@samsung.com>2014-04-07 12:14:32 +0900
commita35529fce0c5171562ec0ebebcc6120d1604924b (patch)
tree91d1161060d6e80bbb4b79da5590e342f8e61059
parent15ea79b3ae7f0474ade43ba8b6eb328806e01e15 (diff)
downloadandroid_external_f2fs-tools-a35529fce0c5171562ec0ebebcc6120d1604924b.tar.gz
android_external_f2fs-tools-a35529fce0c5171562ec0ebebcc6120d1604924b.tar.bz2
android_external_f2fs-tools-a35529fce0c5171562ec0ebebcc6120d1604924b.zip
format: add support for dev_fill() and extra dev_*() debugging.
Support an fs_io dev_fill(). This helps with devices that actually already return 0 on uninitialized data. It also helps with in memory devices using sparse libs: don't allocate a block of 0s. Signed-off-by: JP Abgrall <jpa@google.com> Signed-off-by: Jaegeuk Kim <jaegeuk.kim@samsung.com>
-rw-r--r--include/f2fs_fs.h2
-rw-r--r--lib/libf2fs_io.c12
-rw-r--r--mkfs/f2fs_format.c21
3 files changed, 33 insertions, 2 deletions
diff --git a/include/f2fs_fs.h b/include/f2fs_fs.h
index 7210604..095d755 100644
--- a/include/f2fs_fs.h
+++ b/include/f2fs_fs.h
@@ -665,6 +665,8 @@ extern int f2fs_get_device_info(struct f2fs_configuration *);
extern int dev_read(void *, __u64, size_t);
extern int dev_write(void *, __u64, size_t);
+/* All bytes in the buffer must be 0 use dev_fill(). */
+extern int dev_fill(void *, __u64, size_t);
extern int dev_read_block(void *, __u64);
extern int dev_read_blocks(void *, __u64, __u32 );
diff --git a/lib/libf2fs_io.c b/lib/libf2fs_io.c
index e48dd1a..5f0a547 100644
--- a/lib/libf2fs_io.c
+++ b/lib/libf2fs_io.c
@@ -49,6 +49,18 @@ int dev_write(void *buf, __u64 offset, size_t len)
return 0;
}
+int dev_fill(void *buf, __u64 offset, size_t len)
+{
+ /* Only allow fill to zero */
+ if (*((__u8*)buf))
+ return -1;
+ if (lseek64(config.fd, (off64_t)offset, SEEK_SET) < 0)
+ return -1;
+ if (write(config.fd, buf, len) < 0)
+ return -1;
+ return 0;
+}
+
int dev_read_block(void *buf, __u64 blk_addr)
{
return dev_read(buf, blk_addr * F2FS_BLKSIZE, F2FS_BLKSIZE);
diff --git a/mkfs/f2fs_format.c b/mkfs/f2fs_format.c
index a46e60e..31b4422 100644
--- a/mkfs/f2fs_format.c
+++ b/mkfs/f2fs_format.c
@@ -376,10 +376,11 @@ static int f2fs_init_sit_area(void)
sit_seg_addr = le32_to_cpu(super_block.sit_blkaddr);
sit_seg_addr *= blk_size;
+ DBG(1, "\tFilling sit area at offset 0x%08"PRIx64"\n", sit_seg_addr);
for (index = 0;
index < (le32_to_cpu(super_block.segment_count_sit) / 2);
index++) {
- if (dev_write(zero_buf, sit_seg_addr, seg_size)) {
+ if (dev_fill(zero_buf, sit_seg_addr, seg_size)) {
MSG(1, "\tError: While zeroing out the sit area \
on disk!!!\n");
return -1;
@@ -411,10 +412,11 @@ static int f2fs_init_nat_area(void)
nat_seg_addr = le32_to_cpu(super_block.nat_blkaddr);
nat_seg_addr *= blk_size;
+ DBG(1, "\tFilling nat area at offset 0x%08"PRIx64"\n", nat_seg_addr);
for (index = 0;
index < (le32_to_cpu(super_block.segment_count_nat) / 2);
index++) {
- if (dev_write(nat_buf, nat_seg_addr, seg_size)) {
+ if (dev_fill(nat_buf, nat_seg_addr, seg_size)) {
MSG(1, "\tError: While zeroing out the nat area \
on disk!!!\n");
return -1;
@@ -510,6 +512,7 @@ static int f2fs_write_check_point_pack(void)
cp_seg_blk_offset = le32_to_cpu(super_block.segment0_blkaddr);
cp_seg_blk_offset *= blk_size_bytes;
+ DBG(1, "\tWriting main segments, ckp at offset 0x%08"PRIx64"\n", cp_seg_blk_offset);
if (dev_write(ckp, cp_seg_blk_offset, F2FS_BLKSIZE)) {
MSG(1, "\tError: While writing the ckp to disk!!!\n");
return -1;
@@ -523,6 +526,7 @@ static int f2fs_write_check_point_pack(void)
sum->entries[0].ofs_in_node = 0;
cp_seg_blk_offset += blk_size_bytes;
+ DBG(1, "\tWriting segment summary for data, ckp at offset 0x%08"PRIx64"\n", cp_seg_blk_offset);
if (dev_write(sum, cp_seg_blk_offset, F2FS_BLKSIZE)) {
MSG(1, "\tError: While writing the sum_blk to disk!!!\n");
return -1;
@@ -533,6 +537,7 @@ static int f2fs_write_check_point_pack(void)
SET_SUM_TYPE((&sum->footer), SUM_TYPE_DATA);
cp_seg_blk_offset += blk_size_bytes;
+ DBG(1, "\tWriting segment summary, ckp at offset 0x%08"PRIx64"\n", cp_seg_blk_offset);
if (dev_write(sum, cp_seg_blk_offset, F2FS_BLKSIZE)) {
MSG(1, "\tError: While writing the sum_blk to disk!!!\n");
return -1;
@@ -562,6 +567,7 @@ static int f2fs_write_check_point_pack(void)
sum->sit_j.entries[5].se.vblocks = cpu_to_le16((CURSEG_COLD_DATA << 10));
cp_seg_blk_offset += blk_size_bytes;
+ DBG(1, "\tWriting data sit for root, at offset 0x%08"PRIx64"\n", cp_seg_blk_offset);
if (dev_write(sum, cp_seg_blk_offset, F2FS_BLKSIZE)) {
MSG(1, "\tError: While writing the sum_blk to disk!!!\n");
return -1;
@@ -575,6 +581,7 @@ static int f2fs_write_check_point_pack(void)
sum->entries[0].ofs_in_node = 0;
cp_seg_blk_offset += blk_size_bytes;
+ DBG(1, "\tWriting Segment summary for node blocks, at offset 0x%08"PRIx64"\n", cp_seg_blk_offset);
if (dev_write(sum, cp_seg_blk_offset, F2FS_BLKSIZE)) {
MSG(1, "\tError: While writing the sum_blk to disk!!!\n");
return -1;
@@ -585,6 +592,7 @@ static int f2fs_write_check_point_pack(void)
SET_SUM_TYPE((&sum->footer), SUM_TYPE_NODE);
cp_seg_blk_offset += blk_size_bytes;
+ DBG(1, "\tWriting Segment summary for data block (1/2), at offset 0x%08"PRIx64"\n", cp_seg_blk_offset);
if (dev_write(sum, cp_seg_blk_offset, F2FS_BLKSIZE)) {
MSG(1, "\tError: While writing the sum_blk to disk!!!\n");
return -1;
@@ -594,6 +602,7 @@ static int f2fs_write_check_point_pack(void)
memset(sum, 0, sizeof(struct f2fs_summary_block));
SET_SUM_TYPE((&sum->footer), SUM_TYPE_NODE);
cp_seg_blk_offset += blk_size_bytes;
+ DBG(1, "\tWriting Segment summary for data block (2/2), at offset 0x%08"PRIx64"\n", cp_seg_blk_offset);
if (dev_write(sum, cp_seg_blk_offset, F2FS_BLKSIZE)) {
MSG(1, "\tError: While writing the sum_blk to disk!!!\n");
return -1;
@@ -601,6 +610,7 @@ static int f2fs_write_check_point_pack(void)
/* 8. cp page2 */
cp_seg_blk_offset += blk_size_bytes;
+ DBG(1, "\tWriting cp page2, at offset 0x%08"PRIx64"\n", cp_seg_blk_offset);
if (dev_write(ckp, cp_seg_blk_offset, F2FS_BLKSIZE)) {
MSG(1, "\tError: While writing the ckp to disk!!!\n");
return -1;
@@ -617,6 +627,7 @@ static int f2fs_write_check_point_pack(void)
cp_seg_blk_offset = (le32_to_cpu(super_block.segment0_blkaddr) +
config.blks_per_seg) *
blk_size_bytes;
+ DBG(1, "\tWriting cp page 1 of checkpoint pack 2, at offset 0x%08"PRIx64"\n", cp_seg_blk_offset);
if (dev_write(ckp, cp_seg_blk_offset, F2FS_BLKSIZE)) {
MSG(1, "\tError: While writing the ckp to disk!!!\n");
return -1;
@@ -624,6 +635,7 @@ static int f2fs_write_check_point_pack(void)
/* 10. cp page 2 of check point pack 2 */
cp_seg_blk_offset += blk_size_bytes * (le32_to_cpu(ckp->cp_pack_total_block_count) - 1);
+ DBG(1, "\tWriting cp page 2 of checkpoint pack 2, at offset 0x%08"PRIx64"\n", cp_seg_blk_offset);
if (dev_write(ckp, cp_seg_blk_offset, F2FS_BLKSIZE)) {
MSG(1, "\tError: While writing the ckp to disk!!!\n");
return -1;
@@ -643,6 +655,7 @@ static int f2fs_write_super_block(void)
memcpy(zero_buff + F2FS_SUPER_OFFSET, &super_block,
sizeof(super_block));
+ DBG(1, "\tWriting super block, at offset 0x%08x\n", 0);
for (index = 0; index < 2; index++) {
if (dev_write(zero_buff, index * F2FS_BLKSIZE, F2FS_BLKSIZE)) {
MSG(1, "\tError: While while writing supe_blk \
@@ -709,6 +722,7 @@ static int f2fs_write_root_inode(void)
config.blks_per_seg;
main_area_node_seg_blk_offset *= blk_size_bytes;
+ DBG(1, "\tWriting root inode (hot node), at offset 0x%08"PRIx64"\n", main_area_node_seg_blk_offset);
if (dev_write(raw_node, main_area_node_seg_blk_offset, F2FS_BLKSIZE)) {
MSG(1, "\tError: While writing the raw_node to disk!!!\n");
return -1;
@@ -722,6 +736,7 @@ static int f2fs_write_root_inode(void)
config.blks_per_seg;
main_area_node_seg_blk_offset *= blk_size_bytes;
+ DBG(1, "\tWriting root inode (warm node), at offset 0x%08"PRIx64"\n", main_area_node_seg_blk_offset);
if (dev_write(raw_node, main_area_node_seg_blk_offset, F2FS_BLKSIZE)) {
MSG(1, "\tError: While writing the raw_node to disk!!!\n");
return -1;
@@ -759,6 +774,7 @@ static int f2fs_update_nat_root(void)
nat_seg_blk_offset = le32_to_cpu(super_block.nat_blkaddr);
nat_seg_blk_offset *= blk_size_bytes;
+ DBG(1, "\tWriting nat root, at offset 0x%08"PRIx64"\n", nat_seg_blk_offset);
if (dev_write(nat_blk, nat_seg_blk_offset, F2FS_BLKSIZE)) {
MSG(1, "\tError: While writing the nat_blk set0 to disk!\n");
return -1;
@@ -799,6 +815,7 @@ static int f2fs_add_default_dentry_root(void)
config.blks_per_seg;
data_blk_offset *= blk_size_bytes;
+ DBG(1, "\tWriting default dentry root, at offset 0x%08"PRIx64"\n", data_blk_offset);
if (dev_write(dent_blk, data_blk_offset, F2FS_BLKSIZE)) {
MSG(1, "\tError: While writing the dentry_blk to disk!!!\n");
return -1;