mirror of
https://github.com/torvalds/linux.git
synced 2025-12-07 20:06:24 +00:00
gfs2: Get rid of delayed withdraws
Now that gfs2_withdraw() is asynchronous, is can be called in any context and there is no more need for gfs2_withdraw_delayed() or for turning delayed withdraws into actual withdraws. Remove the now-obsolete code. Signed-off-by: Andreas Gruenbacher <agruenba@redhat.com>
This commit is contained in:
@@ -756,7 +756,7 @@ skip_inval:
|
||||
* then it's okay to tell dlm to unlock it.
|
||||
*/
|
||||
if (unlikely(sdp->sd_log_error) && !gfs2_withdrawing_or_withdrawn(sdp))
|
||||
gfs2_withdraw_delayed(sdp);
|
||||
gfs2_withdraw(sdp);
|
||||
if (glock_blocked_by_withdraw(gl) &&
|
||||
(target != LM_ST_UNLOCKED ||
|
||||
test_bit(SDF_WITHDRAW_RECOVERY, &sdp->sd_flags))) {
|
||||
|
||||
@@ -45,7 +45,7 @@ static void gfs2_ail_error(struct gfs2_glock *gl, const struct buffer_head *bh)
|
||||
gl->gl_name.ln_type, gl->gl_name.ln_number,
|
||||
gfs2_glock2aspace(gl));
|
||||
gfs2_lm(sdp, "AIL error\n");
|
||||
gfs2_withdraw_delayed(sdp);
|
||||
gfs2_withdraw(sdp);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -83,9 +83,6 @@ static void __gfs2_ail_flush(struct gfs2_glock *gl, bool fsync,
|
||||
GLOCK_BUG_ON(gl, !fsync && atomic_read(&gl->gl_ail_count));
|
||||
spin_unlock(&sdp->sd_ail_lock);
|
||||
gfs2_log_unlock(sdp);
|
||||
|
||||
if (gfs2_withdrawing(sdp))
|
||||
gfs2_withdraw(sdp);
|
||||
}
|
||||
|
||||
|
||||
@@ -608,10 +605,10 @@ static int freeze_go_xmote_bh(struct gfs2_glock *gl)
|
||||
j_gl->gl_ops->go_inval(j_gl, DIO_METADATA);
|
||||
|
||||
error = gfs2_find_jhead(sdp->sd_jdesc, &head);
|
||||
if (gfs2_assert_withdraw_delayed(sdp, !error))
|
||||
if (gfs2_assert_withdraw(sdp, !error))
|
||||
return error;
|
||||
if (gfs2_assert_withdraw_delayed(sdp, head.lh_flags &
|
||||
GFS2_LOG_HEAD_UNMOUNT))
|
||||
if (gfs2_assert_withdraw(sdp, head.lh_flags &
|
||||
GFS2_LOG_HEAD_UNMOUNT))
|
||||
return -EIO;
|
||||
gfs2_log_pointers_init(sdp, &head);
|
||||
}
|
||||
|
||||
@@ -599,7 +599,6 @@ enum {
|
||||
SDF_SKIP_DLM_UNLOCK = 8,
|
||||
SDF_FORCE_AIL_FLUSH = 9,
|
||||
SDF_FREEZE_INITIATOR = 10,
|
||||
SDF_WITHDRAWING = 11, /* Will withdraw eventually */
|
||||
SDF_WITHDRAW_IN_PROG = 12, /* Withdraw is in progress */
|
||||
SDF_REMOTE_WITHDRAW = 13, /* Performing remote recovery */
|
||||
SDF_WITHDRAW_RECOVERY = 14, /* Wait for journal recovery when we are
|
||||
|
||||
@@ -114,7 +114,7 @@ __acquires(&sdp->sd_ail_lock)
|
||||
}
|
||||
if (!cmpxchg(&sdp->sd_log_error, 0, -EIO)) {
|
||||
gfs2_io_error_bh(sdp, bh);
|
||||
gfs2_withdraw_delayed(sdp);
|
||||
gfs2_withdraw(sdp);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -326,7 +326,7 @@ static int gfs2_ail1_empty_one(struct gfs2_sbd *sdp, struct gfs2_trans *tr,
|
||||
if (!buffer_uptodate(bh) &&
|
||||
!cmpxchg(&sdp->sd_log_error, 0, -EIO)) {
|
||||
gfs2_io_error_bh(sdp, bh);
|
||||
gfs2_withdraw_delayed(sdp);
|
||||
gfs2_withdraw(sdp);
|
||||
}
|
||||
/*
|
||||
* If we have space for revokes and the bd is no longer on any
|
||||
@@ -807,9 +807,6 @@ void gfs2_flush_revokes(struct gfs2_sbd *sdp)
|
||||
gfs2_log_lock(sdp);
|
||||
gfs2_ail1_empty(sdp, max_revokes);
|
||||
gfs2_log_unlock(sdp);
|
||||
|
||||
if (gfs2_withdrawing(sdp))
|
||||
gfs2_withdraw(sdp);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -987,9 +984,6 @@ static void empty_ail1_list(struct gfs2_sbd *sdp)
|
||||
if (gfs2_withdrawing_or_withdrawn(sdp))
|
||||
break;
|
||||
}
|
||||
|
||||
if (gfs2_withdrawing(sdp))
|
||||
gfs2_withdraw(sdp);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1071,7 +1065,7 @@ repeat:
|
||||
sdp->sd_log_tr = NULL;
|
||||
tr->tr_first = first_log_head;
|
||||
if (unlikely(frozen)) {
|
||||
if (gfs2_assert_withdraw_delayed(sdp,
|
||||
if (gfs2_assert_withdraw(sdp,
|
||||
!tr->tr_num_buf_new && !tr->tr_num_databuf_new))
|
||||
goto out_withdraw;
|
||||
}
|
||||
@@ -1096,7 +1090,7 @@ repeat:
|
||||
clear_bit(SDF_JOURNAL_LIVE, &sdp->sd_flags);
|
||||
|
||||
if (unlikely(frozen))
|
||||
if (gfs2_assert_withdraw_delayed(sdp, !reserved_revokes))
|
||||
if (gfs2_assert_withdraw(sdp, !reserved_revokes))
|
||||
goto out_withdraw;
|
||||
|
||||
gfs2_ordered_write(sdp);
|
||||
@@ -1151,13 +1145,11 @@ out_end:
|
||||
reserved_blocks += (reserved_revokes - sdp->sd_ldptrs) / sdp->sd_inptrs;
|
||||
out:
|
||||
if (used_blocks != reserved_blocks) {
|
||||
gfs2_assert_withdraw_delayed(sdp, used_blocks < reserved_blocks);
|
||||
gfs2_assert_withdraw(sdp, used_blocks < reserved_blocks);
|
||||
gfs2_log_release(sdp, reserved_blocks - used_blocks);
|
||||
}
|
||||
up_write(&sdp->sd_log_flush_lock);
|
||||
gfs2_trans_free(sdp, tr);
|
||||
if (gfs2_withdrawing(sdp))
|
||||
gfs2_withdraw(sdp);
|
||||
trace_gfs2_log_flush(sdp, 0, flags);
|
||||
return;
|
||||
|
||||
@@ -1346,9 +1338,6 @@ int gfs2_logd(void *data)
|
||||
t);
|
||||
}
|
||||
|
||||
if (gfs2_withdrawing(sdp))
|
||||
gfs2_withdraw(sdp);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -209,7 +209,7 @@ static void gfs2_end_log_write(struct bio *bio)
|
||||
if (!cmpxchg(&sdp->sd_log_error, 0, err))
|
||||
fs_err(sdp, "Error %d writing to journal, jid=%u\n",
|
||||
err, sdp->sd_jdesc->jd_jid);
|
||||
gfs2_withdraw_delayed(sdp);
|
||||
gfs2_withdraw(sdp);
|
||||
/* prevent more writes to the journal */
|
||||
clear_bit(SDF_JOURNAL_LIVE, &sdp->sd_flags);
|
||||
wake_up(&sdp->sd_logd_waitq);
|
||||
|
||||
@@ -84,7 +84,6 @@ static ssize_t status_show(struct gfs2_sbd *sdp, char *buf)
|
||||
"Force AIL Flush: %d\n"
|
||||
"FS Freeze Initiator: %d\n"
|
||||
"FS Frozen: %d\n"
|
||||
"Withdrawing: %d\n"
|
||||
"Withdraw In Prog: %d\n"
|
||||
"Remote Withdraw: %d\n"
|
||||
"Withdraw Recovery: %d\n"
|
||||
@@ -117,7 +116,6 @@ static ssize_t status_show(struct gfs2_sbd *sdp, char *buf)
|
||||
test_bit(SDF_FORCE_AIL_FLUSH, &f),
|
||||
test_bit(SDF_FREEZE_INITIATOR, &f),
|
||||
test_bit(SDF_FROZEN, &f),
|
||||
test_bit(SDF_WITHDRAWING, &f),
|
||||
test_bit(SDF_WITHDRAW_IN_PROG, &f),
|
||||
test_bit(SDF_REMOTE_WITHDRAW, &f),
|
||||
test_bit(SDF_WITHDRAW_RECOVERY, &f),
|
||||
|
||||
@@ -364,8 +364,7 @@ void gfs2_withdraw(struct gfs2_sbd *sdp)
|
||||
*/
|
||||
|
||||
void gfs2_assert_withdraw_i(struct gfs2_sbd *sdp, char *assertion,
|
||||
const char *function, char *file, unsigned int line,
|
||||
bool delayed)
|
||||
const char *function, char *file, unsigned int line)
|
||||
{
|
||||
if (gfs2_withdrawing_or_withdrawn(sdp))
|
||||
return;
|
||||
@@ -375,17 +374,7 @@ void gfs2_assert_withdraw_i(struct gfs2_sbd *sdp, char *assertion,
|
||||
"function = %s, file = %s, line = %u\n",
|
||||
assertion, function, file, line);
|
||||
|
||||
/*
|
||||
* If errors=panic was specified on mount, it won't help to delay the
|
||||
* withdraw.
|
||||
*/
|
||||
if (sdp->sd_args.ar_errors == GFS2_ERRORS_PANIC)
|
||||
delayed = false;
|
||||
|
||||
if (delayed)
|
||||
gfs2_withdraw_delayed(sdp);
|
||||
else
|
||||
gfs2_withdraw(sdp);
|
||||
gfs2_withdraw(sdp);
|
||||
dump_stack();
|
||||
}
|
||||
|
||||
|
||||
@@ -37,24 +37,14 @@ do { \
|
||||
|
||||
|
||||
void gfs2_assert_withdraw_i(struct gfs2_sbd *sdp, char *assertion,
|
||||
const char *function, char *file, unsigned int line,
|
||||
bool delayed);
|
||||
const char *function, char *file, unsigned int line);
|
||||
|
||||
#define gfs2_assert_withdraw(sdp, assertion) \
|
||||
({ \
|
||||
bool _bool = (assertion); \
|
||||
if (unlikely(!_bool)) \
|
||||
gfs2_assert_withdraw_i((sdp), #assertion, \
|
||||
__func__, __FILE__, __LINE__, false); \
|
||||
!_bool; \
|
||||
})
|
||||
|
||||
#define gfs2_assert_withdraw_delayed(sdp, assertion) \
|
||||
({ \
|
||||
bool _bool = (assertion); \
|
||||
if (unlikely(!_bool)) \
|
||||
gfs2_assert_withdraw_i((sdp), #assertion, \
|
||||
__func__, __FILE__, __LINE__, true); \
|
||||
__func__, __FILE__, __LINE__); \
|
||||
!_bool; \
|
||||
})
|
||||
|
||||
@@ -192,15 +182,6 @@ static inline unsigned int gfs2_tune_get_i(struct gfs2_tune *gt,
|
||||
return x;
|
||||
}
|
||||
|
||||
/**
|
||||
* gfs2_withdraw_delayed - withdraw as soon as possible without deadlocks
|
||||
* @sdp: the superblock
|
||||
*/
|
||||
static inline void gfs2_withdraw_delayed(struct gfs2_sbd *sdp)
|
||||
{
|
||||
set_bit(SDF_WITHDRAWING, &sdp->sd_flags);
|
||||
}
|
||||
|
||||
/**
|
||||
* gfs2_withdrawing_or_withdrawn - test whether the file system is withdrawing
|
||||
* or withdrawn
|
||||
@@ -208,18 +189,7 @@ static inline void gfs2_withdraw_delayed(struct gfs2_sbd *sdp)
|
||||
*/
|
||||
static inline bool gfs2_withdrawing_or_withdrawn(struct gfs2_sbd *sdp)
|
||||
{
|
||||
return unlikely(test_bit(SDF_WITHDRAWN, &sdp->sd_flags) ||
|
||||
test_bit(SDF_WITHDRAWING, &sdp->sd_flags));
|
||||
}
|
||||
|
||||
/**
|
||||
* gfs2_withdrawing - check if a withdraw is pending
|
||||
* @sdp: the superblock
|
||||
*/
|
||||
static inline bool gfs2_withdrawing(struct gfs2_sbd *sdp)
|
||||
{
|
||||
return unlikely(test_bit(SDF_WITHDRAWING, &sdp->sd_flags) &&
|
||||
!test_bit(SDF_WITHDRAWN, &sdp->sd_flags));
|
||||
return unlikely(test_bit(SDF_WITHDRAWN, &sdp->sd_flags));
|
||||
}
|
||||
|
||||
static inline bool gfs2_withdraw_in_prog(struct gfs2_sbd *sdp)
|
||||
|
||||
Reference in New Issue
Block a user