Whamcloud - gitweb
debugfs: fix printing of inline data during symlink inode dump
authorDarrick J. Wong <darrick.wong@oracle.com>
Tue, 22 Jul 2014 22:01:53 +0000 (18:01 -0400)
committerTheodore Ts'o <tytso@mit.edu>
Tue, 22 Jul 2014 22:44:33 +0000 (18:44 -0400)
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>
debugfs/debugfs.c
debugfs/xattrs.c
tests/d_inline_dump/expect [new file with mode: 0644]
tests/d_inline_dump/image.gz [new file with mode: 0644]
tests/d_inline_dump/name [new file with mode: 0644]
tests/d_inline_dump/script [new file with mode: 0644]
tests/d_special_files/expect

index 4fffc82..5ab43a3 100644 (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;
index f2d7128..1c19b2f 100644 (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;
 }
diff --git a/tests/d_inline_dump/expect b/tests/d_inline_dump/expect
new file mode 100644 (file)
index 0000000..ead47f9
--- /dev/null
@@ -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 (file)
index 0000000..598a495
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 (file)
index 0000000..dfc1a9c
--- /dev/null
@@ -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 (file)
index 0000000..8d97729
--- /dev/null
@@ -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
index 2b2dbfa..f729b0f 100644 (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