[Ocfs2-tools-commits] smushran commits r1302 - in trunk/debugfs.ocfs2: . include

svn-commits at oss.oracle.com svn-commits at oss.oracle.com
Thu Feb 15 15:14:12 PST 2007


Author: smushran
Date: 2007-02-15 15:14:11 -0800 (Thu, 15 Feb 2007)
New Revision: 1302

Modified:
   trunk/debugfs.ocfs2/commands.c
   trunk/debugfs.ocfs2/include/journal.h
   trunk/debugfs.ocfs2/journal.c
Log:
debugfs: Fix logdump command

logdump command is now able to dump journals of unlimited size.
Previously it had a hard limit of 100M.

Signed-off-by: mfasheh

Modified: trunk/debugfs.ocfs2/commands.c
===================================================================
--- trunk/debugfs.ocfs2/commands.c	2007-02-15 23:11:20 UTC (rev 1301)
+++ trunk/debugfs.ocfs2/commands.c	2007-02-15 23:14:11 UTC (rev 1302)
@@ -1072,18 +1072,12 @@
 	return ;
 }
 
-/*
- * do_logdump()
- *
- */
 static void do_logdump (char **args)
 {
-	char *logbuf = NULL;
-	uint64_t blkno = 0;
-	int32_t len = 0;
-	FILE *out;
+	errcode_t ret;
 	uint16_t slotnum;
-	errcode_t ret = 0;
+	uint64_t blkno;
+	FILE *out;
 
 	if (check_device_open())
 		return ;
@@ -1092,22 +1086,14 @@
 		return ;
 
 	blkno = gbls.jrnl_blkno[slotnum];
-	ret = read_whole_file(gbls.fs, blkno, &logbuf, &len);
-	if (ret) {
-		com_err(args[0], ret, "while reading journal for slot %d",
-			slotnum);
-		goto bail;
-	}
 
 	out = open_pager(gbls.interactive);
-	read_journal (out, logbuf, (uint64_t)len);
+	ret = read_journal(gbls.fs, blkno, out);
 	close_pager (out);
+	if (ret)
+		com_err(gbls.cmd, ret, "while reading journal");
 
-bail:
-	if (logbuf)
-		ocfs2_free(&logbuf);
-
-	return ;
+	return;
 }
 
 /*

Modified: trunk/debugfs.ocfs2/include/journal.h
===================================================================
--- trunk/debugfs.ocfs2/include/journal.h	2007-02-15 23:11:20 UTC (rev 1301)
+++ trunk/debugfs.ocfs2/include/journal.h	2007-02-15 23:14:11 UTC (rev 1302)
@@ -28,7 +28,7 @@
 
 #include <jbd.h>
 
-void read_journal (FILE *out, char *buf, uint64_t buflen);
+errcode_t read_journal(ocfs2_filesys *fs, uint64_t blkno, FILE *out);
 int detect_block (char *buf);
 
 #endif		/* _JOURNAL_H_ */

Modified: trunk/debugfs.ocfs2/journal.c
===================================================================
--- trunk/debugfs.ocfs2/journal.c	2007-02-15 23:11:20 UTC (rev 1301)
+++ trunk/debugfs.ocfs2/journal.c	2007-02-15 23:14:11 UTC (rev 1302)
@@ -3,7 +3,7 @@
  *
  * reads the journal file
  *
- * Copyright (C) 2004 Oracle.  All rights reserved.
+ * Copyright (C) 2004, 2007 Oracle.  All rights reserved.
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public
@@ -27,62 +27,124 @@
 
 extern dbgfs_gbls gbls;
 
-/*
- * read_journal()
- *
- */
-void read_journal (FILE *out, char *buf, uint64_t buflen)
+static void scan_journal(FILE *out, char *buf, int len,
+			 uint64_t *blocknum, uint64_t *last_unknown)
 {
 	char *block;
-	uint64_t blocknum;
-	journal_header_t *header;
-	__u32 blksize = 1 << OCFS2_RAW_SB(gbls.fs->fs_super)->s_blocksize_bits;
-	uint64_t len;
 	char *p;
-	uint64_t last_unknown = 0;
 	int type;
+	journal_header_t *header;
 
-	dump_jbd_superblock (out, (journal_superblock_t *) buf);
+	p = buf;
 
-	blocknum = 1;
-	p = buf + blksize;
-	len = buflen - blksize;
-
 	while (len) {
 		block = p;
-		header = (journal_header_t *) block;
+		header = (journal_header_t *)block;
 		if (header->h_magic == ntohl(JFS_MAGIC_NUMBER)) {
-			if (last_unknown) {
-				dump_jbd_unknown (out, last_unknown, blocknum);
-				last_unknown = 0;
+			if (*last_unknown) {
+				dump_jbd_unknown(out, *last_unknown, *blocknum);
+				*last_unknown = 0;
 			}
-			dump_jbd_block (out, header, blocknum);
+			dump_jbd_block(out, header, *blocknum);
 		} else {
-			type = detect_block (block);
+			type = detect_block(block);
 			if (type < 0) {
-				if (last_unknown == 0)
-					last_unknown = blocknum;
+				if (*last_unknown == 0)
+					*last_unknown = *blocknum;
 			} else {
-				if (last_unknown) {
-					dump_jbd_unknown (out, last_unknown, blocknum);
-					last_unknown = 0;
+				if (*last_unknown) {
+					dump_jbd_unknown(out, *last_unknown,
+							 *blocknum);
+					*last_unknown = 0;
 				}
-				dump_jbd_metadata (out, type, block, blocknum);
+				dump_jbd_metadata(out, type, block, *blocknum);
 			}
 		}
-		blocknum++;
-		p += blksize;
-		len -= blksize;
+		(*blocknum)++;
+		p += gbls.fs->fs_blocksize;
+		len -= gbls.fs->fs_blocksize;
 	}
 
+	return;
+}
+
+errcode_t read_journal(ocfs2_filesys *fs, uint64_t blkno, FILE *out)
+{
+	char *buf = NULL;
+	char *p;
+	uint64_t blocknum;
+	uint64_t len;
+	uint64_t offset;
+	uint32_t got;
+	uint64_t last_unknown = 0;
+	uint32_t buflen = 1024 * 1024;
+	int buflenbits;
+	ocfs2_cached_inode *ci = NULL;
+	errcode_t ret;
+
+	ret = ocfs2_read_cached_inode(fs, blkno, &ci);
+	if (ret) {
+		com_err(gbls.cmd, ret, "while reading inode %"PRIu64, blkno);
+		goto bail;
+	}
+
+	ret = ocfs2_extent_map_init(fs, ci);
+	if (ret) {
+		com_err(gbls.cmd, ret, "while initializing extent map");
+		goto bail;
+	}
+
+	buflenbits = buflen >>
+			OCFS2_RAW_SB(gbls.fs->fs_super)->s_blocksize_bits;
+	ret = ocfs2_malloc_blocks(fs->fs_io, buflenbits, &buf);
+	if (ret) {
+		com_err(gbls.cmd, ret, "while allocating %u bytes", buflen);
+		goto bail;
+	}
+
+	offset = 0;
+	blocknum = 0;
+	while (1) {
+		ret = ocfs2_file_read(ci, buf, buflen, offset, &got);
+		if (ret) {
+			com_err(gbls.cmd, ret, "while reading journal");
+			goto bail;
+		};
+
+		if (got == 0)
+			break;
+
+		p = buf;
+		len = got;
+
+		if (offset == 0) {
+			dump_jbd_superblock(out, (journal_superblock_t *)buf);
+			blocknum++;
+			p += fs->fs_blocksize;
+			len -= fs->fs_blocksize;
+		}
+
+		scan_journal(out, p, len, &blocknum, &last_unknown);
+
+		if (got < buflen)
+			break;
+		offset += got;
+	}
+
 	if (last_unknown) {
-		dump_jbd_unknown (out, last_unknown, blocknum);
+		dump_jbd_unknown(out, last_unknown, blocknum);
 		last_unknown = 0;
 	}
 
-	return ;
-}				/* read_journal */
+bail:
+	if (buf)
+		ocfs2_free(&buf);
+	if (ci)
+		ocfs2_free_cached_inode(fs, ci);
 
+	return ret;
+}
+
 /*
  * detect_block()
  *




More information about the Ocfs2-tools-commits mailing list