debugfs.c (make_link): Set the filetype information when creating
a link.
diff --git a/debugfs/debugfs.c b/debugfs/debugfs.c
index 2752ff8..e16ac84 100644
--- a/debugfs/debugfs.c
+++ b/debugfs/debugfs.c
@@ -818,9 +818,39 @@
return;
}
+/*
+ * Given a mode, return the ext2 file type
+ */
+static int ext2_file_type(unsigned int mode)
+{
+ if (LINUX_S_ISREG(mode))
+ return EXT2_FT_REG_FILE;
+
+ if (LINUX_S_ISDIR(mode))
+ return EXT2_FT_DIR;
+
+ if (LINUX_S_ISCHR(mode))
+ return EXT2_FT_CHRDEV;
+
+ if (LINUX_S_ISBLK(mode))
+ return EXT2_FT_BLKDEV;
+
+ if (LINUX_S_ISLNK(mode))
+ return EXT2_FT_SYMLINK;
+
+ if (LINUX_S_ISFIFO(mode))
+ return EXT2_FT_FIFO;
+
+ if (LINUX_S_ISSOCK(mode))
+ return EXT2_FT_SOCK;
+
+ return 0;
+}
+
static void make_link(char *sourcename, char *destname)
{
- ext2_ino_t inode;
+ ext2_ino_t ino;
+ struct ext2_inode inode;
int retval;
ext2_ino_t dir;
char *dest, *cp, *basename;
@@ -828,8 +858,8 @@
/*
* Get the source inode
*/
- inode = string_to_inode(sourcename);
- if (!inode)
+ ino = string_to_inode(sourcename);
+ if (!ino)
return;
basename = strrchr(sourcename, '/');
if (basename)
@@ -859,8 +889,12 @@
dest = destname;
}
}
+
+ if (debugfs_read_inode(ino, &inode, sourcename))
+ return;
- retval = ext2fs_link(current_fs, dir, dest, inode, 0);
+ retval = ext2fs_link(current_fs, dir, dest, ino,
+ ext2_file_type(inode.i_mode));
if (retval)
com_err("make_link", retval, "");
return;