From: Andreas Gruenbacher <agruenba@redhat.com>
To: cluster-devel.redhat.com
Subject: [Cluster-devel] [PATCH v3 09/20] gfs2: Get rid of sd_reserving_log
Date: Wed, 27 Jan 2021 22:07:35 +0100 [thread overview]
Message-ID: <20210127210746.16958-10-agruenba@redhat.com> (raw)
In-Reply-To: <20210127210746.16958-1-agruenba@redhat.com>
This counter and the associated wait queue are only used so that
gfs2_make_fs_ro can efficiently wait for all pending log space
allocations to fail after setting the filesystem to read-only. This
comes at the cost of waking up that wait queue very frequently.
Instead, when gfs2_log_reserve fails because the filesystem has become
read-only, Wake up sd_log_waitq. In gfs2_make_fs_ro, set the file
system read-only and then wait until all the log space has been
released. Give up and report the problem after a while. With that,
sd_reserving_log and sd_reserving_log_wait can be removed.
Signed-off-by: Andreas Gruenbacher <agruenba@redhat.com>
---
fs/gfs2/incore.h | 3 ---
fs/gfs2/log.c | 17 ++++++++++-------
fs/gfs2/log.h | 1 +
fs/gfs2/ops_fstype.c | 2 --
fs/gfs2/super.c | 12 ++++++------
fs/gfs2/trans.c | 5 ++++-
6 files changed, 21 insertions(+), 19 deletions(-)
diff --git a/fs/gfs2/incore.h b/fs/gfs2/incore.h
index 958810e533ad..c155fd39bc98 100644
--- a/fs/gfs2/incore.h
+++ b/fs/gfs2/incore.h
@@ -848,9 +848,6 @@ struct gfs2_sbd {
int sd_log_error; /* First log error */
wait_queue_head_t sd_withdraw_wait;
- atomic_t sd_reserving_log;
- wait_queue_head_t sd_reserving_log_wait;
-
unsigned int sd_log_flush_head;
spinlock_t sd_ail_lock;
diff --git a/fs/gfs2/log.c b/fs/gfs2/log.c
index 721d2d7f0efd..2e84ba153cdf 100644
--- a/fs/gfs2/log.c
+++ b/fs/gfs2/log.c
@@ -397,6 +397,15 @@ static void ail2_empty(struct gfs2_sbd *sdp, unsigned int new_tail)
spin_unlock(&sdp->sd_ail_lock);
}
+/**
+ * gfs2_log_is_empty - Check if the log is empty
+ * @sdp: The GFS2 superblock
+ */
+
+bool gfs2_log_is_empty(struct gfs2_sbd *sdp) {
+ return atomic_read(&sdp->sd_log_blks_free) == sdp->sd_jdesc->jd_blocks;
+}
+
/**
* gfs2_log_release - Release a given number of log blocks
* @sdp: The GFS2 superblock
@@ -461,13 +470,9 @@ int gfs2_log_reserve(struct gfs2_sbd *sdp, unsigned int blks)
} while(free_blocks <= wanted);
finish_wait(&sdp->sd_log_waitq, &wait);
}
- atomic_inc(&sdp->sd_reserving_log);
if (atomic_cmpxchg(&sdp->sd_log_blks_free, free_blocks,
- free_blocks - blks) != free_blocks) {
- if (atomic_dec_and_test(&sdp->sd_reserving_log))
- wake_up(&sdp->sd_reserving_log_wait);
+ free_blocks - blks) != free_blocks)
goto retry;
- }
atomic_sub(blks, &sdp->sd_log_blks_needed);
trace_gfs2_log_blocks(sdp, -blks);
@@ -483,8 +488,6 @@ int gfs2_log_reserve(struct gfs2_sbd *sdp, unsigned int blks)
gfs2_log_release(sdp, blks);
ret = -EROFS;
}
- if (atomic_dec_and_test(&sdp->sd_reserving_log))
- wake_up(&sdp->sd_reserving_log_wait);
return ret;
}
diff --git a/fs/gfs2/log.h b/fs/gfs2/log.h
index a9cdbc990edf..16efbe614279 100644
--- a/fs/gfs2/log.h
+++ b/fs/gfs2/log.h
@@ -64,6 +64,7 @@ static inline void gfs2_ordered_add_inode(struct gfs2_inode *ip)
extern void gfs2_ordered_del_inode(struct gfs2_inode *ip);
extern unsigned int gfs2_struct2blk(struct gfs2_sbd *sdp, unsigned int nstruct);
extern void gfs2_remove_from_ail(struct gfs2_bufdata *bd);
+extern bool gfs2_log_is_empty(struct gfs2_sbd *sdp);
extern void gfs2_log_release(struct gfs2_sbd *sdp, unsigned int blks);
extern int gfs2_log_reserve(struct gfs2_sbd *sdp, unsigned int blks);
extern void gfs2_write_log_header(struct gfs2_sbd *sdp, struct gfs2_jdesc *jd,
diff --git a/fs/gfs2/ops_fstype.c b/fs/gfs2/ops_fstype.c
index 61fce59cb4d3..986dc2ebebf0 100644
--- a/fs/gfs2/ops_fstype.c
+++ b/fs/gfs2/ops_fstype.c
@@ -136,8 +136,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);
- atomic_set(&sdp->sd_reserving_log, 0);
- init_waitqueue_head(&sdp->sd_reserving_log_wait);
init_waitqueue_head(&sdp->sd_log_flush_wait);
atomic_set(&sdp->sd_freeze_state, SFS_UNFROZEN);
mutex_init(&sdp->sd_freeze_mutex);
diff --git a/fs/gfs2/super.c b/fs/gfs2/super.c
index ed7a829e9ffe..f188277f7d48 100644
--- a/fs/gfs2/super.c
+++ b/fs/gfs2/super.c
@@ -645,13 +645,13 @@ int gfs2_make_fs_ro(struct gfs2_sbd *sdp)
gfs2_log_flush(sdp, NULL, GFS2_LOG_HEAD_FLUSH_SHUTDOWN |
GFS2_LFC_MAKE_FS_RO);
- wait_event(sdp->sd_reserving_log_wait,
- atomic_read(&sdp->sd_reserving_log) == 0);
- gfs2_assert_warn(sdp, atomic_read(&sdp->sd_log_blks_free) ==
- sdp->sd_jdesc->jd_blocks);
+ wait_event_timeout(sdp->sd_log_waitq,
+ gfs2_log_is_empty(sdp),
+ HZ * 5);
+ gfs2_assert_warn(sdp, gfs2_log_is_empty(sdp));
} else {
- wait_event_timeout(sdp->sd_reserving_log_wait,
- atomic_read(&sdp->sd_reserving_log) == 0,
+ wait_event_timeout(sdp->sd_log_waitq,
+ gfs2_log_is_empty(sdp),
HZ * 5);
}
if (gfs2_holder_initialized(&freeze_gh))
diff --git a/fs/gfs2/trans.c b/fs/gfs2/trans.c
index 4f461ab37ced..e33cb8da056a 100644
--- a/fs/gfs2/trans.c
+++ b/fs/gfs2/trans.c
@@ -73,8 +73,11 @@ int __gfs2_trans_begin(struct gfs2_sbd *sdp, unsigned int blocks,
sb_start_intwrite(sdp->sd_vfs);
error = gfs2_log_reserve(sdp, tr->tr_reserved);
- if (error)
+ if (error) {
+ if (error == -EROFS)
+ wake_up(&sdp->sd_log_waitq);
goto fail;
+ }
current->journal_info = tr;
--
2.26.2
next prev parent reply other threads:[~2021-01-27 21:07 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-01-27 21:07 [Cluster-devel] [PATCH v3 00/20] Some log space management cleanups Andreas Gruenbacher
2021-01-27 21:07 ` [Cluster-devel] [PATCH v3 01/20] gfs2: Un-obfuscate function jdesc_find_i Andreas Gruenbacher
2021-01-27 21:07 ` [Cluster-devel] [PATCH v3 02/20] gfs2: Simplify the buf_limit and databuf_limit definitions Andreas Gruenbacher
2021-01-27 21:07 ` [Cluster-devel] [PATCH v3 03/20] gfs2: Minor gfs2_write_revokes cleanups Andreas Gruenbacher
2021-01-27 21:07 ` [Cluster-devel] [PATCH v3 04/20] gfs2: Some documentation updates Andreas Gruenbacher
2021-01-27 21:07 ` [Cluster-devel] [PATCH v3 05/20] gfs2: Minor debugging improvement Andreas Gruenbacher
2021-01-27 21:07 ` [Cluster-devel] [PATCH v3 06/20] gfs2: Rename gfs2_{write => flush}_revokes Andreas Gruenbacher
2021-01-27 21:07 ` [Cluster-devel] [PATCH v3 07/20] gfs2: Clean up ail2_empty Andreas Gruenbacher
2021-01-27 21:07 ` [Cluster-devel] [PATCH v3 08/20] gfs2: Get rid of on-stack transactions Andreas Gruenbacher
2021-01-28 9:21 ` Steven Whitehouse
2021-01-27 21:07 ` Andreas Gruenbacher [this message]
2021-01-27 21:07 ` [Cluster-devel] [PATCH v3 10/20] gfs2: Move lock flush locking to gfs2_trans_{begin, end} Andreas Gruenbacher
2021-01-27 21:07 ` [Cluster-devel] [PATCH v3 11/20] gfs2: Don't wait for journal flush in clean_journal Andreas Gruenbacher
2021-01-27 21:07 ` [Cluster-devel] [PATCH v3 12/20] gfs2: Clean up gfs2_log_reserve Andreas Gruenbacher
2021-01-27 21:07 ` [Cluster-devel] [PATCH v3 13/20] gfs2: Use a tighter bound in gfs2_trans_begin Andreas Gruenbacher
2021-01-27 21:07 ` [Cluster-devel] [PATCH v3 14/20] gfs2: Get rid of current_tail() Andreas Gruenbacher
2021-01-27 21:07 ` [Cluster-devel] [PATCH v3 15/20] gfs2: Move function gfs2_ail_empty_tr Andreas Gruenbacher
2021-01-27 21:07 ` [Cluster-devel] [PATCH v3 16/20] gfs2: No revokes for transactions at the tail of the log Andreas Gruenbacher
2021-01-27 21:07 ` [Cluster-devel] [PATCH v3 17/20] gfs2: Remove sd_log_committed_revoke Andreas Gruenbacher
2021-01-27 21:07 ` [Cluster-devel] [PATCH v3 18/20] gfs2: Remove sd_log_blks_reserved Andreas Gruenbacher
2021-01-27 21:07 ` [Cluster-devel] [PATCH v3 19/20] gfs2: Rework the log space allocation logic Andreas Gruenbacher
2021-01-27 21:07 ` [Cluster-devel] [PATCH v3 20/20] gfs2: Per-revoke accounting in transactions Andreas Gruenbacher
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20210127210746.16958-10-agruenba@redhat.com \
--to=agruenba@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).