[Ocfs2-tools-commits] jlbec commits r340 - in trunk/libocfs2: .
include
svn-commits at oss.oracle.com
svn-commits at oss.oracle.com
Wed Oct 20 12:02:43 CDT 2004
Author: jlbec
Date: 2004-10-20 12:02:41 -0500 (Wed, 20 Oct 2004)
New Revision: 340
Modified:
trunk/libocfs2/extent_map.c
trunk/libocfs2/include/ocfs2.h
Log:
move the kernel trunc/drop extent_map API in
Modified: trunk/libocfs2/extent_map.c
===================================================================
--- trunk/libocfs2/extent_map.c 2004-10-20 16:50:20 UTC (rev 339)
+++ trunk/libocfs2/extent_map.c 2004-10-20 17:02:41 UTC (rev 340)
@@ -510,47 +510,12 @@
return 0;
}
-/*
- * Truncate all entries past new_clusters.
- * If you want to also clip the last extent by some number of clusters,
- * you need to call ocfs2_extent_map_get_rec() and modify the rec
- * you are returned.
- */
-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)
- {
- next = rb_prev(node);
-
- ent = rb_entry(node, ocfs2_extent_map_entry, e_node);
- if (ent->e_rec.e_cpos < new_clusters)
- break;
-
- rb_erase(&ent->e_node, &em->em_extents);
- ocfs2_free(&ent);
-
- node = next;
- }
-
- return ret;
-}
-
void ocfs2_extent_map_free(ocfs2_cached_inode *cinode)
{
if (!cinode->ci_map)
return;
- ocfs2_extent_map_trunc(cinode, 0);
+ ocfs2_extent_map_drop(cinode, 0);
ocfs2_free(&cinode->ci_map);
}
@@ -628,6 +593,120 @@
return 0;
}
+static void __ocfs2_extent_map_drop(ocfs2_cached_inode *cinode,
+ uint32_t new_clusters,
+ struct rb_node **free_head,
+ ocfs2_extent_map_entry **tail_ent)
+{
+ struct rb_node *node, *next;
+ ocfs2_extent_map *em = cinode->ci_map;
+ ocfs2_extent_map_entry *ent;
+
+ *free_head = NULL;
+
+ ent = NULL;
+ node = rb_last(&em->em_extents);
+ while (node)
+ {
+ next = rb_prev(node);
+
+ ent = rb_entry(node, ocfs2_extent_map_entry,
+ e_node);
+ if (ent->e_rec.e_cpos < new_clusters)
+ break;
+
+ rb_erase(&ent->e_node, &em->em_extents);
+
+ node->rb_right = *free_head;
+ *free_head = node;
+
+ ent = NULL;
+ node = next;
+ }
+
+ /* Do we have an entry straddling new_clusters? */
+ if (tail_ent) {
+ if (ent &&
+ ((ent->e_rec.e_cpos + ent->e_rec.e_clusters) >
+ new_clusters))
+ *tail_ent = ent;
+ else
+ *tail_ent = NULL;
+ }
+
+ return;
+}
+
+static void __ocfs2_extent_map_drop_cleanup(struct rb_node *free_head)
+{
+ struct rb_node *node;
+ ocfs2_extent_map_entry *ent;
+
+ while (free_head) {
+ node = free_head;
+ free_head = node->rb_right;
+
+ ent = rb_entry(node, ocfs2_extent_map_entry,
+ e_node);
+ ocfs2_free(&ent);
+ }
+}
+
+
+/*
+ * Remove all entries past new_clusters, inclusive of an entry that
+ * contains new_clusters. This is effectively a cache forget.
+ *
+ * If you want to also clip the last extent by some number of clusters,
+ * you need to call ocfs2_extent_map_trunc().
+ */
+errcode_t ocfs2_extent_map_drop(ocfs2_cached_inode *cinode,
+ uint32_t new_clusters)
+{
+ struct rb_node *free_head = NULL;
+ ocfs2_extent_map *em = cinode->ci_map;
+ ocfs2_extent_map_entry *ent;
+
+ if (!em)
+ return OCFS2_ET_INVALID_ARGUMENT;
+
+ __ocfs2_extent_map_drop(cinode, new_clusters, &free_head, &ent);
+
+ if (ent) {
+ rb_erase(&ent->e_node, &em->em_extents);
+ ent->e_node.rb_right = free_head;
+ free_head = &ent->e_node;
+ }
+
+ if (free_head)
+ __ocfs2_extent_map_drop_cleanup(free_head);
+
+ return 0;
+}
+
+/*
+ * Remove all entries past new_clusters and also clip any extent
+ * straddling new_clusters, if there is one.
+ */
+errcode_t ocfs2_extent_map_trunc(ocfs2_cached_inode *cinode,
+ uint32_t new_clusters)
+{
+ struct rb_node *free_head = NULL;
+ ocfs2_extent_map_entry *ent = NULL;
+
+ __ocfs2_extent_map_drop(cinode, new_clusters, &free_head, &ent);
+
+ if (ent)
+ ent->e_rec.e_clusters =
+ new_clusters - ent->e_rec.e_cpos;
+
+ if (free_head)
+ __ocfs2_extent_map_drop_cleanup(free_head);
+
+ return 0;
+}
+
+
#ifdef DEBUG_EXE
#include <stdlib.h>
#include <getopt.h>
Modified: trunk/libocfs2/include/ocfs2.h
===================================================================
--- trunk/libocfs2/include/ocfs2.h 2004-10-20 16:50:20 UTC (rev 339)
+++ trunk/libocfs2/include/ocfs2.h 2004-10-20 17:02:41 UTC (rev 340)
@@ -252,6 +252,8 @@
errcode_t ocfs2_extent_map_insert(ocfs2_cached_inode *cinode,
ocfs2_extent_rec *rec,
int tree_depth);
+errcode_t ocfs2_extent_map_drop(ocfs2_cached_inode *cinode,
+ uint32_t new_clusters);
errcode_t ocfs2_extent_map_trunc(ocfs2_cached_inode *cinode,
uint32_t new_clusters);
errcode_t ocfs2_extent_map_get_rec(ocfs2_cached_inode *cinode,
More information about the Ocfs2-tools-commits
mailing list