diff --git a/debugfs/debugfs.c b/debugfs/debugfs.c index 4fffc82c..5ab43a3e 100644 --- a/debugfs/debugfs.c +++ b/debugfs/debugfs.c @@ -668,7 +668,46 @@ static void dump_inline_data(FILE *out, const char *prefix, ext2_ino_t inode_num retval = ext2fs_inline_data_size(current_fs, inode_num, &size); if (!retval) - fprintf(out, "%sSize of inline data: %zu", prefix, size); + fprintf(out, "%sSize of inline data: %zu\n", prefix, size); +} + +static void dump_fast_link(FILE *out, ext2_ino_t inode_num, + struct ext2_inode *inode, const char *prefix) +{ + errcode_t retval = 0; + char *buf; + size_t size; + + if (inode->i_flags & EXT4_INLINE_DATA_FL) { + retval = ext2fs_inline_data_size(current_fs, inode_num, &size); + if (retval) + goto out; + + retval = ext2fs_get_memzero(size + 1, &buf); + if (retval) + goto out; + + retval = ext2fs_inline_data_get(current_fs, inode_num, + inode, buf, &size); + if (retval) + goto out; + fprintf(out, "%sFast link dest: \"%.*s\"\n", prefix, + (int)size, buf); + + retval = ext2fs_free_mem(&buf); + if (retval) + goto out; + } else { + int sz = EXT2_I_SIZE(inode); + + if (sz > sizeof(inode->i_block)) + sz = sizeof(inode->i_block); + fprintf(out, "%sFast link dest: \"%.*s\"\n", prefix, sz, + (char *)inode->i_block); + } +out: + if (retval) + com_err(__func__, retval, "while dumping link destination"); } void internal_dump_inode(FILE *out, const char *prefix, @@ -783,10 +822,8 @@ void internal_dump_inode(FILE *out, const char *prefix, } if (LINUX_S_ISLNK(inode->i_mode) && - ext2fs_inode_data_blocks(current_fs,inode) == 0 && - !(inode->i_flags & EXT4_INLINE_DATA_FL)) - fprintf(out, "%sFast_link_dest: %.*s\n", prefix, - (int) inode->i_size, (char *)inode->i_block); + ext2fs_inode_data_blocks(current_fs, inode) == 0) + dump_fast_link(out, inode_num, inode, prefix); else if (LINUX_S_ISBLK(inode->i_mode) || LINUX_S_ISCHR(inode->i_mode)) { int major, minor; const char *devnote; diff --git a/debugfs/xattrs.c b/debugfs/xattrs.c index f2d71289..1c19b2f2 100644 --- a/debugfs/xattrs.c +++ b/debugfs/xattrs.c @@ -45,9 +45,12 @@ static int dump_attr(char *name, char *value, size_t value_len, void *data) fprintf(out, " "); dump_xattr_string(out, name, strlen(name)); - fprintf(out, " = \""); - dump_xattr_string(out, value, value_len); - fprintf(out, "\" (%zu)\n", value_len); + if (strcmp(name, "system.data") != 0) { + fprintf(out, " = \""); + dump_xattr_string(out, value, value_len); + fprintf(out, "\""); + } + fprintf(out, " (%zu)\n", value_len); return 0; } diff --git a/tests/d_inline_dump/expect b/tests/d_inline_dump/expect new file mode 100644 index 00000000..ead47f98 --- /dev/null +++ b/tests/d_inline_dump/expect @@ -0,0 +1,101 @@ +*** long file +debugfs 1.43-WIP (09-Jul-2014) +Inode: 13 Type: regular Mode: 0644 Flags: 0x10000000 +Generation: 3289262644 Version: 0x00000000:00000001 +User: 0 Group: 0 Size: 80 +File ACL: 0 Directory ACL: 0 +Links: 1 Blockcount: 0 +Fragment: Address: 0 Number: 0 Size: 0 + ctime: 0x53cec6b4:c72e3c00 -- Tue Jul 22 20:16:52 2014 + atime: 0x53cec3c8:4a3fd000 -- Tue Jul 22 20:04:24 2014 + mtime: 0x53cec3c8:4c281800 -- Tue Jul 22 20:04:24 2014 +crtime: 0x53cec3c8:4a3fd000 -- Tue Jul 22 20:04:24 2014 +Size of extra inode fields: 28 +Extended attributes: + system.data (20) + user.a = "b" (1) +Size of inline data: 80 +*** short file +debugfs 1.43-WIP (09-Jul-2014) +Inode: 18 Type: regular Mode: 0644 Flags: 0x10000000 +Generation: 3842229473 Version: 0x00000000:00000001 +User: 0 Group: 0 Size: 20 +File ACL: 0 Directory ACL: 0 +Links: 1 Blockcount: 0 +Fragment: Address: 0 Number: 0 Size: 0 + ctime: 0x53cec6b4:cafecc00 -- Tue Jul 22 20:16:52 2014 + atime: 0x53cec443:bda4d400 -- Tue Jul 22 20:06:27 2014 + mtime: 0x53cec443:bf8d1c00 -- Tue Jul 22 20:06:27 2014 +crtime: 0x53cec443:bda4d400 -- Tue Jul 22 20:06:27 2014 +Size of extra inode fields: 28 +Extended attributes: + system.data (0) + user.a = "b" (1) +Size of inline data: 60 + +*** long dir +debugfs 1.43-WIP (09-Jul-2014) +Inode: 16 Type: directory Mode: 0755 Flags: 0x10000000 +Generation: 3842229469 Version: 0x00000000:00000004 +User: 0 Group: 0 Size: 132 +File ACL: 7 Directory ACL: 0 +Links: 2 Blockcount: 8 +Fragment: Address: 0 Number: 0 Size: 0 + ctime: 0x53cec6e3:27eac000 -- Tue Jul 22 20:17:39 2014 + atime: 0x53cec410:ed53dc00 -- Tue Jul 22 20:05:36 2014 + mtime: 0x53cec42b:241a3000 -- Tue Jul 22 20:06:03 2014 +crtime: 0x53cec3fe:c8226000 -- Tue Jul 22 20:05:18 2014 +Size of extra inode fields: 28 +Extended attributes: + system.data (72) + user.a = "b" (1) +Size of inline data: 132 +*** short dir +debugfs 1.43-WIP (09-Jul-2014) +Inode: 20 Type: directory Mode: 0755 Flags: 0x10000000 +Generation: 3710818931 Version: 0x00000000:00000001 +User: 0 Group: 0 Size: 60 +File ACL: 0 Directory ACL: 0 +Links: 2 Blockcount: 0 +Fragment: Address: 0 Number: 0 Size: 0 + ctime: 0x53cec6b4:ca0aa800 -- Tue Jul 22 20:16:52 2014 + atime: 0x53cec477:9a5ba000 -- Tue Jul 22 20:07:19 2014 + mtime: 0x53cec477:9a5ba000 -- Tue Jul 22 20:07:19 2014 +crtime: 0x53cec477:9a5ba000 -- Tue Jul 22 20:07:19 2014 +Size of extra inode fields: 28 +Extended attributes: + system.data (0) + user.a = "b" (1) +Size of inline data: 60 + +*** long link +debugfs 1.43-WIP (09-Jul-2014) +Inode: 12 Type: symlink Mode: 0777 Flags: 0x10000000 +Generation: 3289262643 Version: 0x00000000:00000001 +User: 0 Group: 0 Size: 80 +File ACL: 0 Directory ACL: 0 +Links: 1 Blockcount: 0 +Fragment: Address: 0 Number: 0 Size: 0 + ctime: 0x53cec47f:724db800 -- Tue Jul 22 20:07:27 2014 + atime: 0x53cec665:27eac000 -- Tue Jul 22 20:15:33 2014 + mtime: 0x53cec3b6:82841c00 -- Tue Jul 22 20:04:06 2014 +crtime: 0x53cec3b6:82841c00 -- Tue Jul 22 20:04:06 2014 +Size of extra inode fields: 28 +Extended attributes: + system.data (20) +Fast link dest: "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" +*** short link +debugfs 1.43-WIP (09-Jul-2014) +Inode: 19 Type: symlink Mode: 0777 Flags: 0x0 +Generation: 3842229474 Version: 0x00000000:00000001 +User: 0 Group: 0 Size: 20 +File ACL: 0 Directory ACL: 0 +Links: 1 Blockcount: 0 +Fragment: Address: 0 Number: 0 Size: 0 + ctime: 0x53cec44c:a1fcc000 -- Tue Jul 22 20:06:36 2014 + atime: 0x53cec44d:11fb8400 -- Tue Jul 22 20:06:37 2014 + mtime: 0x53cec44c:a1fcc000 -- Tue Jul 22 20:06:36 2014 +crtime: 0x53cec44c:a1fcc000 -- Tue Jul 22 20:06:36 2014 +Size of extra inode fields: 28 +Fast link dest: "xxxxxxxxxxxxxxxxxxxx" +*** end test diff --git a/tests/d_inline_dump/image.gz b/tests/d_inline_dump/image.gz new file mode 100644 index 00000000..598a495a Binary files /dev/null and b/tests/d_inline_dump/image.gz differ diff --git a/tests/d_inline_dump/name b/tests/d_inline_dump/name new file mode 100644 index 00000000..dfc1a9ca --- /dev/null +++ b/tests/d_inline_dump/name @@ -0,0 +1 @@ +debugfs dump inline data test diff --git a/tests/d_inline_dump/script b/tests/d_inline_dump/script new file mode 100644 index 00000000..8d97729c --- /dev/null +++ b/tests/d_inline_dump/script @@ -0,0 +1,43 @@ +if ! test -x $DEBUGFS_EXE; then + echo "$test_name: $test_description: skipped" + exit 0 +fi + +OUT=$test_name.log +EXP=$test_dir/expect +VERIFY_FSCK_OPT=-yf + +ZIMAGE=$test_dir/image.gz +gzip -d < $ZIMAGE > $TMPFILE + +echo "*** long file" > $OUT +$DEBUGFS -R 'stat /file' $TMPFILE >> $OUT 2>&1 +echo "*** short file" >> $OUT +$DEBUGFS -R 'stat /shortfile' $TMPFILE >> $OUT 2>&1 +echo >> $OUT + +echo "*** long dir" >> $OUT +$DEBUGFS -R 'stat /dir' $TMPFILE >> $OUT 2>&1 +echo "*** short dir" >> $OUT +$DEBUGFS -R 'stat /shortdir' $TMPFILE >> $OUT 2>&1 +echo >> $OUT + +echo "*** long link" >> $OUT +$DEBUGFS -R 'stat /link' $TMPFILE >> $OUT 2>&1 +echo "*** short link" >> $OUT +$DEBUGFS -R 'stat /shortlink' $TMPFILE >> $OUT 2>&1 + +echo "*** end test" >> $OUT + +cmp -s $OUT $EXP +status=$? + +if [ "$status" = 0 ] ; then + echo "$test_name: $test_description: ok" + touch $test_name.ok +else + echo "$test_name: $test_description: failed" + diff $DIFF_OPTS $EXP $OUT > $test_name.failed +fi + +unset VERIFY_FSCK_OPT NATIVE_FSCK_OPT OUT EXP TEST_DATA VERIFY_DATA ZIMAGE diff --git a/tests/d_special_files/expect b/tests/d_special_files/expect index 2b2dbfaa..f729b0f1 100644 --- a/tests/d_special_files/expect +++ b/tests/d_special_files/expect @@ -11,7 +11,7 @@ Fragment: Address: 0 Number: 0 Size: 0 ctime: 0x50f560e0 -- Tue Jan 15 14:00:00 2013 atime: 0x50f560e0 -- Tue Jan 15 14:00:00 2013 mtime: 0x50f560e0 -- Tue Jan 15 14:00:00 2013 -Fast_link_dest: bar +Fast link dest: "bar" Exit status is 0 debugfs -R ''stat foo2'' -w test.img Inode: 13 Type: symlink Mode: 0777 Flags: 0x0