/*
 * Copyright (C) 2013 Red Hat, Inc. All rights reserved.
 *
 * This file is part of LVM2.
 *
 * This copyrighted material is made available to anyone wishing to use,
 * modify, copy, or redistribute it subject to the terms and conditions
 * of the GNU Lesser General Public License v.2.1.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with this program; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 */

#include "lvm_prop.h"
#include "libdevmapper.h"
#include "metadata.h"

/* lv create parameters */
GET_LVCREATEPARAMS_NUM_PROPERTY_FN(skip_zero, lvcp->zero)
SET_LVCREATEPARAMS_NUM_PROPERTY_FN(skip_zero, lvcp->zero)

/* PV create parameters */
GET_PVCREATEPARAMS_NUM_PROPERTY_FN(size, pvcp->pva.size)
SET_PVCREATEPARAMS_NUM_PROPERTY_FN(size, pvcp->pva.size)

GET_PVCREATEPARAMS_NUM_PROPERTY_FN(pvmetadatacopies, pvcp->pva.pvmetadatacopies)
SET_PVCREATEPARAMS_NUM_PROPERTY_FN(pvmetadatacopies, pvcp->pva.pvmetadatacopies)

GET_PVCREATEPARAMS_NUM_PROPERTY_FN(pvmetadatasize, pvcp->pva.pvmetadatasize)
SET_PVCREATEPARAMS_NUM_PROPERTY_FN(pvmetadatasize, pvcp->pva.pvmetadatasize)

GET_PVCREATEPARAMS_NUM_PROPERTY_FN(data_alignment, pvcp->pva.data_alignment)
SET_PVCREATEPARAMS_NUM_PROPERTY_FN(data_alignment, pvcp->pva.data_alignment)

GET_PVCREATEPARAMS_NUM_PROPERTY_FN(data_alignment_offset, pvcp->pva.data_alignment_offset)
SET_PVCREATEPARAMS_NUM_PROPERTY_FN(data_alignment_offset, pvcp->pva.data_alignment_offset)

GET_PVCREATEPARAMS_NUM_PROPERTY_FN(zero, pvcp->zero)
SET_PVCREATEPARAMS_NUM_PROPERTY_FN(zero, pvcp->zero)

struct lvm_property_type _lib_properties[] = {
#include "lvm_prop_fields.h"
	{ 0, "", 0, 0, 0, 0, { .integer = 0 }, prop_not_implemented_get,
			prop_not_implemented_set },
};

#undef STR
#undef NUM
#undef FIELD

int lv_create_param_get_property(const struct lvcreate_params *lvcp,
		struct lvm_property_type *prop)
{
	return prop_get_property(_lib_properties, lvcp, prop, LV_CREATE_PARAMS);
}

int lv_create_param_set_property(struct lvcreate_params *lvcp,
		    struct lvm_property_type *prop)
{
	return prop_set_property(_lib_properties, lvcp, prop, LV_CREATE_PARAMS);
}

int pv_create_param_get_property(const struct pvcreate_params *pvcp,
		struct lvm_property_type *prop)
{
	return prop_get_property(_lib_properties, pvcp, prop, PV_CREATE_PARAMS);
}

int pv_create_param_set_property(struct pvcreate_params *pvcp,
		    struct lvm_property_type *prop)
{
	return prop_set_property(_lib_properties, pvcp, prop, PV_CREATE_PARAMS);
}
