[Devel] [PATCH RH8 1/2] ploop: Check bottom delta before flip
Kirill Tkhai
ktkhai at virtuozzo.com
Fri Jul 2 17:41:41 MSK 2021
Sanity check for debug.
https://jira.sw.ru/browse/PSBM-131202
Signed-off-by: Kirill Tkhai <ktkhai at virtuozzo.com>
---
drivers/md/dm-ploop-cmd.c | 58 +++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 58 insertions(+)
diff --git a/drivers/md/dm-ploop-cmd.c b/drivers/md/dm-ploop-cmd.c
index 68da59b63e7c..f989d2ab008b 100644
--- a/drivers/md/dm-ploop-cmd.c
+++ b/drivers/md/dm-ploop-cmd.c
@@ -14,6 +14,7 @@
#include "dm-ploop.h"
#define DM_MSG_PREFIX "ploop"
+#define PLOOP_DEBUG
/*
* Assign newly allocated memory for BAT array and holes_bitmap
@@ -1117,9 +1118,62 @@ static int ploop_set_noresume(struct ploop *ploop, char *mode)
return 0;
}
+static int ploop_check_delta_before_flip(struct ploop *ploop, struct file *file)
+{
+ int ret = 0;
+#ifdef PLOOP_DEBUG
+ u32 i, end, *d_bat_entries, clu, size_in_clus;
+ struct rb_root md_root = RB_ROOT;
+ struct md_page *md, *d_md;
+ struct rb_node *node;
+ bool stop = false;
+
+ ret = ploop_read_delta_metadata(ploop, file, &md_root,
+ &size_in_clus);
+ if (ret) {
+ pr_err("Error reading metadata\n");
+ goto out;
+ }
+
+ /* Points to hdr since md_page[0] also contains hdr. */
+ d_md = md_first_entry(&md_root);
+
+ write_lock_irq(&ploop->bat_rwlock);
+ ploop_for_each_md_page(ploop, md, node) {
+ init_be_iter(size_in_clus, md->id, &i, &end);
+ d_bat_entries = kmap(d_md->page);
+ for (; i <= end; i++) {
+ if (md_page_cluster_is_in_top_delta(ploop, md, i) &&
+ d_bat_entries[i] != BAT_ENTRY_NONE) {
+ ret = -EEXIST;
+ stop = true;
+ goto unmap;
+ }
+ }
+
+ clu = page_clu_idx_to_bat_clu(md->id, i);
+ if (clu == size_in_clus - 1) {
+ stop = true;
+ goto unmap;
+ }
+unmap:
+ kunmap(d_md->page);
+ if (stop)
+ break;
+ d_md = md_next_entry(d_md);
+ }
+
+ write_unlock_irq(&ploop->bat_rwlock);
+ free_md_pages_tree(&md_root);
+out:
+#endif
+ return ret;
+}
+
static int ploop_flip_upper_deltas(struct ploop *ploop)
{
struct file *file;
+ int ret;
if (!ploop->suspended || !ploop->noresume || ploop->maintaince)
return -EBUSY;
@@ -1133,6 +1187,10 @@ static int ploop_flip_upper_deltas(struct ploop *ploop)
if (!(file->f_mode & FMODE_WRITE))
return -EACCES;
+ ret = ploop_check_delta_before_flip(ploop, file);
+ if (ret)
+ return ret;
+
return process_flip_upper_deltas(ploop);
}
More information about the Devel
mailing list