[Devel] [PATCH RH8 1/4] ploop: Move ploop_add_delta() to another file
Kirill Tkhai
ktkhai at virtuozzo.com
Wed May 5 13:11:10 MSK 2021
It's not about cmd, it's about BAT.
Signed-off-by: Kirill Tkhai <ktkhai at virtuozzo.com>
---
drivers/md/dm-ploop-bat.c | 108 +++++++++++++++++++++++++++++++++++++++++++++
drivers/md/dm-ploop-cmd.c | 106 --------------------------------------------
2 files changed, 108 insertions(+), 106 deletions(-)
diff --git a/drivers/md/dm-ploop-bat.c b/drivers/md/dm-ploop-bat.c
index 8226411c2dc8..fd2b841e540c 100644
--- a/drivers/md/dm-ploop-bat.c
+++ b/drivers/md/dm-ploop-bat.c
@@ -1,4 +1,5 @@
#include <linux/init.h>
+#include <linux/file.h>
#include <linux/uio.h>
#include <linux/mm.h>
#include "dm-ploop.h"
@@ -407,3 +408,110 @@ int ploop_read_delta_metadata(struct ploop *ploop, struct file *file,
put_page(page);
return ret;
}
+
+static int apply_delta_mappings(struct ploop *ploop, struct ploop_delta *deltas,
+ void *hdr, u64 size_in_clus)
+{
+ map_index_t *bat_entries, *delta_bat_entries;
+ unsigned int i, end, level, dst_cluster;
+ struct rb_node *node;
+ struct md_page *md;
+ bool is_raw;
+
+ level = ploop->nr_deltas;
+ /* Points to hdr since md_page[0] also contains hdr. */
+ delta_bat_entries = (map_index_t *)hdr;
+ is_raw = deltas[level].is_raw;
+
+ write_lock_irq(&ploop->bat_rwlock);
+
+ /* FIXME: Stop on old delta's nr_bat_entries */
+ ploop_for_each_md_page(ploop, md, node) {
+ init_bat_entries_iter(ploop, md->id, &i, &end);
+ bat_entries = kmap_atomic(md->page);
+ for (; i <= end; i++) {
+ if (md_page_cluster_is_in_top_delta(md, i))
+ continue;
+ if (!is_raw)
+ dst_cluster = delta_bat_entries[i];
+ else {
+ dst_cluster = page_clu_idx_to_bat_clu(md->id, i);
+ if (dst_cluster >= size_in_clus)
+ dst_cluster = BAT_ENTRY_NONE;
+ }
+ if (dst_cluster == BAT_ENTRY_NONE)
+ continue;
+ /*
+ * Prefer last added delta, since the order is:
+ * 1)add top device
+ * 2)add oldest delta
+ * ...
+ * n)add newest delta
+ * Keep in mind, top device is current image, and
+ * it is added first in contrary the "age" order.
+ */
+ md->bat_levels[i] = level;
+ bat_entries[i] = dst_cluster;
+
+ }
+ kunmap_atomic(bat_entries);
+ delta_bat_entries += PAGE_SIZE / sizeof(map_index_t);
+ }
+
+ ploop->nr_deltas++;
+ write_unlock_irq(&ploop->bat_rwlock);
+
+ get_file(ploop->deltas[level].file);
+ return 0;
+}
+
+static int ploop_check_delta_length(struct ploop *ploop, struct file *file,
+ u64 *size_in_clus)
+{
+ loff_t loff = i_size_read(file->f_mapping->host);
+ unsigned int cluster_log = ploop->cluster_log;
+
+ if (loff & ((1 << (cluster_log + SECTOR_SHIFT)) - 1))
+ return -EPROTO;
+ *size_in_clus = loff >> (cluster_log + SECTOR_SHIFT);
+ return 0;
+}
+
+/*
+ * @fd refers to a new delta, which is placed right before top_delta.
+ * So, userspace has to populate deltas stack from oldest to newest.
+ */
+int ploop_add_delta(struct ploop *ploop, int fd, bool is_raw)
+{
+ struct ploop_delta *deltas = ploop->deltas;
+ unsigned int level = ploop->nr_deltas;
+ struct file *file;
+ u64 size_in_clus;
+ void *hdr = NULL;
+ int ret;
+
+ file = fget(fd);
+ if (!file)
+ return -ENOENT;
+ ret = -EBADF;
+ if (!(file->f_mode & FMODE_READ))
+ goto out;
+
+ deltas[level].file = file;
+ deltas[level].is_raw = is_raw;
+
+ ret = ploop_check_delta_length(ploop, file, &size_in_clus);
+ if (ret)
+ goto out;
+
+ if (!is_raw)
+ ret = ploop_read_delta_metadata(ploop, file, &hdr);
+ if (ret)
+ goto out;
+
+ ret = apply_delta_mappings(ploop, deltas, hdr, size_in_clus);
+out:
+ vfree(hdr);
+ fput(file);
+ return ret;
+}
diff --git a/drivers/md/dm-ploop-cmd.c b/drivers/md/dm-ploop-cmd.c
index ff696065fdb7..8485236e3460 100644
--- a/drivers/md/dm-ploop-cmd.c
+++ b/drivers/md/dm-ploop-cmd.c
@@ -571,112 +571,6 @@ static int ploop_resize(struct ploop *ploop, u64 new_size)
return ret;
}
-static int apply_delta_mappings(struct ploop *ploop, struct ploop_delta *deltas,
- void *hdr, u64 size_in_clus)
-{
- map_index_t *bat_entries, *delta_bat_entries;
- unsigned int i, end, level, dst_cluster;
- struct rb_node *node;
- struct md_page *md;
- bool is_raw;
-
- level = ploop->nr_deltas;
- /* Points to hdr since md_page[0] also contains hdr. */
- delta_bat_entries = (map_index_t *)hdr;
- is_raw = deltas[level].is_raw;
-
- write_lock_irq(&ploop->bat_rwlock);
-
- /* FIXME: Stop on old delta's nr_bat_entries */
- ploop_for_each_md_page(ploop, md, node) {
- init_bat_entries_iter(ploop, md->id, &i, &end);
- bat_entries = kmap_atomic(md->page);
- for (; i <= end; i++) {
- if (md_page_cluster_is_in_top_delta(md, i))
- continue;
- if (!is_raw)
- dst_cluster = delta_bat_entries[i];
- else {
- dst_cluster = page_clu_idx_to_bat_clu(md->id, i);
- if (dst_cluster >= size_in_clus)
- dst_cluster = BAT_ENTRY_NONE;
- }
- if (dst_cluster == BAT_ENTRY_NONE)
- continue;
- /*
- * Prefer last added delta, since the order is:
- * 1)add top device
- * 2)add oldest delta
- * ...
- * n)add newest delta
- * Keep in mind, top device is current image, and
- * it is added first in contrary the "age" order.
- */
- md->bat_levels[i] = level;
- bat_entries[i] = dst_cluster;
-
- }
- kunmap_atomic(bat_entries);
- delta_bat_entries += PAGE_SIZE / sizeof(map_index_t);
- }
-
- ploop->nr_deltas++;
- write_unlock_irq(&ploop->bat_rwlock);
-
- get_file(ploop->deltas[level].file);
- return 0;
-}
-
-static int ploop_check_delta_length(struct ploop *ploop, struct file *file,
- u64 *size_in_clus)
-{
- loff_t loff = i_size_read(file->f_mapping->host);
- unsigned int cluster_log = ploop->cluster_log;
-
- if (loff & ((1 << (cluster_log + SECTOR_SHIFT)) - 1))
- return -EPROTO;
- *size_in_clus = loff >> (cluster_log + SECTOR_SHIFT);
- return 0;
-}
-
-/*
- * @fd refers to a new delta, which is placed right before top_delta.
- * So, userspace has to populate deltas stack from oldest to newest.
- */
-int ploop_add_delta(struct ploop *ploop, int fd, bool is_raw)
-{
- struct ploop_delta *deltas = ploop->deltas;
- unsigned int level = ploop->nr_deltas;
- struct file *file;
- u64 size_in_clus;
- void *hdr = NULL;
- int ret;
-
- file = fget(fd);
- if (!file)
- return -ENOENT;
- ret = -EBADF;
- if (!(file->f_mode & FMODE_READ))
- goto out;
-
- deltas[level].file = file;
- deltas[level].is_raw = is_raw;
-
- ret = ploop_check_delta_length(ploop, file, &size_in_clus);
- if (ret)
- goto out;
-
- if (!is_raw)
- ret = ploop_read_delta_metadata(ploop, file, &hdr);
- if (ret)
- goto out;
-
- ret = apply_delta_mappings(ploop, deltas, hdr, size_in_clus);
-out:
- vfree(hdr);
- fput(file);
- return ret;
-}
static void ploop_queue_deferred_cmd_wrapper(struct ploop *ploop,
int ret, void *data)
{
More information about the Devel
mailing list