mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/jaegeuk/f2fs-tools.git
synced 2024-11-23 09:43:34 +08:00
f2fs-tools: Refactor f2fs_dentry_block struct
This moves access to f2fs_dentry_block's dentry list and filename list behind a macro, as their locations depend on block size. Since struct f2fs_dentry_block no longer represents the full block, use F2FS_BLKSIZE instead of sizeof(struct f2fs_dentry_block) Signed-off-by: Daniel Rosenberg <drosen@google.com> Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
This commit is contained in:
parent
ef47782c0a
commit
c404632d82
24
fsck/dir.c
24
fsck/dir.c
@ -43,8 +43,8 @@ void make_dentry_ptr(struct f2fs_dentry_ptr *d, struct f2fs_node *node_blk,
|
||||
d->max = NR_DENTRY_IN_BLOCK;
|
||||
d->nr_bitmap = SIZE_OF_DENTRY_BITMAP;
|
||||
d->bitmap = t->dentry_bitmap;
|
||||
d->dentry = t->dentry;
|
||||
d->filename = t->filename;
|
||||
d->dentry = F2FS_DENTRY_BLOCK_DENTRIES(t);
|
||||
d->filename = F2FS_DENTRY_BLOCK_FILENAMES(t);
|
||||
} else {
|
||||
int entry_cnt = NR_INLINE_DENTRY(node_blk);
|
||||
int bitmap_size = INLINE_DENTRY_BITMAP_SIZE(node_blk);
|
||||
@ -352,17 +352,17 @@ static void make_empty_dir(struct f2fs_sb_info *sbi, struct f2fs_node *inode)
|
||||
dent_blk = calloc(BLOCK_SZ, 1);
|
||||
ASSERT(dent_blk);
|
||||
|
||||
dent_blk->dentry[0].hash_code = 0;
|
||||
dent_blk->dentry[0].ino = cpu_to_le32(ino);
|
||||
dent_blk->dentry[0].name_len = cpu_to_le16(1);
|
||||
dent_blk->dentry[0].file_type = F2FS_FT_DIR;
|
||||
memcpy(dent_blk->filename[0], ".", 1);
|
||||
F2FS_DENTRY_BLOCK_DENTRY(dent_blk, 0).hash_code = 0;
|
||||
F2FS_DENTRY_BLOCK_DENTRY(dent_blk, 0).ino = cpu_to_le32(ino);
|
||||
F2FS_DENTRY_BLOCK_DENTRY(dent_blk, 0).name_len = cpu_to_le16(1);
|
||||
F2FS_DENTRY_BLOCK_DENTRY(dent_blk, 0).file_type = F2FS_FT_DIR;
|
||||
memcpy(F2FS_DENTRY_BLOCK_FILENAME(dent_blk, 0), ".", 1);
|
||||
|
||||
dent_blk->dentry[1].hash_code = 0;
|
||||
dent_blk->dentry[1].ino = cpu_to_le32(pino);
|
||||
dent_blk->dentry[1].name_len = cpu_to_le16(2);
|
||||
dent_blk->dentry[1].file_type = F2FS_FT_DIR;
|
||||
memcpy(dent_blk->filename[1], "..", 2);
|
||||
F2FS_DENTRY_BLOCK_DENTRY(dent_blk, 1).hash_code = 0;
|
||||
F2FS_DENTRY_BLOCK_DENTRY(dent_blk, 1).ino = cpu_to_le32(pino);
|
||||
F2FS_DENTRY_BLOCK_DENTRY(dent_blk, 1).name_len = cpu_to_le16(2);
|
||||
F2FS_DENTRY_BLOCK_DENTRY(dent_blk, 1).file_type = F2FS_FT_DIR;
|
||||
memcpy(F2FS_DENTRY_BLOCK_FILENAME(dent_blk, 1), "..", 2);
|
||||
|
||||
test_and_set_bit_le(0, dent_blk->dentry_bitmap);
|
||||
test_and_set_bit_le(1, dent_blk->dentry_bitmap);
|
||||
|
@ -1963,7 +1963,7 @@ int fsck_chk_dentry_blk(struct f2fs_sb_info *sbi, int casefolded, u32 blk_addr,
|
||||
|
||||
dentries = __chk_dentries(sbi, casefolded, child,
|
||||
de_blk->dentry_bitmap,
|
||||
de_blk->dentry, de_blk->filename,
|
||||
F2FS_DENTRY_BLOCK_DENTRIES(de_blk), F2FS_DENTRY_BLOCK_FILENAMES(de_blk),
|
||||
NR_DENTRY_IN_BLOCK, last_blk, enc_name);
|
||||
|
||||
if (dentries < 0 && f2fs_dev_is_writable()) {
|
||||
|
@ -1372,16 +1372,29 @@ struct f2fs_dir_entry {
|
||||
|
||||
static_assert(sizeof(struct f2fs_dir_entry) == 11, "");
|
||||
|
||||
/* 4KB-sized directory entry block */
|
||||
/*
|
||||
* Block-sized directory entry block
|
||||
* On disk structure:
|
||||
* struct f2fs_dentry_block;
|
||||
* __u8 reserved[SIZE_OF_RESERVED];
|
||||
* struct f2fs_dir_entry dentry[NR_DENTRY_IN_BLOCK];
|
||||
* __u8 filename[NR_DENTRY_IN_BLOCK][F2FS_SLOT_LEN];
|
||||
*
|
||||
* Do NOT use sizeof. Use F2FS_BLKSIZE instead
|
||||
*/
|
||||
struct f2fs_dentry_block {
|
||||
/* validity bitmap for directory entries in each block */
|
||||
__u8 dentry_bitmap[SIZE_OF_DENTRY_BITMAP];
|
||||
__u8 reserved[SIZE_OF_RESERVED];
|
||||
struct f2fs_dir_entry dentry[NR_DENTRY_IN_BLOCK];
|
||||
__u8 filename[NR_DENTRY_IN_BLOCK][F2FS_SLOT_LEN];
|
||||
__u8 dentry_bitmap[0]; /* size is SIZE_OF_DENTRY_BITMAP, based on block size */
|
||||
};
|
||||
|
||||
static_assert(sizeof(struct f2fs_dentry_block) == F2FS_BLKSIZE, "");
|
||||
#define F2FS_DENTRY_BLOCK_DENTRIES(blk) ((struct f2fs_dir_entry *)\
|
||||
&((blk)->dentry_bitmap[SIZE_OF_DENTRY_BITMAP + SIZE_OF_RESERVED]))
|
||||
#define F2FS_DENTRY_BLOCK_DENTRY(blk, i) (F2FS_DENTRY_BLOCK_DENTRIES((blk))[(i)])
|
||||
|
||||
#define F2FS_DENTRY_BLOCK_FILENAMES(blk) ((__u8(*)[F2FS_SLOT_LEN])&F2FS_DENTRY_BLOCK_DENTRY(blk,\
|
||||
NR_DENTRY_IN_BLOCK))
|
||||
#define F2FS_DENTRY_BLOCK_FILENAME(blk, i) (&((__u8 *)&F2FS_DENTRY_BLOCK_DENTRY(blk,\
|
||||
NR_DENTRY_IN_BLOCK))[(i) * F2FS_SLOT_LEN])
|
||||
|
||||
/* for inline stuff */
|
||||
#define DEF_INLINE_RESERVED_SIZE 1
|
||||
@ -2050,6 +2063,11 @@ static inline void check_block_struct_sizes(void)
|
||||
assert(sizeof(struct f2fs_summary) * ENTRIES_IN_SUM + sizeof(__le64)
|
||||
+ offsetof(struct f2fs_journal, info)
|
||||
+ EXTRA_INFO_RESERVED + sizeof(struct summary_footer) == F2FS_BLKSIZE);
|
||||
|
||||
/* Check Dentry Block Size */
|
||||
assert(sizeof(__u8) * (SIZE_OF_DENTRY_BITMAP + SIZE_OF_RESERVED)
|
||||
+ NR_DENTRY_IN_BLOCK * sizeof(struct f2fs_dir_entry)
|
||||
+ NR_DENTRY_IN_BLOCK * F2FS_SLOT_LEN * sizeof(u8) == F2FS_BLKSIZE);
|
||||
}
|
||||
|
||||
#endif /*__F2FS_FS_H */
|
||||
|
@ -1217,17 +1217,17 @@ static block_t f2fs_add_default_dentry_root(void)
|
||||
return 0;
|
||||
}
|
||||
|
||||
dent_blk->dentry[0].hash_code = 0;
|
||||
dent_blk->dentry[0].ino = sb->root_ino;
|
||||
dent_blk->dentry[0].name_len = cpu_to_le16(1);
|
||||
dent_blk->dentry[0].file_type = F2FS_FT_DIR;
|
||||
memcpy(dent_blk->filename[0], ".", 1);
|
||||
F2FS_DENTRY_BLOCK_DENTRY(dent_blk, 0).hash_code = 0;
|
||||
F2FS_DENTRY_BLOCK_DENTRY(dent_blk, 0).ino = sb->root_ino;
|
||||
F2FS_DENTRY_BLOCK_DENTRY(dent_blk, 0).name_len = cpu_to_le16(1);
|
||||
F2FS_DENTRY_BLOCK_DENTRY(dent_blk, 0).file_type = F2FS_FT_DIR;
|
||||
memcpy(F2FS_DENTRY_BLOCK_FILENAME(dent_blk, 0), ".", 1);
|
||||
|
||||
dent_blk->dentry[1].hash_code = 0;
|
||||
dent_blk->dentry[1].ino = sb->root_ino;
|
||||
dent_blk->dentry[1].name_len = cpu_to_le16(2);
|
||||
dent_blk->dentry[1].file_type = F2FS_FT_DIR;
|
||||
memcpy(dent_blk->filename[1], "..", 2);
|
||||
F2FS_DENTRY_BLOCK_DENTRY(dent_blk, 1).hash_code = 0;
|
||||
F2FS_DENTRY_BLOCK_DENTRY(dent_blk, 1).ino = sb->root_ino;
|
||||
F2FS_DENTRY_BLOCK_DENTRY(dent_blk, 1).name_len = cpu_to_le16(2);
|
||||
F2FS_DENTRY_BLOCK_DENTRY(dent_blk, 1).file_type = F2FS_FT_DIR;
|
||||
memcpy(F2FS_DENTRY_BLOCK_FILENAME(dent_blk, 1), "..", 2);
|
||||
|
||||
/* bitmap for . and .. */
|
||||
test_and_set_bit_le(0, dent_blk->dentry_bitmap);
|
||||
@ -1237,13 +1237,13 @@ static block_t f2fs_add_default_dentry_root(void)
|
||||
int len = strlen(LPF);
|
||||
f2fs_hash_t hash = f2fs_dentry_hash(0, 0, (unsigned char *)LPF, len);
|
||||
|
||||
dent_blk->dentry[2].hash_code = cpu_to_le32(hash);
|
||||
dent_blk->dentry[2].ino = cpu_to_le32(c.lpf_ino);
|
||||
dent_blk->dentry[2].name_len = cpu_to_le16(len);
|
||||
dent_blk->dentry[2].file_type = F2FS_FT_DIR;
|
||||
memcpy(dent_blk->filename[2], LPF, F2FS_SLOT_LEN);
|
||||
F2FS_DENTRY_BLOCK_DENTRY(dent_blk, 2).hash_code = cpu_to_le32(hash);
|
||||
F2FS_DENTRY_BLOCK_DENTRY(dent_blk, 2).ino = cpu_to_le32(c.lpf_ino);
|
||||
F2FS_DENTRY_BLOCK_DENTRY(dent_blk, 2).name_len = cpu_to_le16(len);
|
||||
F2FS_DENTRY_BLOCK_DENTRY(dent_blk, 2).file_type = F2FS_FT_DIR;
|
||||
memcpy(F2FS_DENTRY_BLOCK_FILENAME(dent_blk, 2), LPF, F2FS_SLOT_LEN);
|
||||
|
||||
memcpy(dent_blk->filename[3], &LPF[F2FS_SLOT_LEN],
|
||||
memcpy(F2FS_DENTRY_BLOCK_FILENAME(dent_blk, 3), &LPF[F2FS_SLOT_LEN],
|
||||
len - F2FS_SLOT_LEN);
|
||||
|
||||
test_and_set_bit_le(2, dent_blk->dentry_bitmap);
|
||||
@ -1494,17 +1494,17 @@ static block_t f2fs_add_default_dentry_lpf(void)
|
||||
return 0;
|
||||
}
|
||||
|
||||
dent_blk->dentry[0].hash_code = 0;
|
||||
dent_blk->dentry[0].ino = cpu_to_le32(c.lpf_ino);
|
||||
dent_blk->dentry[0].name_len = cpu_to_le16(1);
|
||||
dent_blk->dentry[0].file_type = F2FS_FT_DIR;
|
||||
memcpy(dent_blk->filename[0], ".", 1);
|
||||
F2FS_DENTRY_BLOCK_DENTRY(dent_blk, 0).hash_code = 0;
|
||||
F2FS_DENTRY_BLOCK_DENTRY(dent_blk, 0).ino = cpu_to_le32(c.lpf_ino);
|
||||
F2FS_DENTRY_BLOCK_DENTRY(dent_blk, 0).name_len = cpu_to_le16(1);
|
||||
F2FS_DENTRY_BLOCK_DENTRY(dent_blk, 0).file_type = F2FS_FT_DIR;
|
||||
memcpy(F2FS_DENTRY_BLOCK_FILENAME(dent_blk, 0), ".", 1);
|
||||
|
||||
dent_blk->dentry[1].hash_code = 0;
|
||||
dent_blk->dentry[1].ino = sb->root_ino;
|
||||
dent_blk->dentry[1].name_len = cpu_to_le16(2);
|
||||
dent_blk->dentry[1].file_type = F2FS_FT_DIR;
|
||||
memcpy(dent_blk->filename[1], "..", 2);
|
||||
F2FS_DENTRY_BLOCK_DENTRY(dent_blk, 1).hash_code = 0;
|
||||
F2FS_DENTRY_BLOCK_DENTRY(dent_blk, 1).ino = sb->root_ino;
|
||||
F2FS_DENTRY_BLOCK_DENTRY(dent_blk, 1).name_len = cpu_to_le16(2);
|
||||
F2FS_DENTRY_BLOCK_DENTRY(dent_blk, 1).file_type = F2FS_FT_DIR;
|
||||
memcpy(F2FS_DENTRY_BLOCK_FILENAME(dent_blk, 1), "..", 2);
|
||||
|
||||
test_and_set_bit_le(0, dent_blk->dentry_bitmap);
|
||||
test_and_set_bit_le(1, dent_blk->dentry_bitmap);
|
||||
|
Loading…
Reference in New Issue
Block a user