ocfs2: extend enough credits for freeing one truncate record while replaying truncate records
PATCH 16/25 ocfs2: extend enough credits for freeing one truncate record while replaying truncate records
From: Xue jiufei <[email protected]>
Subject: 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.
---
fs/ocfs2/alloc.c | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-)
fs/ocfs2/alloc.c renamed from fs/ocfs2/alloc.c~extend-enough-credits-for-freeing-one-truncate-record-while-replaying-truncate-records +8 -11
@@ -5954,16 +5954,6 @@ static int ocfs2_replay_truncate_recordsocfs2_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 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 oc 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);
_
PATCH 16/25 ocfs2: extend enough credits for freeing one truncate record while replaying truncate records
Quoted 10 lines · akpm at linux-foundation.org
From: Xue jiufei <[email protected]>
Subject: ocfs2: extend enough credits for freeing one truncate record while replaying truncate recordsNow function
ocfs2_replay_truncate_records()first modifiestl_used, then callsocfs2_extend_trans()to extend transactions for gd and alloc inode used for freeing clusters.jbd2_journal_restart()may be called and it may happen thattl_usedin 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.
Quoted 2 lines
Signed-off-by joyce.xue <[email protected]>Reviewed-by Mark Fasheh <[email protected]>
Quoted 56 lines
Cc Joel Becker <[email protected]>Cc Joseph Qi <[email protected]>Cc Junxiao Bi <[email protected]>Signed-off-by Andrew Morton <[email protected]>---
fs/ocfs2/alloc.c | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-)diff -puN
fs/ocfs2/alloc.c~extend-enough-credits-for-freeing-one-truncate-record-while-replaying-truncate-recordsfs/ocfs2/alloc.cfs/ocfs2/alloc.c renamed from fs/ocfs2/alloc.c~extend-enough-credits-for-freeing-one-truncate-record-while-replaying-truncate-records +8
-11@@ -5954,16 +5954,6 @@ static int ocfs2_replay_truncate_recordsocfs2_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 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 oc 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);_
.