ocfs2: rollback transaction in ocfs2_group_add()
authorYounger Liu <younger.liu@huawei.com>
Tue, 12 Nov 2013 23:07:03 +0000 (15:07 -0800)
committerLinus Torvalds <torvalds@linux-foundation.org>
Wed, 13 Nov 2013 03:09:01 +0000 (12:09 +0900)
If ocfs2_journal_access_di() fails, group->bg_next_group should rollback.
Otherwise, there would be a inconsistency between group_bh and main_bm_bh.

Signed-off-by: Younger Liu <younger.liu@huawei.com>
Cc: Mark Fasheh <mfasheh@suse.com>
Acked-by: Joel Becker <jlbec@evilplan.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
fs/ocfs2/resize.c

index ec55add7604a0e964447efa954e4424bf1a39016..376750f7883ea4f47a0ec0cf410cacd4ea5e3d2e 100644 (file)
@@ -469,6 +469,7 @@ int ocfs2_group_add(struct inode *inode, struct ocfs2_new_group_input *input)
        struct ocfs2_chain_list *cl;
        struct ocfs2_chain_rec *cr;
        u16 cl_bpc;
+       u64 bg_ptr;
 
        if (ocfs2_is_hard_readonly(osb) || ocfs2_is_soft_readonly(osb))
                return -EROFS;
@@ -538,12 +539,14 @@ int ocfs2_group_add(struct inode *inode, struct ocfs2_new_group_input *input)
        }
 
        group = (struct ocfs2_group_desc *)group_bh->b_data;
+       bg_ptr = le64_to_cpu(group->bg_next_group);
        group->bg_next_group = cr->c_blkno;
        ocfs2_journal_dirty(handle, group_bh);
 
        ret = ocfs2_journal_access_di(handle, INODE_CACHE(main_bm_inode),
                                      main_bm_bh, OCFS2_JOURNAL_ACCESS_WRITE);
        if (ret < 0) {
+               group->bg_next_group = cpu_to_le64(bg_ptr);
                mlog_errno(ret);
                goto out_commit;
        }