Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 102c2595 authored by Xue jiufei's avatar Xue jiufei Committed by Linus Torvalds
Browse files

ocfs2: extend enough credits for freeing one truncate record while replaying truncate records



Now function ocfs2_replay_truncate_records() first modifies tl_used,
then calls ocfs2_extend_trans() to extend transactions for gd and alloc
inode used for freeing clusters.  jbd2_journal_restart() may be called
and it may happen that tl_used in truncate log is decreased but the
clusters are not freed, which means these clusters are lost.  So we
should avoid extending transactions in these two operations.

Signed-off-by: default avatarjoyce.xue <xuejiufei@huawei.com>
Reviewed-by: default avatarMark Fasheh <mfasheh@suse.de>
Acked-by: default avatarJoseph Qi <joseph.qi@huawei.com>
Cc: Joel Becker <jlbec@evilplan.org>
Cc: Junxiao Bi <junxiao.bi@oracle.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 17215989
Loading
Loading
Loading
Loading
+8 −11
Original line number Diff line number Diff line
@@ -5954,16 +5954,6 @@ static int ocfs2_replay_truncate_records(struct ocfs2_super *osb,

		ocfs2_journal_dirty(handle, tl_bh);

		/* TODO: Perhaps we can calculate the bulk of the
		 * credits up front rather than extending like
		 * this. */
		status = ocfs2_extend_trans(handle,
					    OCFS2_TRUNCATE_LOG_FLUSH_ONE_REC);
		if (status < 0) {
			mlog_errno(status);
			goto bail;
		}

		rec = tl->tl_recs[i];
		start_blk = ocfs2_clusters_to_blocks(data_alloc_inode->i_sb,
						    le32_to_cpu(rec.t_start));
@@ -5984,6 +5974,13 @@ static int ocfs2_replay_truncate_records(struct ocfs2_super *osb,
				goto bail;
			}
		}

		status = ocfs2_extend_trans(handle,
				OCFS2_TRUNCATE_LOG_FLUSH_ONE_REC);
		if (status < 0) {
			mlog_errno(status);
			goto bail;
		}
		i--;
	}

@@ -6042,7 +6039,7 @@ int __ocfs2_flush_truncate_log(struct ocfs2_super *osb)
		goto out_mutex;
	}

	handle = ocfs2_start_trans(osb, OCFS2_TRUNCATE_LOG_UPDATE);
	handle = ocfs2_start_trans(osb, OCFS2_TRUNCATE_LOG_FLUSH_ONE_REC);
	if (IS_ERR(handle)) {
		status = PTR_ERR(handle);
		mlog_errno(status);