From: "Theodore Y. Ts'o" <tytso@mit.edu>
To: Harshad Shirwadkar <harshadshirwadkar@gmail.com>
Cc: linux-ext4@vger.kernel.org
Subject: Re: [PATCH v3 02/13] jbd2: fast commit setup and enable
Date: Wed, 16 Oct 2019 09:03:05 -0400 [thread overview]
Message-ID: <20191016130305.GB31394@mit.edu> (raw)
In-Reply-To: <20191001074101.256523-3-harshadshirwadkar@gmail.com>
On Tue, Oct 01, 2019 at 12:40:51AM -0700, Harshad Shirwadkar wrote:
> diff --git a/fs/jbd2/journal.c b/fs/jbd2/journal.c
> index 953990eb70a9..7c13834873ad 100644
> --- a/fs/jbd2/journal.c
> +++ b/fs/jbd2/journal.c
> @@ -1159,12 +1159,15 @@ static journal_t *journal_init_common(struct block_device *bdev,
> journal->j_blk_offset = start;
> journal->j_maxlen = len;
> n = journal->j_blocksize / sizeof(journal_block_tag_t);
> - journal->j_wbufsize = n;
> + journal->j_wbufsize = n - JBD2_FAST_COMMIT_BLOCKS;
> journal->j_wbuf = kmalloc_array(n, sizeof(struct buffer_head *),
> GFP_KERNEL);
> if (!journal->j_wbuf)
> goto err_cleanup;
>
> + journal->j_fc_wbuf = &journal->j_wbuf[journal->j_wbufsize];
> + journal->j_fc_wbufsize = JBD2_FAST_COMMIT_BLOCKS;
> +
> bh = getblk_unmovable(journal->j_dev, start, journal->j_blocksize);
> if (!bh) {
> pr_err("%s: Cannot get buffer for journal superblock\n",
This is being done unconditionally, regardless of whether or not fast
commit has been enabled. As a result, for the non-fc case, j_wbufsize
is going to be unconditionally reduced in size, which would be
unfortunate.
I suggest what you do is create a new function, called
jbd2_init_fast_commit() which is called from ext4_init_fast_commit(),
added in later patch, and which takes as an argument the size of the
fast_commit region (e.g., what is currently the constant
JBD2_FAST_COMMIT_BLOCKS), since this should be under the control of
the file system.
We can then pull these changes out of journal_init_common(), and move
them into jbd2_init_fast_commit().
> -/**
> - * int jbd2_journal_load() - Read journal from disk.
> - * @journal: Journal to act on.
> - *
> - * Given a journal_t structure which tells us which disk blocks contain
> - * a journal, read the journal from disk to initialise the in-memory
> - * structures.
> - */
> -int jbd2_journal_load(journal_t *journal)
> +static int __jbd2_journal_load(journal_t *journal, bool enable_fc)
> {
> int err;
> journal_superblock_t *sb;
Instead of adding __jbd2_journal_load() with its enable_fc flag, we
can just test based on journal->j_fc_wbufsize being non-zero. That
will have been set by jbd2_init_fast_commit(), which is called before
jbd2_journal_load().
As a result, we won't need to add __jbd2_journal_load() and the
jbd2_load_with_fc() functions.
> @@ -1684,6 +1694,12 @@ int jbd2_journal_load(journal_t *journal)
> return -EFSCORRUPTED;
> }
>
> + if (enable_fc)
> + jbd2_journal_set_features(journal, 0, 0,
> + JBD2_FEATURE_INCOMPAT_FAST_COMMIT);
> + else
> + jbd2_journal_clear_features(journal, 0, 0,
> + JBD2_FEATURE_INCOMPAT_FAST_COMMIT);
We don't actually need to clear the feature, since it gets cleared
after the journal is successfully replayed.
> diff --git a/include/linux/jbd2.h b/include/linux/jbd2.h
> index b7eed49b8ecd..84d04e1f3d92 100644
> --- a/include/linux/jbd2.h
> +++ b/include/linux/jbd2.h
> @@ -918,6 +919,30 @@ struct journal_s
> */
> unsigned long j_last;
>
> + /**
> + * @j_first_fc:
> + *
> + * The block number of the first fast commit block in the journal
> + * [j_state_lock].
> + */
> + unsigned long j_first_fc;
Is this really protected by j_state_lock? It's setup at journal load
time, and then never changed. As a result, it's safe to read
j_first_fc without first taking the j_state_lock.
> +
> + /**
> + * @j_fc_off:
> + *
> + * Number of fast commit blocks currently allocated.
> + * [j_state_lock].
> + */
> + unsigned long j_fc_off;
I'll mention this later, but we're not *actually* taking j_state_lock
when accessing j_fc_off. In particular, jbd2_map_fc_buf() and its
caller (ext4_journal_fc_commit_cb) isn't taking j_state_lock.
I haven't had a chance to trace the locking hierarchy to figure out
whether the documentation or the locking is wrong, but my first
initial read is that the locking might be wrong?
> +
> + /**
> + * @j_last_fc:
> + *
> + * The block number one beyond the last fast commit block in the journal
> + * [j_state_lock].
> + */
> + unsigned long j_last_fc;
> +
Again, this should never change once the journal structure is set up,
so it doesn't need to be protected by j_state_lock.
- Ted
next prev parent reply other threads:[~2019-10-16 13:03 UTC|newest]
Thread overview: 36+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-10-01 7:40 [PATCH v3 00/13] ext4: add fast commit support Harshad Shirwadkar
2019-10-01 7:40 ` [PATCH v3 01/13] ext4: add handling for extended mount options Harshad Shirwadkar
2019-10-16 2:14 ` Theodore Y. Ts'o
2019-10-21 20:41 ` harshad shirwadkar
2019-10-01 7:40 ` [PATCH v3 02/13] jbd2: fast commit setup and enable Harshad Shirwadkar
2019-10-16 13:03 ` Theodore Y. Ts'o [this message]
2019-10-01 7:40 ` [PATCH v3 03/13] jbd2: fast-commit commit path changes Harshad Shirwadkar
2019-10-16 16:38 ` Theodore Y. Ts'o
2019-10-01 7:40 ` [PATCH v3 04/13] jbd2: fast-commit commit path new APIs Harshad Shirwadkar
2019-10-16 17:20 ` Theodore Y. Ts'o
2019-10-01 7:40 ` [PATCH v3 05/13] jbd2: fast-commit recovery path changes Harshad Shirwadkar
2019-10-16 17:30 ` Theodore Y. Ts'o
2019-10-22 0:51 ` harshad shirwadkar
2019-10-01 7:40 ` [PATCH v3 06/13] ext4: add fields that are needed to track changed files Harshad Shirwadkar
2019-10-16 18:26 ` Theodore Y. Ts'o
2019-10-01 7:40 ` [PATCH v3 07/13] ext4: track changed files for fast commit Harshad Shirwadkar
2019-10-16 20:26 ` Theodore Y. Ts'o
2019-10-01 7:40 ` [PATCH v3 08/13] ext4: fast-commit commit range tracking Harshad Shirwadkar
2019-10-16 21:36 ` Theodore Y. Ts'o
2019-10-30 5:12 ` harshad shirwadkar
2019-10-01 7:40 ` [PATCH v3 09/13] ext4: fast-commit commit path changes Harshad Shirwadkar
2019-10-16 22:45 ` Theodore Y. Ts'o
[not found] ` <CAAJeciXQiE022GqcsTr35jSqjA6eH+zBS2KNvDPj5PovButdYA@mail.gmail.com>
2019-10-23 12:44 ` Theodore Y. Ts'o
2019-10-01 7:40 ` [PATCH v3 10/13] ext4: fast-commit recovery " Harshad Shirwadkar
2019-10-18 2:07 ` Theodore Y. Ts'o
2019-10-01 7:41 ` [PATCH v3 11/13] ext4: add support for asynchronous fast commits Harshad Shirwadkar
2019-10-25 6:28 ` Xiaoguang Wang
2019-10-01 7:41 ` [PATCH v3 12/13] docs: Add fast commit documentation Harshad Shirwadkar
2019-10-18 1:56 ` Theodore Y. Ts'o
2019-10-18 4:51 ` Andreas Dilger
2019-10-18 13:28 ` Theodore Y. Ts'o
2019-10-31 18:53 ` Andreas Dilger
2019-10-31 5:34 ` harshad shirwadkar
2019-10-31 6:41 ` harshad shirwadkar
2019-10-04 19:12 ` [PATCH v3 00/13] ext4: add fast commit support Theodore Y. Ts'o
2019-10-04 20:11 ` harshad shirwadkar
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=20191016130305.GB31394@mit.edu \
--to=tytso@mit.edu \
--cc=harshadshirwadkar@gmail.com \
--cc=linux-ext4@vger.kernel.org \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.