[Ocfs2-tools-commits] jlbec commits r338 - in trunk/libocfs2: .
include
svn-commits at oss.oracle.com
svn-commits at oss.oracle.com
Wed Oct 20 11:46:18 CDT 2004
Author: jlbec
Date: 2004-10-20 11:46:15 -0500 (Wed, 20 Oct 2004)
New Revision: 338
Modified:
trunk/libocfs2/extent_map.c
trunk/libocfs2/include/extent_map.h
trunk/libocfs2/include/ocfs2.h
Log:
update extent_map API to look more like the kernel
Modified: trunk/libocfs2/extent_map.c
===================================================================
--- trunk/libocfs2/extent_map.c 2004-10-20 00:44:21 UTC (rev 337)
+++ trunk/libocfs2/extent_map.c 2004-10-20 16:46:15 UTC (rev 338)
@@ -79,7 +79,7 @@
return ent;
}
-static errcode_t ocfs2_extent_map_find_leaf(ocfs2_extent_map *em,
+static errcode_t ocfs2_extent_map_find_leaf(ocfs2_cached_inode *cinode,
uint32_t cpos,
uint32_t clusters,
ocfs2_extent_list *el)
@@ -92,8 +92,7 @@
ocfs2_extent_rec *rec;
if (el->l_tree_depth) {
- ret = ocfs2_malloc_block(em->em_cinode->ci_fs->fs_io,
- &eb_buf);
+ ret = ocfs2_malloc_block(cinode->ci_fs->fs_io, &eb_buf);
if (ret)
return ret;
}
@@ -106,18 +105,20 @@
ret = OCFS2_ET_CORRUPT_EXTENT_BLOCK;
if (rec->e_cpos >=
- em->em_cinode->ci_inode->i_clusters)
+ cinode->ci_inode->i_clusters)
goto out_free;
if ((rec->e_cpos + rec->e_clusters) <= cpos) {
- ret = ocfs2_extent_map_insert(em, rec,
+ ret = ocfs2_extent_map_insert(cinode,
+ rec,
el->l_tree_depth);
if (ret)
goto out_free;
continue;
}
if ((cpos + clusters) <= rec->e_cpos) {
- ret = ocfs2_extent_map_insert(em, rec,
+ ret = ocfs2_extent_map_insert(cinode,
+ rec,
el->l_tree_depth);
if (ret)
goto out_free;
@@ -150,7 +151,7 @@
if (!blkno)
goto out_free;
- ret = ocfs2_read_extent_block(em->em_cinode->ci_fs,
+ ret = ocfs2_read_extent_block(cinode->ci_fs,
blkno, eb_buf);
if (ret)
goto out_free;
@@ -164,7 +165,7 @@
for (i = 0; i < el->l_next_free_rec; i++) {
rec = &el->l_recs[i];
- ret = ocfs2_extent_map_insert(em, rec,
+ ret = ocfs2_extent_map_insert(cinode, rec,
el->l_tree_depth);
if (ret)
goto out_free;
@@ -184,7 +185,7 @@
* It will never re-traverse blocks. This means that all inserts should
* be new regions or more granular regions (both allowed by insert).
*/
-static errcode_t ocfs2_extent_map_lookup_read(ocfs2_extent_map *em,
+static errcode_t ocfs2_extent_map_lookup_read(ocfs2_cached_inode *cinode,
uint32_t cpos,
uint32_t clusters,
ocfs2_extent_map_entry **ret_ent)
@@ -192,7 +193,7 @@
errcode_t ret;
ocfs2_extent_map_entry *ent;
char *eb_buf = NULL;
- ocfs2_cached_inode *cinode = em->em_cinode;
+ ocfs2_extent_map *em = cinode->ci_map;
ocfs2_extent_block *eb;
ocfs2_extent_list *el;
@@ -221,7 +222,7 @@
} else
el = &cinode->ci_inode->id2.i_list;
- ret = ocfs2_extent_map_find_leaf(em, cpos, clusters, el);
+ ret = ocfs2_extent_map_find_leaf(cinode, cpos, clusters, el);
if (eb_buf)
ocfs2_free(&eb_buf);
if (ret)
@@ -254,17 +255,19 @@
return 0;
}
-errcode_t ocfs2_extent_map_insert(ocfs2_extent_map *em,
+errcode_t ocfs2_extent_map_insert(ocfs2_cached_inode *cinode,
ocfs2_extent_rec *rec,
int tree_depth)
{
errcode_t ret;
+ ocfs2_extent_map *em = cinode->ci_map;
ocfs2_extent_map_entry *old_ent, *new_ent;
ocfs2_extent_map_entry *left_ent = NULL, *right_ent = NULL;
- /* FIXME: should we cache i_clusters instead of cinode? */
- if ((rec->e_cpos + rec->e_clusters) >
- em->em_cinode->ci_inode->i_clusters)
+ if (!em)
+ return OCFS2_ET_INVALID_ARGUMENT;
+
+ if ((rec->e_cpos + rec->e_clusters) > em->em_clusters)
return OCFS2_ET_INVALID_EXTENT_LOOKUP;
ret = ocfs2_malloc0(sizeof(struct _ocfs2_extent_map_entry),
@@ -369,27 +372,33 @@
* ret = ocfs2_extent_map_get_rec(em, orig_size - 5, &rec);
* rec->e_clusters -= 5;
*/
-errcode_t ocfs2_extent_map_get_rec(ocfs2_extent_map *em,
+errcode_t ocfs2_extent_map_get_rec(ocfs2_cached_inode *cinode,
uint32_t cpos,
ocfs2_extent_rec **rec)
{
- errcode_t ret;
+ errcode_t ret = OCFS2_ET_EXTENT_NOT_FOUND;
+ ocfs2_extent_map *em = cinode->ci_map;
ocfs2_extent_map_entry *ent = NULL;
*rec = NULL;
- if (cpos >= em->em_cinode->ci_inode->i_clusters)
+ if (!em)
+ return OCFS2_ET_INVALID_ARGUMENT;
+
+ if (cpos >= cinode->ci_inode->i_clusters)
return OCFS2_ET_INVALID_EXTENT_LOOKUP;
- ret = ocfs2_extent_map_lookup_read(em, cpos, 1, &ent);
+ ent = ocfs2_extent_map_lookup(em, cpos, 1, NULL, NULL);
- if (!ret)
+ if (ent) {
*rec = &ent->e_rec;
+ ret = 0;
+ }
return ret;
}
-errcode_t ocfs2_extent_map_get_clusters(ocfs2_extent_map *em,
+errcode_t ocfs2_extent_map_get_clusters(ocfs2_cached_inode *cinode,
uint32_t v_cpos, int count,
uint32_t *p_cpos,
int *ret_count)
@@ -397,14 +406,17 @@
errcode_t ret;
uint32_t coff, ccount;
ocfs2_extent_map_entry *ent = NULL;
- ocfs2_filesys *fs = em->em_cinode->ci_fs;
+ ocfs2_filesys *fs = cinode->ci_fs;
*p_cpos = ccount = 0;
- if ((v_cpos + count) > em->em_cinode->ci_inode->i_clusters)
+ if (!cinode->ci_map)
+ return OCFS2_ET_INVALID_ARGUMENT;
+
+ if ((v_cpos + count) > cinode->ci_map->em_clusters)
return OCFS2_ET_INVALID_EXTENT_LOOKUP;
- ret = ocfs2_extent_map_lookup_read(em, v_cpos, count, &ent);
+ ret = ocfs2_extent_map_lookup_read(cinode, v_cpos, count, &ent);
if (ret)
return ret;
@@ -430,27 +442,30 @@
return OCFS2_ET_EXTENT_NOT_FOUND;
}
-errcode_t ocfs2_extent_map_get_blocks(ocfs2_extent_map *em,
+errcode_t ocfs2_extent_map_get_blocks(ocfs2_cached_inode *cinode,
uint64_t v_blkno, int count,
uint64_t *p_blkno, int *ret_count)
{
errcode_t ret;
uint64_t boff;
uint32_t cpos, clusters;
- ocfs2_filesys *fs = em->em_cinode->ci_fs;
+ ocfs2_filesys *fs = cinode->ci_fs;
int bpc = ocfs2_clusters_to_blocks(fs, 1);
ocfs2_extent_map_entry *ent = NULL;
ocfs2_extent_rec *rec;
*p_blkno = 0;
+ if (!cinode->ci_map)
+ return OCFS2_ET_INVALID_ARGUMENT;
+
cpos = ocfs2_blocks_to_clusters(fs, v_blkno);
clusters = ocfs2_blocks_to_clusters(fs,
(uint64_t)count + bpc - 1);
- if ((cpos + clusters) > em->em_cinode->ci_inode->i_clusters)
+ if ((cpos + clusters) > cinode->ci_map->em_clusters)
return OCFS2_ET_INVALID_EXTENT_LOOKUP;
- ret = ocfs2_extent_map_lookup_read(em, cpos, clusters, &ent);
+ ret = ocfs2_extent_map_lookup_read(cinode, cpos, clusters, &ent);
if (ret)
return ret;
@@ -479,22 +494,19 @@
return OCFS2_ET_EXTENT_NOT_FOUND;
}
-errcode_t ocfs2_extent_map_new(ocfs2_filesys *fs,
- ocfs2_cached_inode *cinode,
- ocfs2_extent_map **ret_em)
+errcode_t ocfs2_extent_map_init(ocfs2_filesys *fs,
+ ocfs2_cached_inode *cinode)
{
errcode_t ret;
- ocfs2_extent_map *em;
- ret = ocfs2_malloc0(sizeof(struct _ocfs2_extent_map), &em);
+ ret = ocfs2_malloc0(sizeof(struct _ocfs2_extent_map),
+ &cinode->ci_map);
if (ret)
return ret;
- em->em_cinode = cinode;
- em->em_extents = RB_ROOT;
+ cinode->ci_map->em_clusters = cinode->ci_inode->i_clusters;
+ cinode->ci_map->em_extents = RB_ROOT;
- *ret_em = em;
-
return 0;
}
@@ -504,13 +516,17 @@
* you need to call ocfs2_extent_map_get_rec() and modify the rec
* you are returned.
*/
-errcode_t ocfs2_extent_map_trunc(ocfs2_extent_map *em,
+errcode_t ocfs2_extent_map_trunc(ocfs2_cached_inode *cinode,
uint32_t new_clusters)
{
errcode_t ret = 0;
struct rb_node *node, *next;
+ ocfs2_extent_map *em = cinode->ci_map;
ocfs2_extent_map_entry *ent;
+ if (!em)
+ return OCFS2_ET_INVALID_ARGUMENT;
+
node = rb_last(&em->em_extents);
while (node)
{
@@ -529,10 +545,13 @@
return ret;
}
-void ocfs2_extent_map_free(ocfs2_extent_map *em)
+void ocfs2_extent_map_free(ocfs2_cached_inode *cinode)
{
- ocfs2_extent_map_trunc(em, 0);
- ocfs2_free(&em);
+ if (!cinode->ci_map)
+ return;
+
+ ocfs2_extent_map_trunc(cinode, 0);
+ ocfs2_free(&cinode->ci_map);
}
@@ -552,7 +571,7 @@
ctxt->errcode = OCFS2_ET_CORRUPT_EXTENT_BLOCK;
iret |= OCFS2_EXTENT_ABORT;
} else {
- ret = ocfs2_extent_map_insert(ctxt->cinode->ci_map, rec,
+ ret = ocfs2_extent_map_insert(ctxt->cinode, rec,
tree_depth);
if (ret) {
ctxt->errcode = ret;
@@ -572,7 +591,7 @@
if (!cinode)
return OCFS2_ET_INVALID_ARGUMENT;
- ret = ocfs2_extent_map_new(fs, cinode, &cinode->ci_map);
+ ret = ocfs2_extent_map_init(fs, cinode);
if (ret)
return ret;
@@ -600,13 +619,10 @@
errcode_t ocfs2_drop_extent_map(ocfs2_filesys *fs,
ocfs2_cached_inode *cinode)
{
- ocfs2_extent_map *em;
-
if (!cinode || !cinode->ci_map)
return OCFS2_ET_INVALID_ARGUMENT;
- em = cinode->ci_map;
- ocfs2_extent_map_free(em);
+ ocfs2_extent_map_free(cinode);
cinode->ci_map = NULL;
return 0;
@@ -875,7 +891,7 @@
goto out_free;
}
} else {
- ret = ocfs2_extent_map_new(fs, cinode, &cinode->ci_map);
+ ret = ocfs2_extent_map_init(fs, cinode);
if (ret) {
com_err(argv[0], ret,
"while initializing extent map");
@@ -884,7 +900,7 @@
switch (op) {
case OP_LOOKUP_BLOCK:
- ret = ocfs2_extent_map_get_blocks(cinode->ci_map,
+ ret = ocfs2_extent_map_get_blocks(cinode,
blkoff,
count,
&blkno,
@@ -899,7 +915,7 @@
break;
case OP_LOOKUP_CLUSTER:
- ret = ocfs2_extent_map_get_clusters(cinode->ci_map,
+ ret = ocfs2_extent_map_get_clusters(cinode,
cpos,
count,
&coff,
@@ -914,7 +930,7 @@
break;
case OP_LOOKUP_REC:
- ret = ocfs2_extent_map_get_rec(cinode->ci_map,
+ ret = ocfs2_extent_map_get_rec(cinode,
cpos,
&rec);
if (ret) {
Modified: trunk/libocfs2/include/extent_map.h
===================================================================
--- trunk/libocfs2/include/extent_map.h 2004-10-20 00:44:21 UTC (rev 337)
+++ trunk/libocfs2/include/extent_map.h 2004-10-20 16:46:15 UTC (rev 338)
@@ -32,8 +32,8 @@
typedef struct _ocfs2_extent_map_entry ocfs2_extent_map_entry;
struct _ocfs2_extent_map {
- ocfs2_cached_inode *em_cinode;
struct rb_root em_extents;
+ uint32_t em_clusters;
};
struct _ocfs2_extent_map_entry {
Modified: trunk/libocfs2/include/ocfs2.h
===================================================================
--- trunk/libocfs2/include/ocfs2.h 2004-10-20 00:44:21 UTC (rev 337)
+++ trunk/libocfs2/include/ocfs2.h 2004-10-20 16:46:15 UTC (rev 338)
@@ -246,23 +246,22 @@
errcode_t ocfs2_free_cached_inode(ocfs2_filesys *fs,
ocfs2_cached_inode *cinode);
-errcode_t ocfs2_extent_map_new(ocfs2_filesys *fs,
- ocfs2_cached_inode *cinode,
- ocfs2_extent_map **ret_em);
-void ocfs2_extent_map_free(ocfs2_extent_map *em);
-errcode_t ocfs2_extent_map_insert(ocfs2_extent_map *em,
+errcode_t ocfs2_extent_map_init(ocfs2_filesys *fs,
+ ocfs2_cached_inode *cinode);
+void ocfs2_extent_map_free(ocfs2_cached_inode *cinode);
+errcode_t ocfs2_extent_map_insert(ocfs2_cached_inode *cinode,
ocfs2_extent_rec *rec,
int tree_depth);
-errcode_t ocfs2_extent_map_trunc(ocfs2_extent_map *em,
+errcode_t ocfs2_extent_map_trunc(ocfs2_cached_inode *cinode,
uint32_t new_clusters);
-errcode_t ocfs2_extent_map_get_rec(ocfs2_extent_map *em,
+errcode_t ocfs2_extent_map_get_rec(ocfs2_cached_inode *cinode,
uint32_t cpos,
ocfs2_extent_rec **rec);
-errcode_t ocfs2_extent_map_get_clusters(ocfs2_extent_map *em,
+errcode_t ocfs2_extent_map_get_clusters(ocfs2_cached_inode *cinode,
uint32_t v_cpos, int count,
uint32_t *p_cpos,
int *ret_count);
-errcode_t ocfs2_extent_map_get_blocks(ocfs2_extent_map *em,
+errcode_t ocfs2_extent_map_get_blocks(ocfs2_cached_inode *cinode,
uint64_t v_blkno, int count,
uint64_t *p_blkno,
int *ret_count);
More information about the Ocfs2-tools-commits
mailing list