On Tue, Jun 19, 2018 at 09:11:06AM -0400, Mike Snitzer wrote: > On Mon, May 21 2018 at 8:53pm -0400, > Monty Pavel <monty_pavel@xxxxxxxx> 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@xxxxxxxx> > > --- > > 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); I don't believe you've tested this; sblock is passed to dm_tm_commit() uninitialised, and you didn't even bother to remove the later (and correct) call to dm_tm_commit(). See dm-transaction-manager.h for an explanation of how the 2-phase commit works. What is the issue that started you looking in this area? - Joe -- dm-devel mailing list dm-devel@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/dm-devel