[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