Enhancement: add uuid

"Usually, it is used 128-bits UUID for serial number. Why do you use
__le32 as volume_serial_number?"
>From Vyacheslav Dubeyko.

I added an uuid facility for the serial number.
And sync with kernel/include/linux/f2fs_fs.h.

Signed-off-by: Jaegeuk Kim <jaegeuk.kim@samsung.com>
This commit is contained in:
Jaegeuk Kim 2012-10-30 07:35:00 +09:00
parent b5af7953f8
commit 99b7439340
5 changed files with 48 additions and 9 deletions

6
README
View File

@ -4,6 +4,12 @@ F2FS format utilility
To use f2fs filesystem, you should format the storage partition
with this utilility. Otherwise, you cannot mount f2fs.
Before compilation
------------------
Your should install the following packages.
- libuuid-devel or uuid-dev
Initial compilation
-------------------

View File

@ -11,6 +11,10 @@ AC_CONFIG_HEADERS([config.h])
AC_PROG_CC
# Checks for libraries.
AC_CHECK_LIB([uuid], [uuid_generate],
[AC_DEFINE([HAVE_LIBUUID], 1,
[Define to 1 if you have the 'uuid' library (-luuid).])],
[AC_MSG_ERROR([UUID library not found])])
# Checks for header files.
AC_CHECK_HEADERS([fcntl.h mntent.h stdlib.h string.h sys/ioctl.h sys/mount.h unistd.h])

View File

@ -1,5 +1,6 @@
## Makefile.am
AM_CFLAGS = -Wall
LDADD = -luuid
bin_PROGRAMS = mkfs.f2fs
mkfs_f2fs_SOURCES = f2fs_format.c f2fs_format.h

View File

@ -24,6 +24,7 @@
#include <linux/hdreg.h>
#include <time.h>
#include <linux/fs.h>
#include <uuid/uuid.h>
#include "f2fs_format.h"
@ -561,7 +562,7 @@ static int f2fs_prepare_super_block(void)
/ f2fs_params.segs_per_sec);
super_block.segment_count_main = cpu_to_le32(
le32_to_cpu(super_block.section_count) *
le32_to_cpu(super_block.section_count) *
f2fs_params.segs_per_sec);
if ((le32_to_cpu(super_block.segment_count_main) - 2) <
@ -574,7 +575,7 @@ static int f2fs_prepare_super_block(void)
}
super_block.failure_safe_block_distance = 0;
super_block.volume_serial_number = 0;
uuid_generate(super_block.uuid);
ASCIIToUNICODE(super_block.volume_name, f2fs_params.vol_label);
@ -582,7 +583,7 @@ static int f2fs_prepare_super_block(void)
super_block.meta_ino = cpu_to_le32(2);
super_block.root_ino = cpu_to_le32(3);
total_zones = ((le32_to_cpu(super_block.segment_count_main) - 1) /
total_zones = ((le32_to_cpu(super_block.segment_count_main) - 1) /
f2fs_params.segs_per_sec) /
f2fs_params.secs_per_zone;
if (total_zones <= 6) {
@ -842,7 +843,7 @@ static int8_t f2fs_write_check_point_pack(void)
SET_SUM_TYPE((&sum->footer), SUM_TYPE_DATA);
sum->entries[0].nid = super_block.root_ino;
sum->entries[0].bidx = 0;
sum->entries[0].ofs_in_node = 0;
cp_seg_blk_offset += blk_size_bytes;
if (writetodisk(f2fs_params.fd, sum, cp_seg_blk_offset,

View File

@ -56,6 +56,11 @@
#define F2FS_CP_BLOCK_SIZE (DEFAULT_SECTOR_SIZE * \
DEFAULT_SECTORS_PER_BLOCK)
/*
* For further optimization on multi-head logs, on-disk layout supports maximum
* 16 logs by default. The number, 16, is expected to cover all the cases
* enoughly.
*/
#define MAX_ACTIVE_LOGS 16
#define MAX_ACTIVE_NODE_LOGS 8
#define MAX_ACTIVE_DATA_LOGS 8
@ -129,7 +134,7 @@ struct f2fs_super_block {
__le32 root_ino; /* Root directory inode number */
__le32 node_ino; /* node inode number */
__le32 meta_ino; /* meta inode number */
__le32 volume_serial_number; /* VSN is optional field */
__u8 uuid[16]; /* 128-bit uuid for volume */
__le16 volume_name[512]; /* Volume Name */
__le32 extension_count;
__u8 extension_list[F2FS_MAX_EXTENSION][8]; /* extension array */
@ -273,6 +278,11 @@ enum {
#define SIT_VBLOCK_MAP_SIZE 64
#define SIT_ENTRY_PER_BLOCK (PAGE_CACHE_SIZE / sizeof(struct f2fs_sit_entry))
/*
* Note that f2fs_sit_entry->vblocks has the following bit-field information.
* [15:10] : allocation type such as CURSEG_XXXX_TYPE
* [9:0] : valid block count
*/
struct f2fs_sit_entry {
__le16 vblocks;
__u8 valid_map[SIT_VBLOCK_MAP_SIZE];
@ -283,13 +293,25 @@ struct f2fs_sit_block {
struct f2fs_sit_entry entries[SIT_ENTRY_PER_BLOCK];
} __attribute__((packed));
/**
* For segment summary
*
* NOTE : For initializing fields, you must use set_summary
*
* - If data page, nid represents dnode's nid
* - If node page, nid represents the node page's nid.
*
* The ofs_in_node is used by only data page. It represents offset
* from node's page's beginning to get a data block address.
* ex) data_blkaddr = (block_t)(nodepage_start_address + ofs_in_node)
*/
struct f2fs_summary {
__le32 nid; /* parent node id */
union {
__u8 reserved[3];
struct {
__u8 version; /* node version number */
__le16 bidx; /* block index in parent node */
__le16 ofs_in_node; /* block index in parent node */
} __attribute__((packed));
};
} __attribute__((packed));
@ -360,9 +382,14 @@ struct f2fs_summary_block {
/*
* For directory operations
*/
#define F2FS_NAME_LEN 8 /* 256 Unicode */
#define NR_DENTRY_IN_BLOCK 214 /* the number of dentry in a block */
#define MAX_DIR_HASH_DEPTH 63 /* MAX level for dir lookup */
/* One directory entry slot covers 8bytes-long file name */
#define F2FS_NAME_LEN 8
/* the number of dentry in a block */
#define NR_DENTRY_IN_BLOCK 214
/* MAX level for dir lookup */
#define MAX_DIR_HASH_DEPTH 63
#define SIZE_OF_DIR_ENTRY 11 /* by byte */
#define SIZE_OF_DENTRY_BITMAP ((NR_DENTRY_IN_BLOCK + BITS_PER_BYTE - 1) / \