[Ocfs2-tools-devel] [PATCH 21/50] libocfs2: Add xattr value tree type.

Tao Ma tao.ma at oracle.com
Mon Jan 11 07:31:07 PST 2010


From: Tiger Yang <tiger.yang at oracle.com>

This patch adds xattr value extent tree type.

Note from Tao Ma:
The original form is from
http://oss.oracle.com/pipermail/ocfs2-tools-devel/2009-October/002279.html.
I just copied the value tree here and I also changed the
prototype for value_tree init. We have to pass xattr write
function to the tree since the xattr value can be in inode,
block or bucket.

Signed-off-by: Tiger Yang <tiger.yang at oracle.com>
Signed-off-by: Tao Ma <tao.ma at oracle.com>
---
 libocfs2/extent_tree.c |   56 ++++++++++++++++++++++++++++++++++++++++++++++++
 libocfs2/extent_tree.h |    5 ++++
 2 files changed, 61 insertions(+), 0 deletions(-)

diff --git a/libocfs2/extent_tree.c b/libocfs2/extent_tree.c
index acc74e7..fe1be7a 100644
--- a/libocfs2/extent_tree.c
+++ b/libocfs2/extent_tree.c
@@ -108,6 +108,51 @@ static struct ocfs2_extent_tree_operations ocfs2_refcount_tree_et_ops = {
 	.eo_extent_contig	= ocfs2_refcount_tree_extent_contig,
 };
 
+static void ocfs2_xattr_value_fill_root_el(struct ocfs2_extent_tree *et)
+{
+	struct ocfs2_xattr_value_root *xv = et->et_object;
+
+	et->et_root_el = &xv->xr_list;
+}
+
+static void ocfs2_xattr_value_set_last_eb_blk(struct ocfs2_extent_tree *et,
+					      uint64_t blkno)
+{
+	struct ocfs2_xattr_value_root *xv = et->et_object;
+
+	xv->xr_last_eb_blk = blkno;
+}
+
+static uint64_t ocfs2_xattr_value_get_last_eb_blk(struct ocfs2_extent_tree *et)
+{
+	struct ocfs2_xattr_value_root *xv = et->et_object;
+
+	return xv->xr_last_eb_blk;
+}
+
+static void ocfs2_xattr_value_update_clusters(struct ocfs2_extent_tree *et,
+					      uint32_t clusters)
+{
+	struct ocfs2_xattr_value_root *xv = et->et_object;
+
+	xv->xr_clusters += clusters;
+}
+
+static uint32_t ocfs2_xattr_value_get_clusters(struct ocfs2_extent_tree *et)
+{
+	struct ocfs2_xattr_value_root *xv = et->et_object;
+
+	return xv->xr_clusters;
+}
+
+static struct ocfs2_extent_tree_operations ocfs2_xattr_value_et_ops = {
+	.eo_set_last_eb_blk	= ocfs2_xattr_value_set_last_eb_blk,
+	.eo_get_last_eb_blk	= ocfs2_xattr_value_get_last_eb_blk,
+	.eo_update_clusters	= ocfs2_xattr_value_update_clusters,
+	.eo_get_clusters	= ocfs2_xattr_value_get_clusters,
+	.eo_fill_root_el	= ocfs2_xattr_value_fill_root_el,
+};
+
 static void __ocfs2_init_extent_tree(struct ocfs2_extent_tree *et,
 				     ocfs2_filesys *fs,
 				     char *buf,
@@ -146,6 +191,17 @@ void ocfs2_init_refcount_extent_tree(struct ocfs2_extent_tree *et,
 				 ocfs2_write_refcount_block,
 				 buf, &ocfs2_refcount_tree_et_ops);
 }
+
+void ocfs2_init_xattr_value_extent_tree(struct ocfs2_extent_tree *et,
+					ocfs2_filesys *fs,
+					char *buf, uint64_t blkno,
+					ocfs2_root_write_func write,
+					struct ocfs2_xattr_value_root *xv)
+{
+	__ocfs2_init_extent_tree(et, fs, buf, blkno, write,
+				 xv, &ocfs2_xattr_value_et_ops);
+}
+
 static inline void ocfs2_et_set_last_eb_blk(struct ocfs2_extent_tree *et,
 					    uint64_t new_last_eb_blk)
 {
diff --git a/libocfs2/extent_tree.h b/libocfs2/extent_tree.h
index 7ee789f..b7513dd 100644
--- a/libocfs2/extent_tree.h
+++ b/libocfs2/extent_tree.h
@@ -118,6 +118,11 @@ void ocfs2_init_dinode_extent_tree(struct ocfs2_extent_tree *et,
 void ocfs2_init_refcount_extent_tree(struct ocfs2_extent_tree *et,
 				     ocfs2_filesys *fs,
 				     char *buf, uint64_t blkno);
+void ocfs2_init_xattr_value_extent_tree(struct ocfs2_extent_tree *et,
+					ocfs2_filesys *fs,
+					char *buf, uint64_t blkno,
+					ocfs2_root_write_func write,
+					struct ocfs2_xattr_value_root *xv);
 errcode_t ocfs2_tree_insert_extent(ocfs2_filesys *fs,
 				   struct ocfs2_extent_tree *et,
 				   uint32_t cpos, uint64_t c_blkno,
-- 
1.5.5




More information about the Ocfs2-tools-devel mailing list