]> git.ipfire.org Git - thirdparty/e2fsprogs.git/commitdiff
debugfs: make stat command support inline data
authorZheng Liu <wenqing.lz@taobao.com>
Mon, 3 Mar 2014 05:31:26 +0000 (00:31 -0500)
committerTheodore Ts'o <tytso@mit.edu>
Tue, 4 Mar 2014 13:46:13 +0000 (08:46 -0500)
If there is an inode with inline data, we just print the size of inline
data in stat command.

Signed-off-by: Zheng Liu <wenqing.lz@taobao.com>
Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
debugfs/debugfs.c
lib/ext2fs/ext2fsP.h
lib/ext2fs/inline_data.c

index 29c0161620bfa6691519623f0bae516d395ae3bb..d1ecf2ed1f415167044dde83eaeeb7fbd7f58a9a 100644 (file)
@@ -731,6 +731,16 @@ static void dump_extents(FILE *f, const char *prefix, ext2_ino_t ino,
                fprintf(f, "\n");
 }
 
+static void dump_inline_data(FILE *out, const char *prefix, ext2_ino_t inode_num)
+{
+       errcode_t retval;
+       size_t size;
+
+       retval = ext2fs_inline_data_size(current_fs, inode_num, &size);
+       if (!retval)
+               fprintf(out, "%sSize of inline data: %d", prefix, size);
+}
+
 void internal_dump_inode(FILE *out, const char *prefix,
                         ext2_ino_t inode_num, struct ext2_inode *inode,
                         int do_dump_blocks)
@@ -865,6 +875,8 @@ void internal_dump_inode(FILE *out, const char *prefix,
                if (inode->i_flags & EXT4_EXTENTS_FL)
                        dump_extents(out, prefix, inode_num,
                                     DUMP_LEAF_EXTENTS|DUMP_NODE_EXTENTS, 0, 0);
+               else if (inode->i_flags & EXT4_INLINE_DATA_FL)
+                       dump_inline_data(out, prefix, inode_num);
                else
                        dump_blocks(out, prefix, inode_num);
        }
index b2afd15326cbe9cba0ff7b2d93d1081a8ef7ee8e..696603a04c12b008aee8dcf9ae564fbf85a3e7af 100644 (file)
@@ -88,6 +88,8 @@ extern int ext2fs_process_dir_block(ext2_filsys       fs,
                                    int                 ref_offset,
                                    void                *priv_data);
 
+extern errcode_t ext2fs_inline_data_size(ext2_filsys fs, ext2_ino_t ino,
+                                        size_t *size);
 extern int ext2fs_inline_data_dir_iterate(ext2_filsys fs,
                                          ext2_ino_t ino,
                                          void *priv_data);
index 9bfc8effb2099a773df87807e1b06e0fc440773a..a9b6681a1e62adb27117f39e4c019642e31b6067 100644 (file)
@@ -77,6 +77,28 @@ err:
        return retval;
 }
 
+errcode_t ext2fs_inline_data_size(ext2_filsys fs, ext2_ino_t ino, size_t *size)
+{
+       struct ext2_inode inode;
+       struct ext2_inline_data data;
+       errcode_t retval;
+
+       retval = ext2fs_read_inode(fs, ino, &inode);
+       if (retval)
+               return retval;
+
+       if (!(inode.i_flags & EXT4_INLINE_DATA_FL))
+               return EXT2_ET_NO_INLINE_DATA;
+
+       data.fs = fs;
+       data.ino = ino;
+       retval = ext2fs_inline_data_ea_get(&data);
+       if (retval)
+               return retval;
+
+       *size = EXT4_MIN_INLINE_DATA_SIZE + data.ea_size;
+       return ext2fs_free_mem(&data.ea_data);
+}
 
 int ext2fs_inline_data_dir_iterate(ext2_filsys fs, ext2_ino_t ino,
                                   void *priv_data)