Commit 49309841 authored by Jie Liu's avatar Jie Liu Committed by Linus Torvalds

ocfs2: rework transaction rollback in ocfs2_relink_block_group()

In ocfs2_relink_block_group(), we roll back all those changes if notify
intent to modify buffers for metadata update failed even if the relevant
buffer has not yet been modified/got dirty at that point, that are not
quite right because of:

 - None buffer has been modified/dirty if failed to call
   ocfs2_journal_access_gd() against the previous block group buffer

 - Only the previous block group buffer has got dirty if failed to call
   ocfs2_journal_access_gd() against the block group buffer

 - There is no need to roll back the change for file entry buffer at all

Those problems will not cause anything wrong but unnecessary.  This
patch fix them and kill the useless bg_ptr variable as well.
Signed-off-by: default avatarJie Liu <jeff.liu@oracle.com>
Cc: Younger Liu <younger.liu@huawei.com>
Cc: Sunil Mushran <sunil.mushran@gmail.com>
Cc: Mark Fasheh <mfasheh@suse.com>
Cc: Joel Becker <jlbec@evilplan.org>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent ea45466a
...@@ -1422,7 +1422,7 @@ static int ocfs2_relink_block_group(handle_t *handle, ...@@ -1422,7 +1422,7 @@ static int ocfs2_relink_block_group(handle_t *handle,
int status; int status;
/* there is a really tiny chance the journal calls could fail, /* there is a really tiny chance the journal calls could fail,
* but we wouldn't want inconsistent blocks in *any* case. */ * but we wouldn't want inconsistent blocks in *any* case. */
u64 fe_ptr, bg_ptr, prev_bg_ptr; u64 bg_ptr, prev_bg_ptr;
struct ocfs2_dinode *fe = (struct ocfs2_dinode *) fe_bh->b_data; struct ocfs2_dinode *fe = (struct ocfs2_dinode *) fe_bh->b_data;
struct ocfs2_group_desc *bg = (struct ocfs2_group_desc *) bg_bh->b_data; struct ocfs2_group_desc *bg = (struct ocfs2_group_desc *) bg_bh->b_data;
struct ocfs2_group_desc *prev_bg = (struct ocfs2_group_desc *) prev_bg_bh->b_data; struct ocfs2_group_desc *prev_bg = (struct ocfs2_group_desc *) prev_bg_bh->b_data;
...@@ -1437,7 +1437,6 @@ static int ocfs2_relink_block_group(handle_t *handle, ...@@ -1437,7 +1437,6 @@ static int ocfs2_relink_block_group(handle_t *handle,
(unsigned long long)le64_to_cpu(bg->bg_blkno), (unsigned long long)le64_to_cpu(bg->bg_blkno),
(unsigned long long)le64_to_cpu(prev_bg->bg_blkno)); (unsigned long long)le64_to_cpu(prev_bg->bg_blkno));
fe_ptr = le64_to_cpu(fe->id2.i_chain.cl_recs[chain].c_blkno);
bg_ptr = le64_to_cpu(bg->bg_next_group); bg_ptr = le64_to_cpu(bg->bg_next_group);
prev_bg_ptr = le64_to_cpu(prev_bg->bg_next_group); prev_bg_ptr = le64_to_cpu(prev_bg->bg_next_group);
...@@ -1446,7 +1445,7 @@ static int ocfs2_relink_block_group(handle_t *handle, ...@@ -1446,7 +1445,7 @@ static int ocfs2_relink_block_group(handle_t *handle,
OCFS2_JOURNAL_ACCESS_WRITE); OCFS2_JOURNAL_ACCESS_WRITE);
if (status < 0) { if (status < 0) {
mlog_errno(status); mlog_errno(status);
goto out_rollback; goto out;
} }
prev_bg->bg_next_group = bg->bg_next_group; prev_bg->bg_next_group = bg->bg_next_group;
...@@ -1456,7 +1455,7 @@ static int ocfs2_relink_block_group(handle_t *handle, ...@@ -1456,7 +1455,7 @@ static int ocfs2_relink_block_group(handle_t *handle,
bg_bh, OCFS2_JOURNAL_ACCESS_WRITE); bg_bh, OCFS2_JOURNAL_ACCESS_WRITE);
if (status < 0) { if (status < 0) {
mlog_errno(status); mlog_errno(status);
goto out_rollback; goto out_rollback_prev_bg;
} }
bg->bg_next_group = fe->id2.i_chain.cl_recs[chain].c_blkno; bg->bg_next_group = fe->id2.i_chain.cl_recs[chain].c_blkno;
...@@ -1466,20 +1465,20 @@ static int ocfs2_relink_block_group(handle_t *handle, ...@@ -1466,20 +1465,20 @@ static int ocfs2_relink_block_group(handle_t *handle,
fe_bh, OCFS2_JOURNAL_ACCESS_WRITE); fe_bh, OCFS2_JOURNAL_ACCESS_WRITE);
if (status < 0) { if (status < 0) {
mlog_errno(status); mlog_errno(status);
goto out_rollback; goto out_rollback_bg;
} }
fe->id2.i_chain.cl_recs[chain].c_blkno = bg->bg_blkno; fe->id2.i_chain.cl_recs[chain].c_blkno = bg->bg_blkno;
ocfs2_journal_dirty(handle, fe_bh); ocfs2_journal_dirty(handle, fe_bh);
out_rollback: out:
if (status < 0) { return status;
fe->id2.i_chain.cl_recs[chain].c_blkno = cpu_to_le64(fe_ptr);
out_rollback_bg:
bg->bg_next_group = cpu_to_le64(bg_ptr); bg->bg_next_group = cpu_to_le64(bg_ptr);
out_rollback_prev_bg:
prev_bg->bg_next_group = cpu_to_le64(prev_bg_ptr); prev_bg->bg_next_group = cpu_to_le64(prev_bg_ptr);
}
if (status)
mlog_errno(status); mlog_errno(status);
return status; return status;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment