[Ocfs-tools-commits] khackel commits r62 - trunk/ocfs2/format

svn-commits at oss.oracle.com svn-commits at oss.oracle.com
Mon Jun 14 16:42:02 CDT 2004


Author: khackel
Date: 2004-06-14 15:42:00 -0500 (Mon, 14 Jun 2004)
New Revision: 62

Added:
   trunk/ocfs2/format/readdir.c
Log:
just adding this dumb little utility to help out with debugging

Added: trunk/ocfs2/format/readdir.c
===================================================================
--- trunk/ocfs2/format/readdir.c	2004-06-14 20:41:22 UTC (rev 61)
+++ trunk/ocfs2/format/readdir.c	2004-06-14 20:42:00 UTC (rev 62)
@@ -0,0 +1,272 @@
+#define _LARGEFILE64_SOURCE
+#define __USE_ISOC99
+
+static inline void prefetch(const void *x) {;}
+#define __KERNEL__
+#define _LINUX_PREFETCH_H
+#include <linux/list.h>
+#undef __KERNEL__
+
+#include <errno.h>
+#include <stdio.h>
+#include <asm/types.h>
+//#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include <fcntl.h>
+
+#include <asm/bitops.h>
+#include <sys/mman.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+#include <sys/ioctl.h>
+#include <linux/fs.h>
+#define _GNU_SOURCE
+#include <getopt.h>
+#include <ocfs2_fs.h>
+#include <ocfs1_fs_compat.h>
+#include <time.h>
+
+
+
+void *memalign(size_t boundary, size_t size);
+
+typedef struct _thingy
+{
+	struct list_head list;
+	__u64 disk_off;
+	__u64 num_bytes;
+	__u64 file_off;
+} thingy;
+
+typedef struct _bunchathingies
+{
+	struct list_head head;
+	__u64 file_size;
+	__u64 alloc_size;
+	__u64 total_size;
+	
+} bunchathingies;
+
+
+#ifndef O_DIRECT
+#define O_DIRECT    	040000
+#endif
+
+
+int load_one_extent(bunchathingies *bleh, ocfs2_extent_rec *ext);
+int load_local_extents(int fd, bunchathingies *bleh, ocfs2_dinode *fe);
+int load_extents(int fd, bunchathingies *bleh, ocfs2_dinode *fe);
+
+unsigned long long int strtoull (__const char *__restrict __nptr, char **__restrict __endptr, int __base);
+
+int fe_main(int argc, char **argv);
+
+int main(int argc, char **argv)
+{
+	char *buf, *p, *dev;
+	int fd, num, entry=0, bufsize;
+	struct ocfs2_dir_entry *de;
+	__u64 offset, override_file_size = 0;
+	ocfs2_dinode *fe;
+	bunchathingies bleh;
+	thingy *t;
+	struct list_head *iter;
+	size_t remaining, to_read;
+
+	if (strstr(argv[0], "fe"))
+		return fe_main(argc, argv);
+
+	INIT_LIST_HEAD(&bleh.head);
+	dev = argv[1];
+
+	bufsize = 512;
+	offset = strtoull(argv[2], NULL, 10);
+	printf("offset is %llu\n", offset);
+	buf = memalign(512, bufsize);
+	if (argc>3)
+		override_file_size = strtoull(argv[3], NULL, 10);
+
+	fd = open(dev, O_RDONLY|O_DIRECT| O_LARGEFILE);
+	lseek64(fd, offset, SEEK_SET);
+	num = read(fd, buf, bufsize);
+	fe = (ocfs2_dinode *)buf;
+	if (load_extents(fd, &bleh, fe) < 0) {
+		printf("eeeeek!\n");
+		exit(1);
+	}
+	free(buf);
+
+	if (override_file_size)
+		bufsize = override_file_size;
+	else
+		bufsize = bleh.file_size;
+	buf = memalign(512, bufsize);
+	remaining = bleh.file_size;
+	p = buf;
+	list_for_each (iter, &bleh.head) {
+		if (!remaining)
+			break;
+		t = list_entry (iter, thingy, list);
+		to_read = t->num_bytes;
+		if (to_read > remaining)
+			to_read = remaining;
+		printf("seeking to %llu\n", t->disk_off);
+		lseek64(fd, t->disk_off, SEEK_SET);
+		num = read(fd, p, to_read);
+		if (num != to_read) {
+			printf("eeek!  num=%lu to_read=%lu off=%llu\n",
+			       num, to_read, t->disk_off);
+			exit(1);
+		}
+		remaining -= to_read;
+		p += to_read;
+	}
+
+	p = buf;
+	while (1) {
+		if (p >= buf + bufsize) {
+			printf("done.\n");
+			break;
+		}
+
+		de = (struct ocfs2_dir_entry *)p;
+		if (de->rec_len==0 || de->inode==0 || de->name_len==0) {
+			printf("BAD OR END: inode=%llu, rec_len=%d, name_len=%d, file_type=%d, name='%*s'\n",
+				de->inode, de->rec_len, de->name_len, de->file_type, de->name_len, de->name);
+			break;
+		}
+		printf("entry #%d: inode=%llu, rec_len=%d, name_len=%d, file_type=%hhu, name='%*s'\n",
+		       ++entry, de->inode, de->rec_len, de->name_len, de->file_type, de->name_len,
+		       de->name);
+		p += de->rec_len;
+	}
+	free(buf);
+	close(fd);
+	return 0;
+}
+
+int load_extents(int fd, bunchathingies *bleh, ocfs2_dinode *fe)
+{
+	int ret = 0;
+
+	bleh->file_size = fe->i_size;
+#warning change this
+	bleh->alloc_size = fe->i_clusters * 4096;
+	bleh->total_size = 0;
+	
+	if (fe->id2.i_list.l_tree_depth == -1)
+		ret = load_local_extents(fd, bleh, fe);
+	else
+		ret = -1;
+	
+	if (bleh->total_size != bleh->alloc_size ||
+	    bleh->total_size < bleh->file_size) {
+		printf("eeeek!  totalsize=%llu allocsize=%llu filesize=%llu\n",
+		       bleh->total_size, bleh->alloc_size, bleh->file_size);
+		exit(1);
+	}
+	return ret;
+}
+
+int load_local_extents(int fd, bunchathingies *bleh, ocfs2_dinode *fe)
+{
+	int i;
+	printf("load_local_extents: l_next_free_rec=%u\n", fe->id2.i_list.l_next_free_rec);
+	for (i=0; i<fe->id2.i_list.l_next_free_rec; i++)
+		load_one_extent(bleh, &(fe->id2.i_list.l_recs[i]));
+	return 0;
+}
+
+int load_one_extent(bunchathingies *bleh, ocfs2_extent_rec *ext)
+{
+	thingy *t = (thingy *)malloc(sizeof(thingy));
+#warning change all this
+	printf("loading one extent: diskoff=%llu fileoff=%llu numbytes=%llu tot=%llu\n",
+	       ext->e_blkno << 9, ext->e_cpos << 12, ext->e_clusters << 12, bleh->total_size);
+
+	t->disk_off = ext->e_blkno << 9;
+	t->file_off = ext->e_cpos << 12;
+	t->num_bytes = ext->e_clusters << 12;
+	list_add_tail(&t->list, &bleh->head);
+	bleh->total_size += ext->e_clusters << 12;
+	return 0;
+}
+
+int fe_main(int argc, char **argv)
+{
+	char *buf, *dev;
+	int fd, num, bufsize;
+	__u64 offset;
+	ocfs2_dinode *fe;
+	bunchathingies bleh;
+	int i;
+	
+	INIT_LIST_HEAD(&bleh.head);
+	dev = argv[1];
+
+	bufsize = 512;
+	offset = strtoull(argv[2], NULL, 10);
+	printf("offset is %llu\n", offset);
+	buf = memalign(512, bufsize);
+	fd = open(dev, O_RDONLY|O_DIRECT| O_LARGEFILE);
+	lseek64(fd, offset, SEEK_SET);
+	num = read(fd, buf, bufsize);
+	fe = (ocfs2_dinode *)buf;
+	printf("signature: \"%-8s\"\n", fe->i_signature);
+	printf("generation: %lu\n", fe->i_generation);
+	printf("suballoc_node: %lu\n", fe->i_suballoc_node);
+	printf("suballoc_blkno: %llu\n", fe->i_suballoc_blkno);
+//	ocfs_disk_lock disk_lock;
+	printf("uid: %lu\n", fe->i_uid);
+	printf("gid: %lu\n", fe->i_gid);
+	printf("size: %llu\n", fe->i_size);
+	printf("mode: %u\n", fe->i_mode);
+	printf("nlink: %u\n", fe->i_links_count);
+	printf("flags: %lu\n", fe->i_flags);
+	printf("atime: %s", ctime(&fe->i_atime));
+	printf("ctime: %s", ctime(&fe->i_ctime));
+	printf("mtime: %s", ctime(&fe->i_mtime));
+	printf("dtime: %s", ctime(&fe->i_dtime));
+	printf("blkno: %llu\n", fe->i_blkno);
+	printf("clusters: %lu\n", fe->i_clusters);
+	printf("tree_depth: %d\n", fe->id2.i_list.l_tree_depth);
+	printf("next_free_ext: %u\n", fe->id2.i_list.l_next_free_rec);
+	printf("extent count: %u\n", fe->id2.i_list.l_count);
+	//printf("last_ext_ptr: %llu\n", fe->last_ext_ptr);
+	
+	printf("bitinfo: used=%lu total=%lu\n", fe->id1.bitmap1.i_used, fe->id1.bitmap1.i_total);
+
+	printf("superinfo: \n");
+	printf("   major: %u\n", fe->id2.i_super.s_major_rev_level);
+	printf("   minor: %u\n", fe->id2.i_super.s_minor_rev_level);
+	printf("   mnt_count: %u\n", fe->id2.i_super.s_mnt_count);
+	printf("   max_mnt_count: %u\n", fe->id2.i_super.s_max_mnt_count);
+	printf("   state: %u\n", fe->id2.i_super.s_state);
+	printf("   errors: %u\n", fe->id2.i_super.s_errors);
+	printf("   checkinterval: %lu\n", fe->id2.i_super.s_checkinterval);
+	printf("   lastcheck: %s", ctime(&fe->id2.i_super.s_lastcheck));
+	printf("   creator_os: %lu\n", fe->id2.i_super.s_creator_os);
+	printf("   feature_compat: %lu\n", fe->id2.i_super.s_feature_compat);
+	printf("   feature_incompat: %lu\n", fe->id2.i_super.s_feature_incompat);
+	printf("   feature_rocompat: %lu\n", fe->id2.i_super.s_feature_ro_compat);
+	printf("   root_blkno: %llu\n", fe->id2.i_super.s_root_blkno);
+	printf("   system_dir_blkno: %llu\n", fe->id2.i_super.s_system_dir_blkno);
+	printf("   label: %-64s\n", fe->id2.i_super.s_label);
+	printf("   uuid: ");
+	for (i=0; i<16; i++)
+		printf("%02x ", fe->id2.i_super.s_uuid[i]);
+	printf("\n");
+
+	printf("extents: \n");
+	for (i=0; i<fe->id2.i_list.l_next_free_rec; i++) {
+		printf("   fileoff: %lu\n", fe->id2.i_list.l_recs[i].e_cpos);
+		printf("   clusters: %lu\n", fe->id2.i_list.l_recs[i].e_clusters);
+		printf("   blkno: %llu\n", fe->id2.i_list.l_recs[i].e_blkno);
+	}
+
+	free(buf);
+	close(fd);
+	return 0;
+}



More information about the Ocfs-tools-commits mailing list