From: Tao Ma <tao.ma@oracle.com>
To: ocfs2-devel@oss.oracle.com
Subject: [Ocfs2-devel] [PATCH 08/13] ocfs2: Use ocfs2_mv_xattr_buckets() in ocfs2_mv_xattr_bucket_cross_cluster().
Date: Thu, 27 Nov 2008 10:10:38 +0800 [thread overview]
Message-ID: <492E019E.5090308@oracle.com> (raw)
In-Reply-To: <1227744386-10502-9-git-send-email-joel.becker@oracle.com>
Joel Becker wrote:
> Now that ocfs2_mv_xattr_buckets() can move a partial cluster's worth of
> buckets, ocfs2_mv_xattr_bucket_cross_cluster() can use it.
>
> Signed-off-by: Joel Becker <joel.becker@oracle.com>
> ---
> fs/ocfs2/xattr.c | 110 ++++++++++++++---------------------------------------
> 1 files changed, 29 insertions(+), 81 deletions(-)
>
> diff --git a/fs/ocfs2/xattr.c b/fs/ocfs2/xattr.c
> index 652edaf..2c9b673 100644
> --- a/fs/ocfs2/xattr.c
> +++ b/fs/ocfs2/xattr.c
> @@ -170,11 +170,10 @@ static int ocfs2_xattr_set_entry_index_block(struct inode *inode,
>
> static int ocfs2_delete_xattr_index_block(struct inode *inode,
> struct buffer_head *xb_bh);
> -static int ocfs2_cp_xattr_bucket(struct inode *inode,
> - handle_t *handle,
> - u64 s_blkno,
> - u64 t_blkno,
> - int t_is_new);
> +static int ocfs2_mv_xattr_buckets(struct inode *inode, handle_t *handle,
> + u64 src_blk, u64 last_blk, u64 to_blk,
> + unsigned int start_bucket,
> + u32 *first_hash);
>
> static inline u16 ocfs2_xattr_buckets_per_cluster(struct ocfs2_super *osb)
> {
> @@ -3562,115 +3561,64 @@ static int ocfs2_mv_xattr_bucket_cross_cluster(struct inode *inode,
> u32 num_clusters,
> u32 *first_hash)
> {
> - int i, ret, credits;
> + int ret;
> struct ocfs2_super *osb = OCFS2_SB(inode->i_sb);
> int blks_per_bucket = ocfs2_blocks_per_xattr_bucket(inode->i_sb);
> - int bpc = ocfs2_clusters_to_blocks(inode->i_sb, 1);
> int num_buckets = ocfs2_xattr_buckets_per_cluster(osb);
> int to_move = num_buckets / 2;
> - u64 last_cluster_blkno, src_blkno;
> + u64 src_blkno;
> + u64 last_cluster_blkno = prev_blkno +
> + ((num_clusters - 1) * ocfs2_clusters_to_blocks(inode->i_sb, 1));
> struct ocfs2_xattr_header *xh =
> (struct ocfs2_xattr_header *)((*first_bh)->b_data);
> - struct ocfs2_xattr_bucket *old_first, *new_first;
> + struct ocfs2_xattr_bucket *new_target, *new_first;
>
> BUG_ON(le16_to_cpu(xh->xh_num_buckets) < num_buckets);
> BUG_ON(OCFS2_XATTR_BUCKET_SIZE == osb->s_clustersize);
>
> - last_cluster_blkno = prev_blkno + ((num_clusters - 1) * bpc);
> - src_blkno = last_cluster_blkno + (to_move * blks_per_bucket);
> -
> mlog(0, "move half of xattrs in cluster %llu to %llu\n",
> - (unsigned long long)prev_blkno, (unsigned long long)new_blkno);
> + (unsigned long long)last_cluster_blkno, (unsigned long long)new_blkno);
>
> - /* The first bucket of the original extent */
> - old_first = ocfs2_xattr_bucket_new(inode);
> /* The first bucket of the new extent */
> new_first = ocfs2_xattr_bucket_new(inode);
> - if (!old_first || !new_first) {
> + /* The target bucket if it was moved to the new extent */
> + new_target = ocfs2_xattr_bucket_new(inode);
> + if (!new_target || !new_first) {
> ret = -ENOMEM;
> mlog_errno(ret);
> goto out;
> }
>
> - ret = ocfs2_read_xattr_bucket(old_first, prev_blkno);
> + ret = ocfs2_mv_xattr_buckets(inode, handle, prev_blkno,
> + last_cluster_blkno, new_blkno,
> + to_move, first_hash);
> if (ret) {
> mlog_errno(ret);
> goto out;
> }
>
> - /*
> - * We need to update the 1st half of the new extent, and we
> - * need to update the first bucket of the old extent.
> - */
> - credits = ((to_move + 1) * blks_per_bucket) + handle->h_buffer_credits;
> - ret = ocfs2_extend_trans(handle, credits);
> - if (ret) {
> - mlog_errno(ret);
> - goto out;
> - }
> -
> - ret = ocfs2_xattr_bucket_journal_access(handle, old_first,
> - OCFS2_JOURNAL_ACCESS_WRITE);
> - if (ret) {
> - mlog_errno(ret);
> - goto out;
> - }
> -
> - for (i = 0; i < to_move; i++) {
> - ret = ocfs2_cp_xattr_bucket(inode, handle,
> - src_blkno + (i * blks_per_bucket),
> - new_blkno + (i * blks_per_bucket),
> - 1);
> - if (ret) {
> - mlog_errno(ret);
> - goto out;
> - }
> - }
> -
> - /*
> - * Get the new bucket ready before we dirty anything
> - * (This actually shouldn't fail, because we already dirtied
> - * it once in ocfs2_cp_xattr_bucket()).
> - */
> - ret = ocfs2_read_xattr_bucket(new_first, new_blkno);
> - if (ret) {
> - mlog_errno(ret);
> - goto out;
> - }
> - ret = ocfs2_xattr_bucket_journal_access(handle, new_first,
> - OCFS2_JOURNAL_ACCESS_WRITE);
> - if (ret) {
> - mlog_errno(ret);
> - goto out;
> - }
> -
> - /* Now update the headers */
> - le16_add_cpu(&bucket_xh(old_first)->xh_num_buckets, -to_move);
> - ocfs2_xattr_bucket_journal_dirty(handle, old_first);
> -
> - bucket_xh(new_first)->xh_num_buckets = cpu_to_le16(to_move);
> - ocfs2_xattr_bucket_journal_dirty(handle, new_first);
> -
> - if (first_hash)
> - *first_hash = le32_to_cpu(bucket_xh(new_first)->xh_entries[0].xe_name_hash);
> + /* This is the first bucket that got moved */
> + src_blkno = last_cluster_blkno + (to_move * blks_per_bucket);
>
> /*
> - * If the target bucket is anywhere past src_blkno, we moved
> - * it to the new extent. We need to update first_bh and header_bh.
> + * If the target bucket was part of the moved buckets, we need to
> + * update first_bh and header_bh.
> */
> if ((*header_bh)->b_blocknr >= src_blkno) {
> - /* We're done with old_first, so we can re-use it. */
> - ocfs2_xattr_bucket_relse(old_first);
> -
> /* Find the block for the new target bucket */
> src_blkno = new_blkno +
> ((*header_bh)->b_blocknr - src_blkno);
>
> /*
> - * This shouldn't fail - the buffers are in the
> + * These shouldn't fail - the buffers are in the
> * journal from ocfs2_cp_xattr_bucket().
> */
> - ret = ocfs2_read_xattr_bucket(old_first, src_blkno);
> + ret = ocfs2_read_xattr_bucket(new_first, src_blkno);
> + if (ret) {
> + mlog_errno(ret);
> + goto out;
> + }
here should read new_blkno since "new_first" means the first bucket of
the new cluster(I guess that from the code you removed).
Regards,
Tao
next prev parent reply other threads:[~2008-11-27 2:10 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-11-27 0:06 [Ocfs2-devel] [PATCH 0/13] More xattr bucket consolidation Joel Becker
2008-11-27 0:06 ` [Ocfs2-devel] [PATCH 01/13] ocfs2: Dirty the entire bucket in ocfs2_bucket_value_truncate() Joel Becker
2008-11-27 1:23 ` Tao Ma
2008-11-27 3:01 ` Joel Becker
2008-12-11 18:39 ` Joel Becker
2008-11-27 0:06 ` [Ocfs2-devel] [PATCH 02/13] ocfs2: Dirty the entire first bucket in ocfs2_extend_xattr_bucket() Joel Becker
2008-11-27 0:06 ` [Ocfs2-devel] [PATCH 03/13] ocfs2: Dirty the entire first bucket in ocfs2_cp_xattr_cluster() Joel Becker
2008-11-27 0:06 ` [Ocfs2-devel] [PATCH 04/13] ocfs2: Explain t_is_new " Joel Becker
2008-11-27 0:06 ` [Ocfs2-devel] [PATCH 05/13] ocfs2: Use ocfs2_cp_xattr_bucket() in ocfs2_mv_xattr_bucket_cross_cluster() Joel Becker
2008-11-27 0:06 ` [Ocfs2-devel] [PATCH 06/13] ocfs2: Rename ocfs2_cp_xattr_cluster() to ocfs2_mv_xattr_buckets() Joel Becker
2008-11-27 0:06 ` [Ocfs2-devel] [PATCH 07/13] ocfs2: ocfs2_mv_xattr_buckets() can handle a partial cluster now Joel Becker
2008-11-27 0:06 ` [Ocfs2-devel] [PATCH 08/13] ocfs2: Use ocfs2_mv_xattr_buckets() in ocfs2_mv_xattr_bucket_cross_cluster() Joel Becker
2008-11-27 2:10 ` Tao Ma [this message]
2008-11-27 3:03 ` Joel Becker
2008-11-27 0:06 ` [Ocfs2-devel] [PATCH 09/13] ocfs2: Start using buckets in ocfs2_adjust_xattr_cross_cluster() Joel Becker
2008-11-27 2:16 ` Tao Ma
2008-11-27 3:04 ` Joel Becker
2008-11-27 0:06 ` [Ocfs2-devel] [PATCH 10/13] ocfs2: Pass buckets into ocfs2_mv_xattr_bucket_cross_cluster() Joel Becker
2008-11-27 0:06 ` [Ocfs2-devel] [PATCH 11/13] ocfs2: Move buckets up into ocfs2_add_new_xattr_cluster() Joel Becker
2008-11-27 0:06 ` [Ocfs2-devel] [PATCH 12/13] ocfs2: Move buckets up into ocfs2_add_new_xattr_bucket() Joel Becker
2008-12-11 2:13 ` Joel Becker
2008-11-27 0:06 ` [Ocfs2-devel] [PATCH 13/13] ocfs2: Pass xs->bucket " Joel Becker
2008-11-27 2:39 ` Tao Ma
2008-11-27 3:05 ` Joel Becker
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=492E019E.5090308@oracle.com \
--to=tao.ma@oracle.com \
--cc=ocfs2-devel@oss.oracle.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.