debugfs: fix printing of inline data during symlink inode dump

When we're dumping a fast symlink inode, we print some odd things to
stdout.  To clean this up, first don't print inline data EA, since the
inode dump doesn't display file and directory contents.  Then, teach
the inode dump function how to print out either an inline data fast
symlink or a non-inline data fast symlink.

(This is a follow-up to the earlier patch "debugfs: Only print the
first 60 bytes from i_block on a fast symlink")

[ Modified by tytso so that the d_inline_dump test works when build
  directory is different from the source directory --- i.e., when
  doing a VPATH build. ]

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
crypto
Darrick J. Wong 2014-07-22 18:01:53 -04:00 committed by Theodore Ts'o
parent f9f3050a0a
commit 7ba5cc744b
7 changed files with 194 additions and 9 deletions

View File

@ -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;

View File

@ -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;
}

101
tests/d_inline_dump/expect Normal file
View File

@ -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

Binary file not shown.

1
tests/d_inline_dump/name Normal file
View File

@ -0,0 +1 @@
debugfs dump inline data test

View File

@ -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

View File

@ -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