From: Hao Xu <howeyxu@xxxxxxxxxxx> Apply trylock logic for xc_ctx_lock in xlog_cil_commit() in nowait case and error out -EAGAIN for xlog_cil_commit(). Signed-off-by: Hao Xu <howeyxu@xxxxxxxxxxx> --- fs/xfs/xfs_log_cil.c | 12 ++++++++++-- fs/xfs/xfs_log_priv.h | 2 +- fs/xfs/xfs_trans.c | 4 +++- 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/fs/xfs/xfs_log_cil.c b/fs/xfs/xfs_log_cil.c index b31830ee36dd..6d054359bbb5 100644 --- a/fs/xfs/xfs_log_cil.c +++ b/fs/xfs/xfs_log_cil.c @@ -1613,7 +1613,7 @@ xlog_cil_process_intents( * background commit, returns without it held once background commits are * allowed again. */ -void +int xlog_cil_commit( struct xlog *log, struct xfs_trans *tp, @@ -1623,6 +1623,7 @@ xlog_cil_commit( struct xfs_cil *cil = log->l_cilp; struct xfs_log_item *lip, *next; uint32_t released_space = 0; + bool nowait = tp->t_flags & XFS_TRANS_NOWAIT; /* * Do all necessary memory allocation before we lock the CIL. @@ -1632,7 +1633,12 @@ xlog_cil_commit( xlog_cil_alloc_shadow_bufs(log, tp); /* lock out background commit */ - down_read(&cil->xc_ctx_lock); + if (nowait) { + if (!down_read_trylock(&cil->xc_ctx_lock)) + return -EAGAIN; + } else { + down_read(&cil->xc_ctx_lock); + } if (tp->t_flags & XFS_TRANS_HAS_INTENT_DONE) released_space = xlog_cil_process_intents(cil, tp); @@ -1668,6 +1674,8 @@ xlog_cil_commit( /* xlog_cil_push_background() releases cil->xc_ctx_lock */ xlog_cil_push_background(log); + + return 0; } /* diff --git a/fs/xfs/xfs_log_priv.h b/fs/xfs/xfs_log_priv.h index 41edaa0ae869..eb7a1241deab 100644 --- a/fs/xfs/xfs_log_priv.h +++ b/fs/xfs/xfs_log_priv.h @@ -580,7 +580,7 @@ int xlog_cil_init(struct xlog *log); void xlog_cil_init_post_recovery(struct xlog *log); void xlog_cil_destroy(struct xlog *log); bool xlog_cil_empty(struct xlog *log); -void xlog_cil_commit(struct xlog *log, struct xfs_trans *tp, +int xlog_cil_commit(struct xlog *log, struct xfs_trans *tp, xfs_csn_t *commit_seq, bool regrant); void xlog_cil_set_ctx_write_state(struct xfs_cil_ctx *ctx, struct xlog_in_core *iclog); diff --git a/fs/xfs/xfs_trans.c b/fs/xfs/xfs_trans.c index f1f84a3dd456..e5beda636a37 100644 --- a/fs/xfs/xfs_trans.c +++ b/fs/xfs/xfs_trans.c @@ -1037,7 +1037,9 @@ __xfs_trans_commit( xfs_trans_apply_sb_deltas(tp); xfs_trans_apply_dquot_deltas(tp); - xlog_cil_commit(log, tp, &commit_seq, regrant); + error = xlog_cil_commit(log, tp, &commit_seq, regrant); + if (error) + goto out_unreserve; xfs_trans_free(tp); -- 2.25.1