Signed-off-by: Kirill Tkhai <ktk...@virtuozzo.com>
---
 drivers/md/dm-ploop-bat.c |   71 +++++++++++++--------------------------------
 1 file changed, 21 insertions(+), 50 deletions(-)

diff --git a/drivers/md/dm-ploop-bat.c b/drivers/md/dm-ploop-bat.c
index ad9c3a171dc9..ae6b4628d813 100644
--- a/drivers/md/dm-ploop-bat.c
+++ b/drivers/md/dm-ploop-bat.c
@@ -314,15 +314,13 @@ int ploop_setup_metadata(struct ploop *ploop, struct page 
*page)
        return ret;
 }
 
-static int ploop_delta_check_header(struct ploop *ploop, struct page *page,
-                      unsigned int *nr_pages, unsigned int *last_page_len)
+static int ploop_delta_check_header(struct ploop *ploop,
+                                   struct ploop_pvd_header *d_hdr,
+                                   u32 *delta_nr_be_ret)
 {
        unsigned int bytes, delta_nr_be, offset_clusters, bat_clusters;
-       struct ploop_pvd_header *d_hdr;
        int ret = -EPROTO;
 
-       d_hdr = kmap(page);
-
        if (memcmp(d_hdr->m_Sig, ploop->m_Sig, sizeof(d_hdr->m_Sig)) ||
            d_hdr->m_Sectors != ploop->m_Sectors ||
            d_hdr->m_Type != ploop->m_Type)
@@ -337,12 +335,9 @@ static int ploop_delta_check_header(struct ploop *ploop, 
struct page *page,
            bat_clusters != offset_clusters)
                goto out;
 
-       *nr_pages = DIV_ROUND_UP(bytes, PAGE_SIZE);
-       bytes &= ~PAGE_MASK;
-       *last_page_len = bytes ? : PAGE_SIZE;
+       *delta_nr_be_ret = delta_nr_be;
        ret = 0;
 out:
-       kunmap(page);
        return ret;
 }
 
@@ -363,69 +358,45 @@ int convert_bat_entries(u32 *bat_entries, u32 count)
 int ploop_read_delta_metadata(struct ploop *ploop, struct file *file,
                              void **d_hdr)
 {
-       unsigned int i, last_page_len, size, nr_pages = 1;
-       unsigned int *delta_bat_entries;
+       u32 size, delta_nr_be, *delta_bat_entries;
        struct iov_iter iter;
-       struct bio_vec bvec;
-       struct page *page;
+       struct kvec kvec;
        ssize_t len;
-       void *from;
        loff_t pos;
        int ret;
 
-       page = alloc_page(GFP_KERNEL);
-       if (!page)
-               return -ENOMEM;
-
        size = (PLOOP_MAP_OFFSET + ploop->nr_bat_entries) * sizeof(map_index_t);
        *d_hdr = vzalloc(size);
        if (!*d_hdr) {
                ret = -ENOMEM;
-               goto out_put_page;
+               goto out;
        }
 
-       for (i = 0; i < nr_pages; i++) {
-               bvec.bv_page = page;
-               bvec.bv_len = PAGE_SIZE;
-               bvec.bv_offset = 0;
+       kvec.iov_base = *d_hdr;
+       kvec.iov_len = size;
 
-               iov_iter_bvec(&iter, READ, &bvec, 1, bvec.bv_len);
-               pos = i << PAGE_SHIFT;
-
-               len = vfs_iter_read(file, &iter, &pos, 0);
-               if (len != PAGE_SIZE) {
-                       ret = len < 0 ? (int)len : -ENODATA;
-                       goto out_vfree;
-               }
+       iov_iter_kvec(&iter, READ, &kvec, 1, kvec.iov_len);
+       pos = 0;
 
-               if (i == 0) {
-                       /* First page with header. Updates nr_pages. */
-                       ret = ploop_delta_check_header(ploop, page,
-                                       &nr_pages, &last_page_len);
-                       if (ret)
-                               goto out_vfree;
-               }
-
-               if (i + 1 == nr_pages) {
-                       /* Last page, possible, incomplete */
-                       len = last_page_len;
-               }
-
-               from = kmap(page);
-               memcpy(*d_hdr + (i << PAGE_SHIFT), from, len);
-               kunmap(page);
+       len = vfs_iter_read(file, &iter, &pos, 0);
+       if (len != size) {
+               ret = len < 0 ? (int)len : -ENODATA;
+               goto out_vfree;
        }
 
+       ret = ploop_delta_check_header(ploop, *d_hdr, &delta_nr_be);
+       if (ret)
+               goto out_vfree;
+
        delta_bat_entries = *d_hdr + PLOOP_MAP_OFFSET * sizeof(map_index_t);
-       ret = convert_bat_entries(delta_bat_entries, ploop->nr_bat_entries);
+       ret = convert_bat_entries(delta_bat_entries, delta_nr_be);
 
 out_vfree:
        if (ret) {
                vfree(*d_hdr);
                *d_hdr = NULL;
        }
-out_put_page:
-       put_page(page);
+out:
        return ret;
 }
 


_______________________________________________
Devel mailing list
Devel@openvz.org
https://lists.openvz.org/mailman/listinfo/devel

Reply via email to