1d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin/*
2fd72def91cb5849335f3b249fc048d66e4301bcfNaseer Ahmed * Copyright (c) 2012-2017, The Linux Foundation. All rights reserved.
3d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin *
4d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin * Redistribution and use in source and binary forms, with or without
5d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin * modification, are permitted provided that the following conditions are
6d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin * met:
7d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin *     * Redistributions of source code must retain the above copyright
8d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin *       notice, this list of conditions and the following disclaimer.
9d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin *     * Redistributions in binary form must reproduce the above
10d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin *       copyright notice, this list of conditions and the following
11d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin *       disclaimer in the documentation and/or other materials provided
12d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin *       with the distribution.
13d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin *     * Neither the name of The Linux Foundation nor the names of its
14d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin *       contributors may be used to endorse or promote products derived
15d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin *       from this software without specific prior written permission.
16d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin *
17d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
18d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
19d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
20d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
21d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
24d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
25d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
26d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
27d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin */
29d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin
30d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin#include <errno.h>
31d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin#include <string.h>
32d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin#include <sys/mman.h>
33d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin#include <cutils/log.h>
34d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin#include <gralloc_priv.h>
35d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin#include <inttypes.h>
36d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin#include "qdMetaData.h"
37d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin
38a8ef6bc5761a81de073e64a0eb4ad3a95dc80883Naseer Ahmedstatic int validateAndMap(private_handle_t* handle) {
39a8ef6bc5761a81de073e64a0eb4ad3a95dc80883Naseer Ahmed    if (private_handle_t::validate(handle)) {
40a8ef6bc5761a81de073e64a0eb4ad3a95dc80883Naseer Ahmed        ALOGE("%s: Private handle is invalid - handle:%p id: %" PRIu64,
41a8ef6bc5761a81de073e64a0eb4ad3a95dc80883Naseer Ahmed                __func__, handle, handle->id);
42d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin        return -1;
43d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin    }
44d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin    if (handle->fd_metadata == -1) {
45a8ef6bc5761a81de073e64a0eb4ad3a95dc80883Naseer Ahmed        ALOGE("%s: Invalid metadata fd - handle:%p id: %" PRIu64 "fd: %d",
46a8ef6bc5761a81de073e64a0eb4ad3a95dc80883Naseer Ahmed                __func__, handle, handle->id, handle->fd_metadata);
47d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin        return -1;
48d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin    }
49a8ef6bc5761a81de073e64a0eb4ad3a95dc80883Naseer Ahmed
50a8ef6bc5761a81de073e64a0eb4ad3a95dc80883Naseer Ahmed    if (!handle->base_metadata) {
51a8ef6bc5761a81de073e64a0eb4ad3a95dc80883Naseer Ahmed        unsigned long size = ROUND_UP_PAGESIZE(sizeof(MetaData_t));
52a8ef6bc5761a81de073e64a0eb4ad3a95dc80883Naseer Ahmed        void *base = mmap(NULL, size, PROT_READ|PROT_WRITE, MAP_SHARED,
53a8ef6bc5761a81de073e64a0eb4ad3a95dc80883Naseer Ahmed                handle->fd_metadata, 0);
54a8ef6bc5761a81de073e64a0eb4ad3a95dc80883Naseer Ahmed        if (base == reinterpret_cast<void*>(MAP_FAILED)) {
55a8ef6bc5761a81de073e64a0eb4ad3a95dc80883Naseer Ahmed            ALOGE("%s: metadata mmap failed - handle:%p id: %" PRIu64  "fd: %d err: %s",
56a8ef6bc5761a81de073e64a0eb4ad3a95dc80883Naseer Ahmed                __func__, handle, handle->id, handle->fd_metadata, strerror(errno));
57a8ef6bc5761a81de073e64a0eb4ad3a95dc80883Naseer Ahmed
58a8ef6bc5761a81de073e64a0eb4ad3a95dc80883Naseer Ahmed            return -1;
59a8ef6bc5761a81de073e64a0eb4ad3a95dc80883Naseer Ahmed        }
60a8ef6bc5761a81de073e64a0eb4ad3a95dc80883Naseer Ahmed        handle->base_metadata = (uintptr_t) base;
61d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin    }
62a8ef6bc5761a81de073e64a0eb4ad3a95dc80883Naseer Ahmed    return 0;
63a8ef6bc5761a81de073e64a0eb4ad3a95dc80883Naseer Ahmed}
64a8ef6bc5761a81de073e64a0eb4ad3a95dc80883Naseer Ahmed
65a8ef6bc5761a81de073e64a0eb4ad3a95dc80883Naseer Ahmedint setMetaData(private_handle_t *handle, DispParamType paramType,
66a8ef6bc5761a81de073e64a0eb4ad3a95dc80883Naseer Ahmed                                                    void *param) {
67a8ef6bc5761a81de073e64a0eb4ad3a95dc80883Naseer Ahmed    auto err = validateAndMap(handle);
68a8ef6bc5761a81de073e64a0eb4ad3a95dc80883Naseer Ahmed    if (err != 0)
69a8ef6bc5761a81de073e64a0eb4ad3a95dc80883Naseer Ahmed        return err;
70a8ef6bc5761a81de073e64a0eb4ad3a95dc80883Naseer Ahmed
71a8ef6bc5761a81de073e64a0eb4ad3a95dc80883Naseer Ahmed    MetaData_t *data = reinterpret_cast <MetaData_t *>(handle->base_metadata);
72a8ef6bc5761a81de073e64a0eb4ad3a95dc80883Naseer Ahmed    // If parameter is NULL reset the specific MetaData Key
73a8ef6bc5761a81de073e64a0eb4ad3a95dc80883Naseer Ahmed    if (!param) {
74a8ef6bc5761a81de073e64a0eb4ad3a95dc80883Naseer Ahmed       data->operation &= ~paramType;
75a8ef6bc5761a81de073e64a0eb4ad3a95dc80883Naseer Ahmed       // reset param
76a8ef6bc5761a81de073e64a0eb4ad3a95dc80883Naseer Ahmed       return 0;
77d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin    }
78a8ef6bc5761a81de073e64a0eb4ad3a95dc80883Naseer Ahmed
79d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin    data->operation |= paramType;
80d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin    switch (paramType) {
81d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin        case PP_PARAM_INTERLACED:
82d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin            data->interlaced = *((int32_t *)param);
83d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin            break;
84d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin        case UPDATE_BUFFER_GEOMETRY:
85d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin            data->bufferDim = *((BufferDim_t *)param);
86d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin            break;
87d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin        case UPDATE_REFRESH_RATE:
8852af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch            data->refreshrate = *((float *)param);
89d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin            break;
90d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin        case UPDATE_COLOR_SPACE:
91d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin            data->colorSpace = *((ColorSpace_t *)param);
92d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin            break;
93d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin        case MAP_SECURE_BUFFER:
94d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin            data->mapSecureBuffer = *((int32_t *)param);
95d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin            break;
96d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin        case S3D_FORMAT:
97d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin            data->s3dFormat = *((uint32_t *)param);
98d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin            break;
99d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin        case LINEAR_FORMAT:
100d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin            data->linearFormat = *((uint32_t *)param);
101d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin            break;
102d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin        case SET_IGC:
103d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin            data->igc = *((IGC_t *)param);
104d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin            break;
105d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin        case SET_SINGLE_BUFFER_MODE:
106d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin            data->isSingleBufferMode = *((uint32_t *)param);
107d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin            break;
108860d7f049aea6fd9c7b16da78d6a44a59d33415eRoopesh Rajashekharaiah Nataraja        case SET_VT_TIMESTAMP:
109860d7f049aea6fd9c7b16da78d6a44a59d33415eRoopesh Rajashekharaiah Nataraja            data->vtTimeStamp = *((uint64_t *)param);
110860d7f049aea6fd9c7b16da78d6a44a59d33415eRoopesh Rajashekharaiah Nataraja            break;
111d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin        default:
112d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin            ALOGE("Unknown paramType %d", paramType);
113d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin            break;
114d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin    }
115d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin    return 0;
116d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin}
11752af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch
11852af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetschint getMetaData(private_handle_t *handle, DispFetchParamType paramType,
11952af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch                                                    void *param) {
120a8ef6bc5761a81de073e64a0eb4ad3a95dc80883Naseer Ahmed    int ret = validateAndMap(handle);
121a8ef6bc5761a81de073e64a0eb4ad3a95dc80883Naseer Ahmed    if (ret != 0)
122a8ef6bc5761a81de073e64a0eb4ad3a95dc80883Naseer Ahmed        return ret;
123a8ef6bc5761a81de073e64a0eb4ad3a95dc80883Naseer Ahmed    MetaData_t *data = reinterpret_cast <MetaData_t *>(handle->base_metadata);
124a8ef6bc5761a81de073e64a0eb4ad3a95dc80883Naseer Ahmed    // Make sure we send 0 only if the operation queried is present
125a8ef6bc5761a81de073e64a0eb4ad3a95dc80883Naseer Ahmed    ret = -EINVAL;
12652af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch
12752af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch    switch (paramType) {
12852af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch        case GET_PP_PARAM_INTERLACED:
129fd72def91cb5849335f3b249fc048d66e4301bcfNaseer Ahmed            if (data->operation & PP_PARAM_INTERLACED) {
130fd72def91cb5849335f3b249fc048d66e4301bcfNaseer Ahmed                *((int32_t *)param) = data->interlaced;
131fd72def91cb5849335f3b249fc048d66e4301bcfNaseer Ahmed                ret = 0;
132fd72def91cb5849335f3b249fc048d66e4301bcfNaseer Ahmed            }
13352af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch            break;
13452af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch        case GET_BUFFER_GEOMETRY:
135fd72def91cb5849335f3b249fc048d66e4301bcfNaseer Ahmed            if (data->operation & UPDATE_BUFFER_GEOMETRY) {
136fd72def91cb5849335f3b249fc048d66e4301bcfNaseer Ahmed                *((BufferDim_t *)param) = data->bufferDim;
137fd72def91cb5849335f3b249fc048d66e4301bcfNaseer Ahmed                ret = 0;
138fd72def91cb5849335f3b249fc048d66e4301bcfNaseer Ahmed            }
13952af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch            break;
14052af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch        case GET_REFRESH_RATE:
141fd72def91cb5849335f3b249fc048d66e4301bcfNaseer Ahmed            if (data->operation & UPDATE_REFRESH_RATE) {
142fd72def91cb5849335f3b249fc048d66e4301bcfNaseer Ahmed                *((float *)param) = data->refreshrate;
143fd72def91cb5849335f3b249fc048d66e4301bcfNaseer Ahmed                ret = 0;
144fd72def91cb5849335f3b249fc048d66e4301bcfNaseer Ahmed            }
14552af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch            break;
14652af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch        case GET_COLOR_SPACE:
147fd72def91cb5849335f3b249fc048d66e4301bcfNaseer Ahmed            if (data->operation & UPDATE_COLOR_SPACE) {
148fd72def91cb5849335f3b249fc048d66e4301bcfNaseer Ahmed                *((ColorSpace_t *)param) = data->colorSpace;
149fd72def91cb5849335f3b249fc048d66e4301bcfNaseer Ahmed                ret = 0;
150fd72def91cb5849335f3b249fc048d66e4301bcfNaseer Ahmed            }
15152af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch            break;
15252af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch        case GET_MAP_SECURE_BUFFER:
153fd72def91cb5849335f3b249fc048d66e4301bcfNaseer Ahmed            if (data->operation & MAP_SECURE_BUFFER) {
154fd72def91cb5849335f3b249fc048d66e4301bcfNaseer Ahmed                *((int32_t *)param) = data->mapSecureBuffer;
155fd72def91cb5849335f3b249fc048d66e4301bcfNaseer Ahmed                ret = 0;
156fd72def91cb5849335f3b249fc048d66e4301bcfNaseer Ahmed            }
15752af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch            break;
15852af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch        case GET_S3D_FORMAT:
159fd72def91cb5849335f3b249fc048d66e4301bcfNaseer Ahmed            if (data->operation & S3D_FORMAT) {
160fd72def91cb5849335f3b249fc048d66e4301bcfNaseer Ahmed                *((uint32_t *)param) = data->s3dFormat;
161fd72def91cb5849335f3b249fc048d66e4301bcfNaseer Ahmed                ret = 0;
162fd72def91cb5849335f3b249fc048d66e4301bcfNaseer Ahmed            }
16352af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch            break;
16452af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch        case GET_LINEAR_FORMAT:
165fd72def91cb5849335f3b249fc048d66e4301bcfNaseer Ahmed            if (data->operation & LINEAR_FORMAT) {
166fd72def91cb5849335f3b249fc048d66e4301bcfNaseer Ahmed                *((uint32_t *)param) = data->linearFormat;
167fd72def91cb5849335f3b249fc048d66e4301bcfNaseer Ahmed                ret = 0;
168fd72def91cb5849335f3b249fc048d66e4301bcfNaseer Ahmed            }
16952af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch            break;
17052af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch        case GET_IGC:
171fd72def91cb5849335f3b249fc048d66e4301bcfNaseer Ahmed            if (data->operation & SET_IGC) {
172fd72def91cb5849335f3b249fc048d66e4301bcfNaseer Ahmed                *((IGC_t *)param) = data->igc;
173fd72def91cb5849335f3b249fc048d66e4301bcfNaseer Ahmed                ret = 0;
174fd72def91cb5849335f3b249fc048d66e4301bcfNaseer Ahmed            }
17552af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch            break;
17652af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch        case GET_SINGLE_BUFFER_MODE:
177fd72def91cb5849335f3b249fc048d66e4301bcfNaseer Ahmed            if (data->operation & SET_SINGLE_BUFFER_MODE) {
178fd72def91cb5849335f3b249fc048d66e4301bcfNaseer Ahmed                *((uint32_t *)param) = data->isSingleBufferMode;
179fd72def91cb5849335f3b249fc048d66e4301bcfNaseer Ahmed                ret = 0;
180fd72def91cb5849335f3b249fc048d66e4301bcfNaseer Ahmed            }
18152af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch            break;
182860d7f049aea6fd9c7b16da78d6a44a59d33415eRoopesh Rajashekharaiah Nataraja        case GET_VT_TIMESTAMP:
183fd72def91cb5849335f3b249fc048d66e4301bcfNaseer Ahmed            if (data->operation & SET_VT_TIMESTAMP) {
184fd72def91cb5849335f3b249fc048d66e4301bcfNaseer Ahmed                *((uint64_t *)param) = data->vtTimeStamp;
185fd72def91cb5849335f3b249fc048d66e4301bcfNaseer Ahmed                ret = 0;
186fd72def91cb5849335f3b249fc048d66e4301bcfNaseer Ahmed            }
187860d7f049aea6fd9c7b16da78d6a44a59d33415eRoopesh Rajashekharaiah Nataraja            break;
18852af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch        default:
18952af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch            ALOGE("Unknown paramType %d", paramType);
19052af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch            break;
19152af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch    }
192fd72def91cb5849335f3b249fc048d66e4301bcfNaseer Ahmed    return ret;
19352af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch}
19452af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch
19552af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetschint copyMetaData(struct private_handle_t *src, struct private_handle_t *dst) {
196a8ef6bc5761a81de073e64a0eb4ad3a95dc80883Naseer Ahmed    auto err = validateAndMap(src);
197a8ef6bc5761a81de073e64a0eb4ad3a95dc80883Naseer Ahmed    if (err != 0)
198a8ef6bc5761a81de073e64a0eb4ad3a95dc80883Naseer Ahmed        return err;
19952af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch
200a8ef6bc5761a81de073e64a0eb4ad3a95dc80883Naseer Ahmed    err = validateAndMap(dst);
201a8ef6bc5761a81de073e64a0eb4ad3a95dc80883Naseer Ahmed    if (err != 0)
202a8ef6bc5761a81de073e64a0eb4ad3a95dc80883Naseer Ahmed        return err;
20352af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch
204a8ef6bc5761a81de073e64a0eb4ad3a95dc80883Naseer Ahmed    unsigned long size = ROUND_UP_PAGESIZE(sizeof(MetaData_t));
205a8ef6bc5761a81de073e64a0eb4ad3a95dc80883Naseer Ahmed    MetaData_t *src_data = reinterpret_cast <MetaData_t *>(src->base_metadata);
206a8ef6bc5761a81de073e64a0eb4ad3a95dc80883Naseer Ahmed    MetaData_t *dst_data = reinterpret_cast <MetaData_t *>(dst->base_metadata);
207a8ef6bc5761a81de073e64a0eb4ad3a95dc80883Naseer Ahmed    memcpy(src_data, dst_data, size);
20852af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch    return 0;
20952af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch}
210