Commit 5432af15 authored by Andreas Gruenbacher's avatar Andreas Gruenbacher
Browse files

gfs2: Replace sd_freeze_state with SDF_FROZEN flag



Replace sd_freeze_state with a new SDF_FROZEN flag.

There no longer is a need for indicating that a freeze is in progress
(SDF_STARTING_FREEZE); we are now protecting the critical sections with
the sd_freeze_mutex.

Signed-off-by: default avatarAndreas Gruenbacher <agruenba@redhat.com>
parent b77b4a48
Loading
Loading
Loading
Loading
+1 −7
Original line number Diff line number Diff line
@@ -608,12 +608,7 @@ enum {
					 withdrawing */
	SDF_DEACTIVATING	= 15,
	SDF_EVICTING		= 16,
};

enum gfs2_freeze_state {
	SFS_UNFROZEN		= 0,
	SFS_STARTING_FREEZE	= 1,
	SFS_FROZEN		= 2,
	SDF_FROZEN		= 17,
};

#define GFS2_FSNAME_LEN		256
@@ -841,7 +836,6 @@ struct gfs2_sbd {

	/* For quiescing the filesystem */
	struct gfs2_holder sd_freeze_gh;
	atomic_t sd_freeze_state;
	struct mutex sd_freeze_mutex;

	char sd_fsname[GFS2_FSNAME_LEN + 3 * sizeof(int) + 2];
+4 −5
Original line number Diff line number Diff line
@@ -914,9 +914,8 @@ void gfs2_write_log_header(struct gfs2_sbd *sdp, struct gfs2_jdesc *jd,
static void log_write_header(struct gfs2_sbd *sdp, u32 flags)
{
	blk_opf_t op_flags = REQ_PREFLUSH | REQ_FUA | REQ_META | REQ_SYNC;
	enum gfs2_freeze_state state = atomic_read(&sdp->sd_freeze_state);

	gfs2_assert_withdraw(sdp, (state != SFS_FROZEN));
	gfs2_assert_withdraw(sdp, !test_bit(SDF_FROZEN, &sdp->sd_flags));

	if (test_bit(SDF_NOBARRIERS, &sdp->sd_flags)) {
		gfs2_ordered_wait(sdp);
@@ -1036,7 +1035,7 @@ void gfs2_log_flush(struct gfs2_sbd *sdp, struct gfs2_glock *gl, u32 flags)
{
	struct gfs2_trans *tr = NULL;
	unsigned int reserved_blocks = 0, used_blocks = 0;
	enum gfs2_freeze_state state = atomic_read(&sdp->sd_freeze_state);
	bool frozen = test_bit(SDF_FROZEN, &sdp->sd_flags);
	unsigned int first_log_head;
	unsigned int reserved_revokes = 0;

@@ -1067,7 +1066,7 @@ void gfs2_log_flush(struct gfs2_sbd *sdp, struct gfs2_glock *gl, u32 flags)
		if (tr) {
			sdp->sd_log_tr = NULL;
			tr->tr_first = first_log_head;
			if (unlikely (state == SFS_FROZEN)) {
			if (unlikely(frozen)) {
				if (gfs2_assert_withdraw_delayed(sdp,
				       !tr->tr_num_buf_new && !tr->tr_num_databuf_new))
					goto out_withdraw;
@@ -1092,7 +1091,7 @@ void gfs2_log_flush(struct gfs2_sbd *sdp, struct gfs2_glock *gl, u32 flags)
	if (flags & GFS2_LOG_HEAD_FLUSH_SHUTDOWN)
		clear_bit(SDF_JOURNAL_LIVE, &sdp->sd_flags);

	if (unlikely(state == SFS_FROZEN))
	if (unlikely(frozen))
		if (gfs2_assert_withdraw_delayed(sdp, !reserved_revokes))
			goto out_withdraw;

+0 −1
Original line number Diff line number Diff line
@@ -135,7 +135,6 @@ static struct gfs2_sbd *init_sbd(struct super_block *sb)
	init_rwsem(&sdp->sd_log_flush_lock);
	atomic_set(&sdp->sd_log_in_flight, 0);
	init_waitqueue_head(&sdp->sd_log_flush_wait);
	atomic_set(&sdp->sd_freeze_state, SFS_UNFROZEN);
	mutex_init(&sdp->sd_freeze_mutex);

	return sdp;
+1 −1
Original line number Diff line number Diff line
@@ -467,7 +467,7 @@ void gfs2_recover_func(struct work_struct *work)
	if (!(head.lh_flags & GFS2_LOG_HEAD_UNMOUNT)) {
		mutex_lock(&sdp->sd_freeze_mutex);

		if (atomic_read(&sdp->sd_freeze_state) != SFS_UNFROZEN) {
		if (test_bit(SDF_FROZEN, &sdp->sd_flags)) {
			mutex_unlock(&sdp->sd_freeze_mutex);
			fs_warn(sdp, "jid=%u: Can't replay: filesystem "
				"is frozen\n", jd->jd_jid);
+8 −15
Original line number Diff line number Diff line
@@ -689,26 +689,19 @@ static int gfs2_freeze_locally(struct gfs2_sbd *sdp)
	struct super_block *sb = sdp->sd_vfs;
	int error;

	atomic_set(&sdp->sd_freeze_state, SFS_STARTING_FREEZE);

	error = freeze_super(sb);
	if (error)
		goto fail;
		return error;

	if (test_bit(SDF_JOURNAL_LIVE, &sdp->sd_flags)) {
		gfs2_log_flush(sdp, NULL, GFS2_LOG_HEAD_FLUSH_FREEZE |
			       GFS2_LFC_FREEZE_GO_SYNC);
		if (gfs2_withdrawn(sdp)) {
			thaw_super(sb);
			error = -EIO;
			goto fail;
			return -EIO;
		}
	}
	return 0;

fail:
	atomic_set(&sdp->sd_freeze_state, SFS_UNFROZEN);
	return error;
}

static int gfs2_do_thaw(struct gfs2_sbd *sdp)
@@ -737,7 +730,7 @@ void gfs2_freeze_func(struct work_struct *work)

	mutex_lock(&sdp->sd_freeze_mutex);
	error = -EBUSY;
	if (atomic_read(&sdp->sd_freeze_state) != SFS_UNFROZEN)
	if (test_bit(SDF_FROZEN, &sdp->sd_flags))
		goto freeze_failed;

	error = gfs2_freeze_locally(sdp);
@@ -745,13 +738,13 @@ void gfs2_freeze_func(struct work_struct *work)
		goto freeze_failed;

	gfs2_freeze_unlock(&sdp->sd_freeze_gh);
	atomic_set(&sdp->sd_freeze_state, SFS_FROZEN);
	set_bit(SDF_FROZEN, &sdp->sd_flags);

	error = gfs2_do_thaw(sdp);
	if (error)
		goto out;

	atomic_set(&sdp->sd_freeze_state, SFS_UNFROZEN);
	clear_bit(SDF_FROZEN, &sdp->sd_flags);
	goto out;

freeze_failed:
@@ -776,7 +769,7 @@ static int gfs2_freeze_super(struct super_block *sb)
	if (!mutex_trylock(&sdp->sd_freeze_mutex))
		return -EBUSY;
	error = -EBUSY;
	if (atomic_read(&sdp->sd_freeze_state) != SFS_UNFROZEN)
	if (test_bit(SDF_FROZEN, &sdp->sd_flags))
		goto out;

	for (;;) {
@@ -811,7 +804,7 @@ static int gfs2_freeze_super(struct super_block *sb)
out:
	if (!error) {
		set_bit(SDF_FREEZE_INITIATOR, &sdp->sd_flags);
		atomic_set(&sdp->sd_freeze_state, SFS_FROZEN);
		set_bit(SDF_FROZEN, &sdp->sd_flags);
	}
	mutex_unlock(&sdp->sd_freeze_mutex);
	return error;
@@ -840,7 +833,7 @@ static int gfs2_thaw_super(struct super_block *sb)

	if (!error) {
		clear_bit(SDF_FREEZE_INITIATOR, &sdp->sd_flags);
		atomic_set(&sdp->sd_freeze_state, SFS_UNFROZEN);
		clear_bit(SDF_FROZEN, &sdp->sd_flags);
	}
out:
	mutex_unlock(&sdp->sd_freeze_mutex);
Loading