ocfs2: Create an xattr indexed block if needed.
authorTao Ma <tao.ma@oracle.com>
Tue, 18 Aug 2009 03:43:52 +0000 (11:43 +0800)
committerJoel Becker <joel.becker@oracle.com>
Wed, 23 Sep 2009 03:09:44 +0000 (20:09 -0700)
With reflink, there is a need that we create a new xattr indexed
block from the very beginning. So add a new parameter for
ocfs2_create_xattr_block.

Signed-off-by: Tao Ma <tao.ma@oracle.com>
fs/ocfs2/xattr.c

index 6660f1c..bb92a6d 100644 (file)
@@ -2142,7 +2142,8 @@ static int ocfs2_create_xattr_block(handle_t *handle,
                                    struct inode *inode,
                                    struct buffer_head *inode_bh,
                                    struct ocfs2_alloc_context *meta_ac,
-                                   struct buffer_head **ret_bh)
+                                   struct buffer_head **ret_bh,
+                                   int indexed)
 {
        int ret;
        u16 suballoc_bit_start;
@@ -2188,6 +2189,17 @@ static int ocfs2_create_xattr_block(handle_t *handle,
        xblk->xb_fs_generation = cpu_to_le32(osb->fs_generation);
        xblk->xb_blkno = cpu_to_le64(first_blkno);
 
+       if (indexed) {
+               struct ocfs2_xattr_tree_root *xr = &xblk->xb_attrs.xb_root;
+               xr->xt_clusters = cpu_to_le32(1);
+               xr->xt_last_eb_blk = 0;
+               xr->xt_list.l_tree_depth = 0;
+               xr->xt_list.l_count = cpu_to_le16(
+                                       ocfs2_xattr_recs_per_xb(inode->i_sb));
+               xr->xt_list.l_next_free_rec = cpu_to_le16(1);
+               xblk->xb_flags = cpu_to_le16(OCFS2_XATTR_INDEXED);
+       }
+
        ret = ocfs2_journal_dirty(handle, new_bh);
        if (ret < 0) {
                mlog_errno(ret);
@@ -2222,7 +2234,7 @@ static int ocfs2_xattr_block_set(struct inode *inode,
 
        if (!xs->xattr_bh) {
                ret = ocfs2_create_xattr_block(handle, inode, xs->inode_bh,
-                                              ctxt->meta_ac, &new_bh);
+                                              ctxt->meta_ac, &new_bh, 0);
                if (ret) {
                        mlog_errno(ret);
                        goto end;