ocfs2: Start using buckets in ocfs2_adjust_xattr_cross_cluster().
authorJoel Becker <joel.becker@oracle.com>
Wed, 26 Nov 2008 22:12:09 +0000 (14:12 -0800)
committerMark Fasheh <mfasheh@suse.com>
Mon, 5 Jan 2009 16:40:30 +0000 (08:40 -0800)
We want to be passing around buckets instead of buffer_heads.  Let's get
them into ocfs2_adjust_xattr_cross_cluster.

Signed-off-by: Joel Becker <joel.becker@oracle.com>
Signed-off-by: Mark Fasheh <mfasheh@suse.com>
fs/ocfs2/xattr.c

index c318928..975ba36 100644 (file)
@@ -4111,28 +4111,54 @@ static int ocfs2_adjust_xattr_cross_cluster(struct inode *inode,
                                            u32 *v_start,
                                            int *extend)
 {
-       int ret = 0;
-       int bpc = ocfs2_clusters_to_blocks(inode->i_sb, 1);
+       int ret;
+       struct ocfs2_xattr_bucket *first, *target;
 
        mlog(0, "adjust xattrs from cluster %llu len %u to %llu\n",
             (unsigned long long)prev_blk, prev_clusters,
             (unsigned long long)new_blk);
 
+       /* The first bucket of the original extent */
+       first = ocfs2_xattr_bucket_new(inode);
+       /* The target bucket for insert */
+       target = ocfs2_xattr_bucket_new(inode);
+       if (!first || !target) {
+               ret = -ENOMEM;
+               mlog_errno(ret);
+               goto out;
+       }
+
+       BUG_ON(prev_blk != (*first_bh)->b_blocknr);
+       ret = ocfs2_read_xattr_bucket(first, prev_blk);
+       if (ret) {
+               mlog_errno(ret);
+               goto out;
+       }
+
+       ret = ocfs2_read_xattr_bucket(target, (*header_bh)->b_blocknr);
+       if (ret) {
+               mlog_errno(ret);
+               goto out;
+       }
+
        if (ocfs2_xattr_buckets_per_cluster(OCFS2_SB(inode->i_sb)) > 1)
                ret = ocfs2_mv_xattr_bucket_cross_cluster(inode,
                                                          handle,
                                                          first_bh,
                                                          header_bh,
                                                          new_blk,
-                                                         prev_blk,
+                                                         bucket_blkno(first),
                                                          prev_clusters,
                                                          v_start);
        else {
-               u64 last_blk = prev_blk + bpc * (prev_clusters - 1);
+               /* The start of the last cluster in the first extent */
+               u64 last_blk = bucket_blkno(first) +
+                       ((prev_clusters - 1) *
+                        ocfs2_clusters_to_blocks(inode->i_sb, 1));
 
-               if (prev_clusters > 1 && (*header_bh)->b_blocknr != last_blk)
+               if (prev_clusters > 1 && bucket_blkno(target) != last_blk)
                        ret = ocfs2_mv_xattr_buckets(inode, handle,
-                                                    (*first_bh)->b_blocknr,
+                                                    bucket_blkno(first),
                                                     last_blk, new_blk, 0,
                                                     v_start);
                else {
@@ -4140,11 +4166,15 @@ static int ocfs2_adjust_xattr_cross_cluster(struct inode *inode,
                                                         last_blk, new_blk,
                                                         v_start);
 
-                       if ((*header_bh)->b_blocknr == last_blk && extend)
+                       if ((bucket_blkno(target) == last_blk) && extend)
                                *extend = 0;
                }
        }
 
+out:
+       ocfs2_xattr_bucket_free(first);
+       ocfs2_xattr_bucket_free(target);
+
        return ret;
 }