From: Mike Snitzer <snitzer@redhat.com>
To: Monty Pavel <monty_pavel@sina.com>
Cc: dm-devel@redhat.com
Subject: Re: dm thin: superblock may write succeed before other metadata blocks because of wirting metadata in async mode.
Date: Tue, 19 Jun 2018 09:11:06 -0400 [thread overview]
Message-ID: <20180619131106.GA31018@redhat.com> (raw)
In-Reply-To: <20180522005336.GA30152@yyp.\x02>
On Mon, May 21 2018 at 8:53pm -0400,
Monty Pavel <monty_pavel@sina.com> wrote:
>
> If dm_bufio_write_dirty_buffers func is called by __commit_transaction
> func and power loss happens during executing it, coincidencely
> superblock wrote correctly but some metadata blocks didn't. The reason
> is we write all metadata in async mode. We can guarantee that we send
> superblock after other blocks but we cannot guarantee that superblock
> write completely early than other blocks.
> So, We need to commit other metadata blocks before change superblock.
>
> Signed-off-by: Monty Pavel <monty_pavel@sina.com>
> ---
> drivers/md/dm-thin-metadata.c | 8 ++++++++
> 1 files changed, 8 insertions(+), 0 deletions(-)
>
> diff --git a/drivers/md/dm-thin-metadata.c b/drivers/md/dm-thin-metadata.c
> index 36ef284..897d7d6 100644
> --- a/drivers/md/dm-thin-metadata.c
> +++ b/drivers/md/dm-thin-metadata.c
> @@ -813,6 +813,14 @@ static int __commit_transaction(struct dm_pool_metadata *pmd)
> if (r)
> return r;
>
> + r = dm_tm_commit(pmd->tm, sblock);
> + if (r)
> + return r;
> +
> + r = superblock_lock(pmd, &sblock);
> + if (r)
> + return r;
> +
> disk_super = dm_block_data(sblock);
> disk_super->time = cpu_to_le32(pmd->time);
> disk_super->data_mapping_root = cpu_to_le64(pmd->root);
> --
> 1.7.1
Have you actually found this patch to be effective? It should be
unnecessary. But I must admit that in looking at the related code I
couldn't convince myself it was.
But then Joe pointed me to this comment block from
dm-transaction-manager.h:
/*
* We use a 2-phase commit here.
*
* i) Make all changes for the transaction *except* for the superblock.
* Then call dm_tm_pre_commit() to flush them to disk.
*
* ii) Lock your superblock. Update. Then call dm_tm_commit() which will
* unlock the superblock and flush it. No other blocks should be updated
* during this period. Care should be taken to never unlock a partially
* updated superblock; perform any operations that could fail *before* you
* take the superblock lock.
*/
int dm_tm_pre_commit(struct dm_transaction_manager *tm);
int dm_tm_commit(struct dm_transaction_manager *tm, struct dm_block *superblock);
So given __commit_transaction() is using dm_tm_pre_commit() prior to the
dm_tm_commit() to flush the superblock -- it would seem that there isn't
any conceptual potential for corruption.
If you've found the dm_tm_pre_commit() to be lacking (whereby not all
metadata getting flushed to disk before the superblock) then please
explain your findings.
Thanks,
Mike
next parent reply other threads:[~2018-06-19 13:11 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <20180522005336.GA30152@yyp.\x02>
2018-06-19 13:11 ` Mike Snitzer [this message]
2018-06-19 14:43 ` dm thin: superblock may write succeed before other metadata blocks because of wirting metadata in async mode Joe Thornber
2018-06-19 15:00 ` Mike Snitzer
[not found] ` <20180620170357.GA5838@yyp.\x02>
2018-06-20 14:51 ` Mike Snitzer
2018-06-21 16:54 ` monty
2018-06-20 15:00 ` Joe Thornber
2018-06-20 17:03 ` monty
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=20180619131106.GA31018@redhat.com \
--to=snitzer@redhat.com \
--cc=dm-devel@redhat.com \
--cc=monty_pavel@sina.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 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.