mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Mark Fasheh <mfasheh@suse.com>
To: linux-kernel@vger.kernel.org
Cc: ocfs2-devel@oss.oracle.com, Joel Becker <joel.becker@oracle.com>,
	Mark Fasheh <mfasheh@suse.com>
Subject: [PATCH 42/56] ocfs2: Dirty the entire bucket in ocfs2_bucket_value_truncate()
Date: Mon, 22 Dec 2008 13:48:23 -0800	[thread overview]
Message-ID: <1229982517-3455-43-git-send-email-mfasheh@suse.com> (raw)
In-Reply-To: <1229982517-3455-1-git-send-email-mfasheh@suse.com>

From: Joel Becker <joel.becker@oracle.com>

ocfs2_bucket_value_truncate() currently takes the first bh of the
bucket, and magically plays around with the value bh - even though
the bucket structure in the calling function already has it.

In addition, future code wants to always dirty the entire bucket when it
is changed.  So let's pass the entire bucket into this function, skip
any block reads (we have them), and add the access/dirty logic.

ocfs2_xattr_update_value_size() is no longer necessary, as it only did
one thing other than journal access/dirty.

Signed-off-by: Joel Becker <joel.becker@oracle.com>
Signed-off-by: Mark Fasheh <mfasheh@suse.com>
---
 fs/ocfs2/xattr.c |   74 ++++++++++++++++++++---------------------------------
 1 files changed, 28 insertions(+), 46 deletions(-)

diff --git a/fs/ocfs2/xattr.c b/fs/ocfs2/xattr.c
index 3b9634c..6db68a2 100644
--- a/fs/ocfs2/xattr.c
+++ b/fs/ocfs2/xattr.c
@@ -4580,31 +4580,6 @@ out:
 	return ret;
 }
 
-static int ocfs2_xattr_value_update_size(struct inode *inode,
-					 handle_t *handle,
-					 struct buffer_head *xe_bh,
-					 struct ocfs2_xattr_entry *xe,
-					 u64 new_size)
-{
-	int ret;
-
-	ret = ocfs2_journal_access(handle, inode, xe_bh,
-				   OCFS2_JOURNAL_ACCESS_WRITE);
-	if (ret < 0) {
-		mlog_errno(ret);
-		goto out;
-	}
-
-	xe->xe_value_size = cpu_to_le64(new_size);
-
-	ret = ocfs2_journal_dirty(handle, xe_bh);
-	if (ret < 0)
-		mlog_errno(ret);
-
-out:
-	return ret;
-}
-
 /*
  * Truncate the specified xe_off entry in xattr bucket.
  * bucket is indicated by header_bh and len is the new length.
@@ -4613,7 +4588,7 @@ out:
  * Copy the new updated xe and xe_value_root to new_xe and new_xv if needed.
  */
 static int ocfs2_xattr_bucket_value_truncate(struct inode *inode,
-					     struct buffer_head *header_bh,
+					     struct ocfs2_xattr_bucket *bucket,
 					     int xe_off,
 					     int len,
 					     struct ocfs2_xattr_set_ctxt *ctxt)
@@ -4623,8 +4598,7 @@ static int ocfs2_xattr_bucket_value_truncate(struct inode *inode,
 	struct buffer_head *value_bh = NULL;
 	struct ocfs2_xattr_value_root *xv;
 	struct ocfs2_xattr_entry *xe;
-	struct ocfs2_xattr_header *xh =
-			(struct ocfs2_xattr_header *)header_bh->b_data;
+	struct ocfs2_xattr_header *xh = bucket_xh(bucket);
 	size_t blocksize = inode->i_sb->s_blocksize;
 
 	xe = &xh->xh_entries[xe_off];
@@ -4638,34 +4612,41 @@ static int ocfs2_xattr_bucket_value_truncate(struct inode *inode,
 
 	/* We don't allow ocfs2_xattr_value to be stored in different block. */
 	BUG_ON(value_blk != (offset + OCFS2_XATTR_ROOT_SIZE - 1) / blocksize);
-	value_blk += header_bh->b_blocknr;
 
-	ret = ocfs2_read_block(inode, value_blk, &value_bh, NULL);
-	if (ret) {
-		mlog_errno(ret);
-		goto out;
-	}
+	value_bh = bucket->bu_bhs[value_blk];
+	BUG_ON(!value_bh);
 
 	xv = (struct ocfs2_xattr_value_root *)
 		(value_bh->b_data + offset % blocksize);
 
-	mlog(0, "truncate %u in xattr bucket %llu to %d bytes.\n",
-	     xe_off, (unsigned long long)header_bh->b_blocknr, len);
-	ret = ocfs2_xattr_value_truncate(inode, value_bh, xv, len, ctxt);
+	ret = ocfs2_xattr_bucket_journal_access(ctxt->handle, bucket,
+						OCFS2_JOURNAL_ACCESS_WRITE);
 	if (ret) {
 		mlog_errno(ret);
 		goto out;
 	}
 
-	ret = ocfs2_xattr_value_update_size(inode, ctxt->handle,
-					    header_bh, xe, len);
+	/*
+	 * From here on out we have to dirty the bucket.  The generic
+	 * value calls only modify one of the bucket's bhs, but we need
+	 * to send the bucket at once.  So if they error, they *could* have
+	 * modified something.  We have to assume they did, and dirty
+	 * the whole bucket.  This leaves us in a consistent state.
+	 */
+	mlog(0, "truncate %u in xattr bucket %llu to %d bytes.\n",
+	     xe_off, (unsigned long long)bucket_blkno(bucket), len);
+	ret = ocfs2_xattr_value_truncate(inode, value_bh, xv, len, ctxt);
 	if (ret) {
 		mlog_errno(ret);
-		goto out;
+		goto out_dirty;
 	}
 
+	xe->xe_value_size = cpu_to_le64(len);
+
+out_dirty:
+	ocfs2_xattr_bucket_journal_dirty(ctxt->handle, bucket);
+
 out:
-	brelse(value_bh);
 	return ret;
 }
 
@@ -4681,7 +4662,7 @@ static int ocfs2_xattr_bucket_value_truncate_xs(struct inode *inode,
 	BUG_ON(!xs->bucket->bu_bhs[0] || !xe || ocfs2_xattr_is_local(xe));
 
 	offset = xe - xh->xh_entries;
-	ret = ocfs2_xattr_bucket_value_truncate(inode, xs->bucket->bu_bhs[0],
+	ret = ocfs2_xattr_bucket_value_truncate(inode, xs->bucket,
 						offset, len, ctxt);
 	if (ret)
 		mlog_errno(ret);
@@ -5107,11 +5088,13 @@ static int ocfs2_delete_xattr_in_bucket(struct inode *inode,
 	struct ocfs2_xattr_entry *xe;
 	struct ocfs2_super *osb = OCFS2_SB(inode->i_sb);
 	struct ocfs2_xattr_set_ctxt ctxt = {NULL, NULL,};
+	int credits = ocfs2_remove_extent_credits(osb->sb) +
+		ocfs2_blocks_per_xattr_bucket(inode->i_sb);
+
 
 	ocfs2_init_dealloc_ctxt(&ctxt.dealloc);
 
-	ctxt.handle = ocfs2_start_trans(osb,
-					ocfs2_remove_extent_credits(osb->sb));
+	ctxt.handle = ocfs2_start_trans(osb, credits);
 	if (IS_ERR(ctxt.handle)) {
 		ret = PTR_ERR(ctxt.handle);
 		mlog_errno(ret);
@@ -5123,8 +5106,7 @@ static int ocfs2_delete_xattr_in_bucket(struct inode *inode,
 		if (ocfs2_xattr_is_local(xe))
 			continue;
 
-		ret = ocfs2_xattr_bucket_value_truncate(inode,
-							bucket->bu_bhs[0],
+		ret = ocfs2_xattr_bucket_value_truncate(inode, bucket,
 							i, 0, &ctxt);
 		if (ret) {
 			mlog_errno(ret);
-- 
1.5.6


  parent reply	other threads:[~2008-12-22 22:04 UTC|newest]

Thread overview: 66+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-12-22 21:47 [git patches] Ocfs2 patches for merge window, batch 2/3 Mark Fasheh
2008-12-22 21:47 ` [PATCH 01/56] quota: Add callbacks for allocating and destroying dquot structures Mark Fasheh
2008-12-22 21:47 ` [PATCH 02/56] quota: Increase size of variables for limits and inode usage Mark Fasheh
2008-12-22 21:47 ` [PATCH 03/56] quota: Remove bogus 'optimization' in check_idq() and check_bdq() Mark Fasheh
2008-12-22 21:47 ` [PATCH 04/56] quota: Make _SUSPENDED just a flag Mark Fasheh
2008-12-22 21:47 ` [PATCH 05/56] quota: Allow to separately enable quota accounting and enforcing limits Mark Fasheh
2008-12-22 21:47 ` [PATCH 06/56] ext3: Use sb_any_quota_loaded() instead of sb_any_quota_enabled() Mark Fasheh
2008-12-22 21:47 ` [PATCH 07/56] ext4: " Mark Fasheh
2008-12-22 21:47 ` [PATCH 08/56] reiserfs: " Mark Fasheh
2008-12-22 21:47 ` [PATCH 09/56] quota: Remove compatibility function sb_any_quota_enabled() Mark Fasheh
2008-12-22 21:47 ` [PATCH 10/56] quota: Introduce DQUOT_QUOTA_SYS_FILE flag Mark Fasheh
2008-12-22 21:47 ` [PATCH 11/56] quota: Move quotaio_v[12].h from include/linux/ to fs/ Mark Fasheh
2008-12-22 21:47 ` [PATCH 12/56] quota: Split off quota tree handling into a separate file Mark Fasheh
2008-12-22 21:47 ` [PATCH 13/56] quota: Convert union in mem_dqinfo to a pointer Mark Fasheh
2008-12-22 21:47 ` [PATCH 14/56] quota: Allow negative usage of space and inodes Mark Fasheh
2008-12-22 21:47 ` [PATCH 15/56] quota: Keep which entries were set by SETQUOTA quotactl Mark Fasheh
2008-12-22 21:47 ` [PATCH 16/56] quota: Update version number Mark Fasheh
2008-12-22 21:47 ` [PATCH 17/56] quota: Add helpers to allow ocfs2 specific quota initialization, freeing and recovery Mark Fasheh
2008-12-22 21:47 ` [PATCH 18/56] quota: Implement function for scanning active dquots Mark Fasheh
2008-12-22 21:48 ` [PATCH 19/56] mm: Export pdflush_operation() Mark Fasheh
2008-12-23  0:01   ` Andrew Morton
2008-12-25  1:05     ` Mark Fasheh
2008-12-31 19:28       ` Mark Fasheh
2008-12-31 22:17         ` Joel Becker
2008-12-31 23:09           ` [Ocfs2-devel] " Mark Fasheh
2009-01-05 13:27             ` Jan Kara
2008-12-22 21:48 ` [PATCH 20/56] ocfs2: Support nested transactions Mark Fasheh
2008-12-22 21:48 ` [PATCH 21/56] ocfs2: Assign feature bits and system inodes to quota feature and quota files Mark Fasheh
2008-12-22 21:48 ` [PATCH 22/56] ocfs2: Mark system files as not subject to quota accounting Mark Fasheh
2008-12-22 21:48 ` [PATCH 23/56] ocfs2: Implementation of local and global quota file handling Mark Fasheh
2008-12-23  0:11   ` Andrew Morton
2008-12-25  0:29     ` Mark Fasheh
2008-12-26  2:29       ` Andrew Morton
2008-12-22 21:48 ` [PATCH 24/56] ocfs2: Add quota calls for allocation and freeing of inodes and space Mark Fasheh
2008-12-22 21:48 ` [PATCH 25/56] ocfs2: Implement quota syncing thread Mark Fasheh
2008-12-22 21:48 ` [PATCH 26/56] ocfs2: Implement quota recovery Mark Fasheh
2008-12-22 21:48 ` [PATCH 27/56] ocfs2: Enable quota accounting on mount, disable on umount Mark Fasheh
2008-12-22 21:48 ` [PATCH 28/56] jbd2: Add BH_JBDPrivateStart Mark Fasheh
2008-12-22 21:48 ` [PATCH 29/56] ocfs2: Use BH_JBDPrivateStart instead of BH_Unshadow Mark Fasheh
2008-12-22 21:48 ` [PATCH 30/56] ocfs2: Add missing initialization Mark Fasheh
2008-12-22 21:48 ` [PATCH 31/56] ocfs2: Fix ocfs2_read_quota_block() error handling Mark Fasheh
2008-12-22 21:48 ` [PATCH 32/56] ocfs2: Fix oops when extending quota files Mark Fasheh
2008-12-22 21:48 ` [PATCH 33/56] ocfs2: Make ocfs2_get_quota_block() consistent with ocfs2_read_quota_block() Mark Fasheh
2008-12-22 21:48 ` [PATCH 34/56] ocfs2: Fix build warnings (64-bit types vs long long) Mark Fasheh
2008-12-22 21:48 ` [PATCH 35/56] quota: Unexport dqblk_v1.h and dqblk_v2.h Mark Fasheh
2008-12-22 21:48 ` [PATCH 36/56] quota: Export dquot_alloc() and dquot_destroy() functions Mark Fasheh
2008-12-22 21:48 ` [PATCH 37/56] reiserfs: Add default allocation routines for quota structures Mark Fasheh
2008-12-22 21:48 ` [PATCH 38/56] ext3: " Mark Fasheh
2008-12-22 21:48 ` [PATCH 39/56] ext4: " Mark Fasheh
2008-12-22 21:48 ` [PATCH 40/56] ocfs2: fix indendation in ocfs2_dquot_drop_slow Mark Fasheh
2008-12-22 21:48 ` [PATCH 41/56] ocfs2/quota: sparse fixes for quota Mark Fasheh
2008-12-22 21:48 ` Mark Fasheh [this message]
2008-12-22 21:48 ` [PATCH 43/56] ocfs2: Narrow the transaction for deleting xattrs from a bucket Mark Fasheh
2008-12-22 21:48 ` [PATCH 44/56] ocfs2: Dirty the entire first bucket in ocfs2_extend_xattr_bucket() Mark Fasheh
2008-12-22 21:48 ` [PATCH 45/56] ocfs2: Dirty the entire first bucket in ocfs2_cp_xattr_cluster() Mark Fasheh
2008-12-22 21:48 ` [PATCH 46/56] ocfs2: Explain t_is_new " Mark Fasheh
2008-12-22 21:48 ` [PATCH 47/56] ocfs2: Use ocfs2_cp_xattr_bucket() in ocfs2_mv_xattr_bucket_cross_cluster() Mark Fasheh
2008-12-22 21:48 ` [PATCH 48/56] ocfs2: Rename ocfs2_cp_xattr_cluster() to ocfs2_mv_xattr_buckets() Mark Fasheh
2008-12-22 21:48 ` [PATCH 49/56] ocfs2: ocfs2_mv_xattr_buckets() can handle a partial cluster now Mark Fasheh
2008-12-22 21:48 ` [PATCH 50/56] ocfs2: Use ocfs2_mv_xattr_buckets() in ocfs2_mv_xattr_bucket_cross_cluster() Mark Fasheh
2008-12-22 21:48 ` [PATCH 51/56] ocfs2: Start using buckets in ocfs2_adjust_xattr_cross_cluster() Mark Fasheh
2008-12-22 21:48 ` [PATCH 52/56] ocfs2: Pass buckets into ocfs2_mv_xattr_bucket_cross_cluster() Mark Fasheh
2008-12-22 21:48 ` [PATCH 53/56] ocfs2: Move buckets up into ocfs2_add_new_xattr_cluster() Mark Fasheh
2008-12-22 21:48 ` [PATCH 54/56] ocfs2: Move buckets up into ocfs2_add_new_xattr_bucket() Mark Fasheh
2008-12-22 21:48 ` [PATCH 55/56] ocfs2: Pass xs->bucket " Mark Fasheh
2008-12-22 21:48 ` [PATCH 56/56] ocfs2/quota: Add QUOTA in mlog_attribute Mark Fasheh

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=1229982517-3455-43-git-send-email-mfasheh@suse.com \
    --to=mfasheh@suse.com \
    --cc=joel.becker@oracle.com \
    --cc=linux-kernel@vger.kernel.org \
    --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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®