[Ocfs2-devel] [PATCH 1/1] ocfs2: recover transaction credits after extend it in xattr_set
Tiger Yang
tiger.yang at oracle.com
Wed Dec 3 21:31:45 PST 2008
Mark,
forget about this patch. Tao and I will find out an other solution to
solve this problem.
thanks,
tiger
Tiger Yang wrote:
> ocfs2_extend_trans may commit old credits and start with new credits.
> In normal xattr set porcess, we don't worry about this, because we have
> already dirtied all the old journal before extend_trans.
> During mknod process, we may set two acl entries and one security entry
> in same transaction, then we may call journal_dirty many times.
> So the credits must be recoverd after extend_trans in that case.
>
> Signed-off-by: Tiger Yang <tiger.yang at oracle.com>
> ---
> fs/ocfs2/xattr.c | 14 ++++++++++----
> 1 files changed, 10 insertions(+), 4 deletions(-)
>
> diff --git a/fs/ocfs2/xattr.c b/fs/ocfs2/xattr.c
> index 7e0d62a..5262dd5 100644
> --- a/fs/ocfs2/xattr.c
> +++ b/fs/ocfs2/xattr.c
> @@ -1138,7 +1138,7 @@ static int __ocfs2_xattr_set_value_outside(struct inode *inode,
> const void *value,
> int value_len)
> {
> - int ret = 0, i, cp_len, credits;
> + int ret = 0, i, cp_len, credits, old_credits;
> u16 blocksize = inode->i_sb->s_blocksize;
> u32 p_cluster, num_clusters;
> u32 cpos = 0, bpc = ocfs2_clusters_to_blocks(inode->i_sb, 1);
> @@ -1149,11 +1149,11 @@ static int __ocfs2_xattr_set_value_outside(struct inode *inode,
> BUG_ON(clusters > le32_to_cpu(xv->xr_clusters));
>
> /*
> - * In __ocfs2_xattr_set_value_outside has already been dirtied,
> - * so we don't need to worry about whether ocfs2_extend_trans
> - * will create a new transactio for us or not.
> + * Because ocfs2_extend_trans may commit old credits and start with
> + * new credits, we need recover the old credits in that case.
> */
> credits = clusters * bpc;
> + old_credits = handle->h_buffer_credits;
> ret = ocfs2_extend_trans(handle, credits);
> if (ret) {
> mlog_errno(ret);
> @@ -1211,6 +1211,12 @@ static int __ocfs2_xattr_set_value_outside(struct inode *inode,
> }
> cpos += num_clusters;
> }
> +
> + if (handle->h_buffer_credits < old_credits) {
> + ret = ocfs2_extend_trans(handle, old_credits);
> + if (ret)
> + mlog_errno(ret);
> + }
> out:
> brelse(bh);
>
More information about the Ocfs2-devel
mailing list