[Ocfs2-tools-commits] smushran commits r451 - in trunk/fswrk: .
include
svn-commits at oss.oracle.com
svn-commits at oss.oracle.com
Thu Dec 2 20:13:13 CST 2004
Author: smushran
Date: 2004-12-02 20:13:11 -0600 (Thu, 02 Dec 2004)
New Revision: 451
Modified:
trunk/fswrk/include/readfs.h
trunk/fswrk/include/utils.h
trunk/fswrk/readfs.c
trunk/fswrk/utils.c
Log:
hmmm
Modified: trunk/fswrk/include/readfs.h
===================================================================
--- trunk/fswrk/include/readfs.h 2004-12-02 23:01:12 UTC (rev 450)
+++ trunk/fswrk/include/readfs.h 2004-12-03 02:13:11 UTC (rev 451)
@@ -28,13 +28,9 @@
fswrk_ctxt *open_fs(char *device);
void close_fs(fswrk_ctxt *ctxt);
-int read_super_block (fswrk_ctxt *ctxt);
-int read_inode (fswrk_ctxt *ctxt, __u64 blknum, char *buf);
-int read_group (fswrk_ctxt *ctxt, __u64 blknum, char *buf);
-int traverse_extents (fswrk_ctxt *ctxt, ocfs2_extent_list *ext, GArray *arr);
-void read_dir_block (struct ocfs2_dir_entry *dir, int len, GArray *arr);
void read_dir (fswrk_ctxt *ctxt, ocfs2_extent_list *ext, __u64 size, GArray *dirarr);
-void read_sysdir (fswrk_ctxt *ctxt);
int read_file (fswrk_ctxt *ctxt, __u64 blknum, int fdo, char **buf);
+int read_inode (fswrk_ctxt *ctxt, uint64_t blkno, char *buf);
+int read_group (fswrk_ctxt *ctxt, uint64_t blkno, char *buf);
#endif /* __READFS_H__ */
Modified: trunk/fswrk/include/utils.h
===================================================================
--- trunk/fswrk/include/utils.h 2004-12-02 23:01:12 UTC (rev 450)
+++ trunk/fswrk/include/utils.h 2004-12-03 02:13:11 UTC (rev 451)
@@ -28,5 +28,6 @@
void add_extent_rec (GArray *arr, ocfs2_extent_rec *rec);
void add_dir_rec (GArray *arr, struct ocfs2_dir_entry *rec);
+int read_block(fswrk_ctxt *ctx, uint64_t blkno, char **buf);
#endif /* __UTILS_H__ */
Modified: trunk/fswrk/readfs.c
===================================================================
--- trunk/fswrk/readfs.c 2004-12-02 23:01:12 UTC (rev 450)
+++ trunk/fswrk/readfs.c 2004-12-03 02:13:11 UTC (rev 451)
@@ -26,95 +26,10 @@
#include <main.h>
/*
- * open_fs()
- *
- */
-fswrk_ctxt *open_fs (char *dev)
-{
- ocfs2_super_block *sb;
- uint32_t len;
- fswrk_ctxt *ctxt = NULL;
-
- if (!dev)
- return NULL;
-
- if (!(ctxt = malloc(sizeof(fswrk_ctxt))))
- FSWRK_FATAL("%s", strerror(errno));
-
- memset(ctxt, 0, sizeof(fswrk_ctxt));
-
- ctxt->fd = open (dev, O_DIRECT | O_RDWR);
- if (ctxt->fd == -1) {
- printf ("could not open device %s\n", dev);
- goto bail;
- }
-
- ctxt->device = g_strdup (dev);
-
- if (read_super_block (ctxt) == -1) {
- close (ctxt->fd);
- goto bail;
- }
-
- sb = &(ctxt->super_block->id2.i_super);
-
- /* read root inode */
- len = 1 << sb->s_blocksize_bits;
- if (!(ctxt->root_dir = memalign(len, len)))
- FSWRK_FATAL("%s", strerror(errno));
- if ((pread64(ctxt->fd, (char *)ctxt->root_dir, len,
- (sb->s_root_blkno << sb->s_blocksize_bits))) == -1)
- FSWRK_FATAL("%s", strerror(errno));
-
- /* read sysdir inode */
- len = 1 << sb->s_blocksize_bits;
- if (!(ctxt->system_dir = memalign(len, len)))
- FSWRK_FATAL("%s", strerror(errno));
- if ((pread64(ctxt->fd, (char *)ctxt->system_dir, len,
- (sb->s_system_dir_blkno << sb->s_blocksize_bits))) == -1)
- FSWRK_FATAL("%s", strerror(errno));
-
- /* load sysfiles blknums */
- read_sysdir(ctxt);
-
- /* get the max clusters/blocks */
- ctxt->max_clusters = ctxt->super_block->i_clusters;
- ctxt->max_blocks = ctxt->max_clusters << (sb->s_clustersize_bits -
- sb->s_blocksize_bits);
-
- return ctxt;
-
-bail:
- safefree(ctxt);
- return NULL;
-} /* open_fs */
-
-/*
- * close_fs()
- *
- */
-void close_fs (fswrk_ctxt *ctxt)
-{
- if (ctxt->device) {
- safefree (ctxt->device);
-
- close (ctxt->fd);
- ctxt->fd = -1;
-
- safefree (ctxt->super_block);
- safefree (ctxt->root_dir);
- safefree (ctxt->system_dir);
- } else
- printf ("device not open\n");
-
- return ;
-} /* close_fs */
-
-/*
* read_super_block()
*
*/
-int read_super_block (fswrk_ctxt *ctxt)
+static int read_super_block (fswrk_ctxt *ctxt)
{
int ret = -1;
uint64_t off;
@@ -129,7 +44,7 @@
if (!(buf = memalign(buflen, buflen)))
FSWRK_FATAL("%s", strerror(errno));
- if ((ret = pread64(ctxt->fd, buf, buflen, 0)) == -1) {
+ if ((ret = pread64(ctxt->fd, buf, buflen, 0)) == -1) {
safefree (buf);
continue;
} else
@@ -184,165 +99,13 @@
safefree (buf);
return ret;
-} /* read_super_block */
+}
/*
- * read_inode()
- *
- */
-int read_inode (fswrk_ctxt *ctxt, uint64_t blkno, char *buf)
-{
- ocfs2_dinode *inode;
- int ret = 0;
- ocfs2_super_block *sb = &(ctxt->super_block->id2.i_super);
- int len = 1 << sb->s_blocksize_bits;
- uint64_t off = blkno << sb->s_blocksize_bits;
-
- if ((pread64(ctxt->fd, buf, len, off)) == -1)
- FSWRK_FATAL("%s off=%"PRIu64, strerror(errno), off);
-
- inode = (ocfs2_dinode *)buf;
-
- if (memcmp(inode->i_signature, OCFS2_INODE_SIGNATURE,
- sizeof(OCFS2_INODE_SIGNATURE)))
- ret = -1;
-
- return ret;
-} /* read_inode */
-
-/*
- * read_group()
- *
- */
-int read_group (fswrk_ctxt *ctxt, uint64_t blkno, char *buf)
-{
- ocfs2_group_desc *bg;
- int ret = 0;
- ocfs2_super_block *sb = &(ctxt->super_block->id2.i_super);
- int len = 1 << sb->s_blocksize_bits;
- uint64_t off = blkno << sb->s_blocksize_bits;
-
- if ((pread64(ctxt->fd, buf, len, off)) == -1)
- FSWRK_FATAL("%s off=%"PRIu64, strerror(errno), off);
-
- bg = (ocfs2_group_desc *)buf;
-
- if (memcmp(bg->bg_signature, OCFS2_GROUP_DESC_SIGNATURE,
- sizeof(OCFS2_GROUP_DESC_SIGNATURE)))
- ret = -1;
-
- return ret;
-} /* read_group */
-
-/*
- * traverse_extents()
- *
- */
-int traverse_extents (fswrk_ctxt *ctxt, ocfs2_extent_list *ext, GArray *arr)
-{
- ocfs2_extent_block *blk;
- ocfs2_extent_rec *rec;
- int ret = 0;
- uint64_t off;
- char *buf = NULL;
- uint32_t buflen;
- int i;
- ocfs2_super_block *sb = &(ctxt->super_block->id2.i_super);
-
- for (i = 0; i < ext->l_next_free_rec; ++i) {
- rec = &(ext->l_recs[i]);
- if (ext->l_tree_depth == 0)
- add_extent_rec (arr, rec);
- else {
- buflen = 1 << sb->s_blocksize_bits;
- if (!(buf = memalign(buflen, buflen)))
- FSWRK_FATAL("%s", strerror(errno));
-
- off = (uint64_t)rec->e_blkno << sb->s_blocksize_bits;
- if ((pread64 (ctxt->fd, buf, buflen, off)) == -1)
- FSWRK_FATAL("%s", strerror(errno));
-
- blk = (ocfs2_extent_block *)buf;
-
- traverse_extents (ctxt, &(blk->h_list), arr);
- }
- }
-
- safefree (buf);
- return ret;
-} /* traverse_extents */
-
-/*
- * read_dir_block()
- *
- */
-void read_dir_block (struct ocfs2_dir_entry *dir, int len, GArray *arr)
-{
- char *p;
- struct ocfs2_dir_entry *rec;
-
- p = (char *) dir;
-
- while (p < (((char *)dir) + len)) {
- rec = (struct ocfs2_dir_entry *)p;
- if (rec->inode)
- add_dir_rec (arr, rec);
- p += rec->rec_len;
- }
-
- return ;
-} /* read_dir_block */
-
-/*
- * read_dir()
- *
- */
-void read_dir (fswrk_ctxt *ctxt, ocfs2_extent_list *ext, uint64_t size, GArray *dirarr)
-{
- ocfs2_extent_rec *rec;
- GArray *arr = NULL;
- unsigned int i = 0;
- char *buf = NULL;
- ocfs2_super_block *sb = &(ctxt->super_block->id2.i_super);
- uint32_t len;
- uint64_t off;
- uint64_t foff;
-
- arr = g_array_new(0, 1, sizeof(ocfs2_extent_rec));
-
- traverse_extents (ctxt, ext, arr);
-
- for (i = 0; i < arr->len; ++i) {
- rec = &(g_array_index(arr, ocfs2_extent_rec, i));
-
- off = rec->e_blkno << sb->s_blocksize_bits;
- foff = rec->e_cpos << sb->s_clustersize_bits;
- len = rec->e_clusters << sb->s_clustersize_bits;
- if ((foff + len) > size)
- len = size - foff;
-
- if (!(buf = memalign((1 << sb->s_blocksize_bits), len)))
- FSWRK_FATAL("%s", strerror(errno));
-
- if ((pread64(ctxt->fd, buf, len, off)) == -1)
- FSWRK_FATAL("%s", strerror(errno));
-
- read_dir_block ((struct ocfs2_dir_entry *)buf, len, dirarr);
-
- safefree (buf);
- }
-
- if (arr)
- g_array_free (arr, 1);
-
- return ;
-} /* read_dir */
-
-/*
* read_sysdir()
*
*/
-void read_sysdir (fswrk_ctxt *ctxt)
+static void read_sysdir (fswrk_ctxt *ctxt)
{
ocfs2_dinode *di;
struct ocfs2_dir_entry *rec;
@@ -472,8 +235,216 @@
}
return ;
-} /* read_sysdir */
+}
+
+/*
+ * open_fs()
+ *
+ */
+fswrk_ctxt *open_fs (char *dev)
+{
+ ocfs2_super_block *sb;
+ fswrk_ctxt *ctxt = NULL;
+
+ if (!dev)
+ return NULL;
+
+ if (!(ctxt = malloc(sizeof(fswrk_ctxt))))
+ FSWRK_FATAL("%s", strerror(errno));
+
+ memset(ctxt, 0, sizeof(fswrk_ctxt));
+
+ ctxt->fd = open (dev, O_DIRECT | O_RDWR);
+ if (ctxt->fd == -1) {
+ printf ("could not open device %s\n", dev);
+ goto bail;
+ }
+
+ ctxt->device = g_strdup (dev);
+
+ if (read_super_block (ctxt) == -1) {
+ close (ctxt->fd);
+ goto bail;
+ }
+
+ sb = &(ctxt->super_block->id2.i_super);
+
+ /* read root inode */
+ if (read_block(ctxt, sb->s_root_blkno, (char **)&ctxt->root_dir))
+ FSWRK_FATAL("%s", strerror(errno));
+
+ /* read sysdir inode */
+ if (read_block(ctxt, sb->s_system_dir_blkno, (char **)&ctxt->system_dir))
+ FSWRK_FATAL("%s", strerror(errno));
+
+ /* load sysfiles blknums */
+ read_sysdir(ctxt);
+
+ /* get the max clusters/blocks */
+ ctxt->max_clusters = ctxt->super_block->i_clusters;
+ ctxt->max_blocks = ctxt->max_clusters << (sb->s_clustersize_bits -
+ sb->s_blocksize_bits);
+
+ return ctxt;
+
+bail:
+ safefree(ctxt);
+ return NULL;
+}
+
+/*
+ * close_fs()
+ *
+ */
+void close_fs (fswrk_ctxt *ctxt)
+{
+ if (ctxt->device) {
+ safefree (ctxt->device);
+
+ close (ctxt->fd);
+ ctxt->fd = -1;
+
+ safefree (ctxt->super_block);
+ safefree (ctxt->root_dir);
+ safefree (ctxt->system_dir);
+ } else
+ printf ("device not open\n");
+
+ return ;
+}
+
+/*
+ * read_inode()
+ *
+ */
+int read_inode (fswrk_ctxt *ctxt, uint64_t blkno, char *buf)
+{
+ ocfs2_dinode *di;
+
+ if (read_block(ctxt, blkno, (char **)&buf))
+ FSWRK_FATAL("%s blkno=%"PRIu64, strerror(errno), blkno);
+
+ di = (ocfs2_dinode *)buf;
+
+ if (memcmp(di->i_signature, OCFS2_INODE_SIGNATURE,
+ sizeof(OCFS2_INODE_SIGNATURE)))
+ return -1;
+
+ return 0;
+}
+
+/*
+ * read_group()
+ *
+ */
+int read_group (fswrk_ctxt *ctxt, uint64_t blkno, char *buf)
+{
+ ocfs2_group_desc *bg;
+
+ if (read_block(ctxt, blkno, (char **)&buf))
+ FSWRK_FATAL("%s blkno=%"PRIu64, strerror(errno), blkno);
+
+ bg = (ocfs2_group_desc *)buf;
+
+ if (memcmp(bg->bg_signature, OCFS2_GROUP_DESC_SIGNATURE,
+ sizeof(OCFS2_GROUP_DESC_SIGNATURE)))
+ return -1;
+
+ return 0;
+}
+
+/*
+ * traverse_extents()
+ *
+ */
+static int traverse_extents (fswrk_ctxt *ctxt, ocfs2_extent_list *ext, GArray *arr)
+{
+ ocfs2_extent_block *blk;
+ ocfs2_extent_rec *rec;
+ int ret = 0;
+ char *buf = NULL;
+ int i;
+
+ for (i = 0; i < ext->l_next_free_rec; ++i) {
+ rec = &(ext->l_recs[i]);
+ if (ext->l_tree_depth == 0)
+ add_extent_rec (arr, rec);
+ else {
+ if (read_block(ctxt, rec->e_blkno, (char **)buf))
+ FSWRK_FATAL("%s", strerror(errno));
+
+ blk = (ocfs2_extent_block *)buf;
+
+ traverse_extents (ctxt, &(blk->h_list), arr);
+ }
+ }
+
+ safefree (buf);
+ return ret;
+}
+
+/*
+ * read_dir_block()
+ *
+ */
+static void read_dir_block (struct ocfs2_dir_entry *dir, int len, GArray *arr)
+{
+ char *p;
+ struct ocfs2_dir_entry *rec;
+
+ p = (char *) dir;
+
+ while (p < (((char *)dir) + len)) {
+ rec = (struct ocfs2_dir_entry *)p;
+ if (rec->inode)
+ add_dir_rec (arr, rec);
+ p += rec->rec_len;
+ }
+
+ return ;
+}
+
+/*
+ * read_dir()
+ *
+ */
+void read_dir (fswrk_ctxt *ctxt, ocfs2_extent_list *ext, uint64_t size, GArray *dirarr)
+{
+ ocfs2_extent_rec *rec;
+ GArray *arr = NULL;
+ unsigned int i = 0;
+ char *buf = NULL;
+ ocfs2_super_block *sb = &(ctxt->super_block->id2.i_super);
+ uint32_t len;
+ uint64_t foff;
+
+ arr = g_array_new(0, 1, sizeof(ocfs2_extent_rec));
+
+ traverse_extents (ctxt, ext, arr);
+
+ for (i = 0; i < arr->len; ++i) {
+ rec = &(g_array_index(arr, ocfs2_extent_rec, i));
+
+ foff = rec->e_cpos << sb->s_clustersize_bits;
+ len = rec->e_clusters << sb->s_clustersize_bits;
+ if ((foff + len) > size)
+ len = size - foff;
+
+ if (read_block(ctxt, rec->e_blkno, (char **)&buf))
+ FSWRK_FATAL("%s", strerror(errno));
+
+ read_dir_block ((struct ocfs2_dir_entry *)buf, len, dirarr);
+
+ safefree (buf);
+ }
+
+ if (arr)
+ g_array_free (arr, 1);
+
+ return ;
+}
+
#if 0
/*
* read_file()
Modified: trunk/fswrk/utils.c
===================================================================
--- trunk/fswrk/utils.c 2004-12-02 23:01:12 UTC (rev 450)
+++ trunk/fswrk/utils.c 2004-12-03 02:13:11 UTC (rev 451)
@@ -43,7 +43,7 @@
g_array_append_vals(arr, new, 1);
return ;
-} /* add_extent_rec */
+}
/*
* add_dir_rec()
@@ -71,4 +71,22 @@
g_array_append_vals(arr, new, 1);
return ;
-} /* add_dir_rec */
+}
+
+/*
+ * read_block()
+ *
+ */
+int read_block(fswrk_ctxt *ctxt, uint64_t blkno, char **buf)
+{
+ ocfs2_super_block *sb = &(ctxt->super_block->id2.i_super);
+ uint32_t len = 1 << 1 << sb->s_blocksize_bits;
+ uint64_t off = blkno << sb->s_blocksize_bits;
+
+ if (!*buf) {
+ if (!(*buf = memalign(len, len)))
+ FSWRK_FATAL("out of memory");
+ }
+
+ return ((pread64(ctxt->fd, *buf, len, off) == len) ? 0 : -1);
+}
More information about the Ocfs2-tools-commits
mailing list