aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSomasundaram Krishnasamy <somasundaram.krishnasamy@oracle.com>2017-04-07 15:14:55 -0400
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2017-05-20 08:28:37 -0400
commitf6ec18eb7425a334689584fcf5849107858fbd25 (patch)
tree8fbf190710c9423750a6a1fdaad91984ad67d166
parentf8d05099ec72a943a71b2c95959d37dbef13b7f1 (diff)
dm era: save spacemap metadata root after the pre-commit
commit 117aceb030307dcd431fdcff87ce988d3016c34a upstream. When committing era metadata to disk, it doesn't always save the latest spacemap metadata root in superblock. Due to this, metadata is getting corrupted sometimes when reopening the device. The correct order of update should be, pre-commit (shadows spacemap root), save the spacemap root (newly shadowed block) to in-core superblock and then the final commit. Signed-off-by: Somasundaram Krishnasamy <somasundaram.krishnasamy@oracle.com> Signed-off-by: Mike Snitzer <snitzer@redhat.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r--drivers/md/dm-era-target.c8
1 files changed, 4 insertions, 4 deletions
diff --git a/drivers/md/dm-era-target.c b/drivers/md/dm-era-target.c
index bf2b2676cb8a..80e3df1f1f7d 100644
--- a/drivers/md/dm-era-target.c
+++ b/drivers/md/dm-era-target.c
@@ -961,15 +961,15 @@ static int metadata_commit(struct era_metadata *md)
961 } 961 }
962 } 962 }
963 963
964 r = save_sm_root(md); 964 r = dm_tm_pre_commit(md->tm);
965 if (r) { 965 if (r) {
966 DMERR("%s: save_sm_root failed", __func__); 966 DMERR("%s: pre commit failed", __func__);
967 return r; 967 return r;
968 } 968 }
969 969
970 r = dm_tm_pre_commit(md->tm); 970 r = save_sm_root(md);
971 if (r) { 971 if (r) {
972 DMERR("%s: pre commit failed", __func__); 972 DMERR("%s: save_sm_root failed", __func__);
973 return r; 973 return r;
974 } 974 }
975 975