debugfs and e2fsck format dirdata output the same way, but each currently has its own implementation. Move the shared code to libext2fs and replace the duplicate implementations with a common function call. Signed-off-by: Artem Blagodarenko Reviewed-by: Andreas Dilger --- debugfs/ls.c | 51 +-------------------------------------- e2fsck/message.c | 55 ++----------------------------------------- lib/ext2fs/dirblock.c | 50 +++++++++++++++++++++++++++++++++++++++ lib/ext2fs/ext2fs.h | 1 + 4 files changed, 54 insertions(+), 103 deletions(-) diff --git a/debugfs/ls.c b/debugfs/ls.c index d225982cb..1ba72eb6c 100644 --- a/debugfs/ls.c +++ b/debugfs/ls.c @@ -46,55 +46,6 @@ struct list_dir_struct { static const char *monstr[] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"}; -static void list_dirdata(struct list_dir_struct *ls, - struct ext2_dir_entry *dirent) -{ - unsigned char *data; - int dlen; - __u8 dirdata_mask; - __u8 file_type = dirent->name_len >> 8; - - data = (unsigned char *)dirent->name + - (dirent->name_len & EXT2_NAME_LEN) + 1; - - for (dirdata_mask = EXT2_FT_MASK + 1; - dirdata_mask != 0; dirdata_mask <<= 1) { - if ((dirdata_mask & file_type) == 0) - continue; - - dlen = data[0]; - - if (dirdata_mask == EXT2_DIRENT_LUFID) { - struct lu_fid fid; - int offset = 0; - fprintf(ls->f, " fid="); - while (offset < (dlen - 1)) { - memcpy(&fid, data + offset + 1, sizeof(fid)); - fid_be_to_cpu(&fid, &fid); - offset += sizeof(fid); - fprintf(ls->f, DFID, PFID(&fid)); - if (offset < (dlen - 1)) - fprintf(ls->f, ","); - } - } else if (dirdata_mask == EXT2_DIRENT_CFHASH) { - struct ext4_dirent_hash hash; - - memcpy(&hash, data, sizeof(hash)); - hash_le_to_cpu(&hash, &hash); - - fprintf(ls->f, "hash: 0x%08x, minor_hash: 0x%08x", - hash.dh_hash.hash, hash.dh_hash.minor_hash); - } else { - int i; - - for (i = 1; i < dlen; i++) - fprintf(ls->f, "%02x", data[i]); - } - - data += dlen; - } -} - static int print_filename(FILE *f, struct ext2_dir_entry *dirent, int options) { unsigned char ch; @@ -199,7 +150,7 @@ static int list_dir_proc(ext2_ino_t dir EXT2FS_ATTR((unused)), (unsigned long long) EXT2_I_SIZE(&inode)); fprintf(ls->f, " %s", datestr); if ((ls->options & DIRDATA_OPT) != 0) - list_dirdata(ls, dirent); + list_dirdata(ls->f, dirent); fprintf(ls->f, " "); print_filename(ls->f, dirent, options); fputc('\n', ls->f); diff --git a/e2fsck/message.c b/e2fsck/message.c index 193d887ec..60859f95f 100644 --- a/e2fsck/message.c +++ b/e2fsck/message.c @@ -347,41 +347,6 @@ static _INLINE_ void expand_inode_expression(FILE *f, ext2_filsys fs, char ch, } } -int get_dirent_fid(struct ext2_dir_entry *dirent, struct lu_fid **fids) -{ - unsigned char *data = (unsigned char *)dirent->name + - (dirent->name_len & EXT2_NAME_LEN) + 1; - __u8 file_type = dirent->name_len >> 8; - __u8 dirdata_mask; - int retlen = 0; - - for (dirdata_mask = EXT2_FT_MASK + 1; - dirdata_mask != 0; dirdata_mask <<= 1) { - int dlen; - - if ((dirdata_mask & file_type) == 0) - continue; - - dlen = data[0]; - if (dirdata_mask == EXT2_DIRENT_LUFID) { - struct lu_fid *fid; - int len = dlen; - - *fids = (struct lu_fid *)(data + 1); - for (fid = *fids; len >= sizeof(*fid); fid++, - len -= sizeof(*fid)) { - memcpy(fid, data + 1, sizeof(*fid)); - fid_be_to_cpu(fid, fid); - } - retlen = dlen; - break; - } - data += dlen; - } - - return retlen; -} - /* * This function expands '%dX' expressions */ @@ -397,26 +362,10 @@ static _INLINE_ void expand_dirent_expression(FILE *f, ext2_filsys fs, char ch, dirent = ctx->dirent; switch (ch) { - case 'i': { - struct lu_fid *fids; - int i; - int fids_len; - + case 'i': fprintf(f, "%u", dirent->inode); - - fids_len = get_dirent_fid(dirent, &fids); - if (fids_len > sizeof(*fids)) - fprintf(f, " fid="); - while (fids_len > sizeof(*fids)) { - fprintf(f, DFID, PFID(fids)); - fids++; - fids_len -= sizeof(*fids); - if (fids_len >= sizeof(*fids)) - fprintf(f, ","); - } - + list_dirdata(NULL, dirent); break; - } case 'n': len = ext2fs_dirent_name_len(dirent); if ((ext2fs_get_rec_len(fs, dirent, &rec_len) == 0) && diff --git a/lib/ext2fs/dirblock.c b/lib/ext2fs/dirblock.c index fa7cc83ff..b22800406 100644 --- a/lib/ext2fs/dirblock.c +++ b/lib/ext2fs/dirblock.c @@ -19,6 +19,7 @@ #include "ext2_fs.h" #include "ext2fs.h" +#include "lfsck.h" errcode_t ext2fs_read_dir_block4(ext2_filsys fs, blk64_t block, void *buf, int flags EXT2FS_ATTR((unused)), @@ -145,3 +146,52 @@ errcode_t ext2fs_write_dir_block(ext2_filsys fs, blk_t block, return ext2fs_write_dir_block3(fs, block, inbuf, 0); } +void list_dirdata(FILE *f, struct ext2_dir_entry *dirent) +{ + unsigned char *data; + int dlen; + __u8 dirdata_mask; + __u8 file_type = dirent->name_len >> 8; + FILE *out = f ? f : stdout; + int offset = 0; + + data = (unsigned char *)dirent->name + + (dirent->name_len & EXT2_NAME_LEN) + 1; + + for (dirdata_mask = EXT2_FT_MASK + 1; + dirdata_mask != 0; dirdata_mask <<= 1) { + if ((dirdata_mask & file_type) == 0) + continue; + dlen = data[offset]; + + if (dirdata_mask == EXT2_DIRENT_LUFID) { + struct lu_fid fid; + fprintf(out, " fid="); + while (offset < (dlen - 1)) { + memcpy(&fid, data + offset + 1, sizeof(fid)); + fid_be_to_cpu(&fid, &fid); + offset += sizeof(fid); + fprintf(out, DFID, PFID(&fid)); + if (offset < (dlen - 1)) + fprintf(out, ","); + } + } else if (dirdata_mask == EXT2_DIRENT_CFHASH) { + struct ext4_dirent_hash hash; + + memcpy(&hash, data + offset + 1, sizeof(hash)); + hash_le_to_cpu(&hash, &hash); + + fprintf(out, " hash=0x%08x, minor_hash=0x%08x", + hash.dh_hash.hash, hash.dh_hash.minor_hash); + offset += sizeof(hash); + } else { + int i; + + for (i = 1; i < dlen; i++) + fprintf(out, "%02x", data[i]); + } + + data += dlen; + } +} + diff --git a/lib/ext2fs/ext2fs.h b/lib/ext2fs/ext2fs.h index b14ba0a34..b9e02dab2 100644 --- a/lib/ext2fs/ext2fs.h +++ b/lib/ext2fs/ext2fs.h @@ -1318,6 +1318,7 @@ extern errcode_t ext2fs_write_dir_block3(ext2_filsys fs, blk64_t block, void *buf, int flags); extern errcode_t ext2fs_write_dir_block4(ext2_filsys fs, blk64_t block, void *buf, int flags, ext2_ino_t ino); +void list_dirdata(FILE *f, struct ext2_dir_entry *dirent); /* dirhash.c */ extern errcode_t ext2fs_dirhash(int version, const char *name, int len, -- 2.43.7