[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