[Ocfs2-tools-devel] [PATCH 1/1] Ocfs2-tools: Let debugfs.ocfs2 correctly (r)dump the symlink.

Tristan Ye tristan.ye at oracle.com
Wed Jun 3 20:32:31 PDT 2009


Now we reach a unification, dump cmd in debugfs.ocfs2 will create
another symlink which points to the same destination as source symlink
we want to dump. so it will remain a symlink on the local fs as we wanted.

Signed-off-by: Tristan Ye <tristan.ye at oracle.com>
---
 debugfs.ocfs2/utils.c |   37 +++++++++++++++++++++++++++++--------
 1 files changed, 29 insertions(+), 8 deletions(-)

diff --git a/debugfs.ocfs2/utils.c b/debugfs.ocfs2/utils.c
index b1494fa..6107d9e 100644
--- a/debugfs.ocfs2/utils.c
+++ b/debugfs.ocfs2/utils.c
@@ -423,6 +423,9 @@ bail:
  * dump_file()
  *
  */
+static errcode_t dump_symlink(ocfs2_filesys *fs, uint64_t blkno, char *name,
+			      struct ocfs2_dinode *inode);
+
 errcode_t dump_file(ocfs2_filesys *fs, uint64_t ino, int fd, char *out_file,
 		    int preserve)
 {
@@ -440,6 +443,16 @@ errcode_t dump_file(ocfs2_filesys *fs, uint64_t ino, int fd, char *out_file,
 		goto bail;
 	}
 
+	if (S_ISLNK(ci->ci_inode->i_mode)) {
+
+		ret = unlink(out_file);
+		if (ret)
+			goto bail;
+
+		ret = dump_symlink(fs, ino, out_file, ci->ci_inode);
+		goto bail;
+	}
+
 	buflen = 1024 * 1024;
 
 	ret = ocfs2_malloc_blocks(fs->fs_io,
@@ -618,24 +631,32 @@ void inode_time_to_str(uint64_t timeval, char *str, int len)
 
 
 /*
- * rdump_symlink()
+ * dump_symlink()
  *
  * Code based on similar function in e2fsprogs-1.32/debugfs/dump.c
  *
  * Copyright (C) 1994 Theodore Ts'o.  This file may be redistributed
  * under the terms of the GNU Public License.
  */
-static errcode_t rdump_symlink(ocfs2_filesys *fs, uint64_t blkno, char *name)
+static errcode_t dump_symlink(ocfs2_filesys *fs, uint64_t blkno, char *name,
+			      struct ocfs2_dinode *inode)
 {
 	char *buf = NULL;
 	uint32_t len = 0;
-	errcode_t ret;
+	errcode_t ret = 0;
 
-	ret = read_whole_file(fs, blkno, &buf, &len);
-	if (ret)
-		goto bail;
+	char *link = NULL;
+
+	if (!inode->i_clusters)
+		link = (char *)inode->id2.i_symlink;
+	else {
+		ret = read_whole_file(fs, blkno, &buf, &len);
+		if (ret)
+			goto bail;
+		link = buf;
+	}
 
-	if (symlink(buf, name) == -1)
+	if (symlink(link, name) == -1)
 		ret = errno;
 
 bail:
@@ -719,7 +740,7 @@ errcode_t rdump_inode(ocfs2_filesys *fs, uint64_t blkno, const char *name,
 	di = (struct ocfs2_dinode *)buf;
 
 	if (S_ISLNK(di->i_mode)) {
-		ret = rdump_symlink(fs, blkno, fullname);
+		ret = dump_symlink(fs, blkno, fullname, di);
 		if (ret)
 			goto bail;
 	} else if (S_ISREG(di->i_mode)) {
-- 
1.5.5




More information about the Ocfs2-tools-devel mailing list