1488570ebSJim Harris /* SPDX-License-Identifier: BSD-3-Clause 2a6dbe372Spaul luse * Copyright (C) 2017 Intel Corporation. 307fe6a43SSeth Howell * All rights reserved. 454b4f4ddSMike Gerdts * Copyright (c) 2022-2023 NVIDIA CORPORATION & AFFILIATES. All rights reserved. 507fe6a43SSeth Howell */ 607fe6a43SSeth Howell 707fe6a43SSeth Howell #ifndef SPDK_VBDEV_LVOL_H 807fe6a43SSeth Howell #define SPDK_VBDEV_LVOL_H 907fe6a43SSeth Howell 1007fe6a43SSeth Howell #include "spdk/lvol.h" 1107fe6a43SSeth Howell #include "spdk/bdev_module.h" 12ad5fc351STomasz Zawadzki #include "spdk/blob_bdev.h" 1307fe6a43SSeth Howell 1407fe6a43SSeth Howell #include "spdk_internal/lvolstore.h" 1507fe6a43SSeth Howell 1607fe6a43SSeth Howell struct lvol_store_bdev { 1707fe6a43SSeth Howell struct spdk_lvol_store *lvs; 1807fe6a43SSeth Howell struct spdk_bdev *bdev; 1907fe6a43SSeth Howell struct spdk_lvs_req *req; 2008650f86SMike Gerdts bool removal_in_progress; 2107fe6a43SSeth Howell 2207fe6a43SSeth Howell TAILQ_ENTRY(lvol_store_bdev) lvol_stores; 2307fe6a43SSeth Howell }; 2407fe6a43SSeth Howell 25b556e43eSTomasz Zawadzki struct lvol_bdev { 26b556e43eSTomasz Zawadzki struct spdk_bdev bdev; 27b556e43eSTomasz Zawadzki struct spdk_lvol *lvol; 28d2dd4743STomasz Zawadzki struct lvol_store_bdev *lvs_bdev; 29b556e43eSTomasz Zawadzki }; 30b556e43eSTomasz Zawadzki 31b6cbf872SShuhei Matsumoto int vbdev_lvs_create(const char *base_bdev_name, const char *name, uint32_t cluster_sz, 3288833020Syupeng enum lvs_clear_method clear_method, uint32_t num_md_pages_per_cluster_ratio, 3388833020Syupeng spdk_lvs_op_with_handle_complete cb_fn, void *cb_arg); 34*e0d7428bSAtul Malakar int vbdev_lvs_create_ext(const char *base_bdev_name, const char *name, uint32_t cluster_sz, 35*e0d7428bSAtul Malakar enum lvs_clear_method clear_method, uint32_t num_md_pages_per_cluster_ratio, 36*e0d7428bSAtul Malakar uint32_t md_page_size, spdk_lvs_op_with_handle_complete cb_fn, void *cb_arg); 3707fe6a43SSeth Howell void vbdev_lvs_destruct(struct spdk_lvol_store *lvs, spdk_lvs_op_complete cb_fn, void *cb_arg); 3807fe6a43SSeth Howell void vbdev_lvs_unload(struct spdk_lvol_store *lvs, spdk_lvs_op_complete cb_fn, void *cb_arg); 3907fe6a43SSeth Howell 4007fe6a43SSeth Howell int vbdev_lvol_create(struct spdk_lvol_store *lvs, const char *name, uint64_t sz, 4107fe6a43SSeth Howell bool thin_provisioned, enum lvol_clear_method clear_method, 4207fe6a43SSeth Howell spdk_lvol_op_with_handle_complete cb_fn, 4307fe6a43SSeth Howell void *cb_arg); 4407fe6a43SSeth Howell 4507fe6a43SSeth Howell void vbdev_lvol_create_snapshot(struct spdk_lvol *lvol, const char *snapshot_name, 4607fe6a43SSeth Howell spdk_lvol_op_with_handle_complete cb_fn, void *cb_arg); 4707fe6a43SSeth Howell 4807fe6a43SSeth Howell void vbdev_lvol_create_clone(struct spdk_lvol *lvol, const char *clone_name, 4907fe6a43SSeth Howell spdk_lvol_op_with_handle_complete cb_fn, void *cb_arg); 5054b4f4ddSMike Gerdts void vbdev_lvol_create_bdev_clone(const char *esnap_uuid, 5154b4f4ddSMike Gerdts struct spdk_lvol_store *lvs, const char *clone_name, 5254b4f4ddSMike Gerdts spdk_lvol_op_with_handle_complete cb_fn, void *cb_arg); 5307fe6a43SSeth Howell 5407fe6a43SSeth Howell /** 5507fe6a43SSeth Howell * \brief Change size of lvol 5607fe6a43SSeth Howell * \param lvol Handle to lvol 5707fe6a43SSeth Howell * \param sz Size of lvol to change 5807fe6a43SSeth Howell * \param cb_fn Completion callback 5907fe6a43SSeth Howell * \param cb_arg Completion callback custom arguments 6007fe6a43SSeth Howell * \return error 6107fe6a43SSeth Howell */ 6207fe6a43SSeth Howell void vbdev_lvol_resize(struct spdk_lvol *lvol, uint64_t sz, spdk_lvol_op_complete cb_fn, 6307fe6a43SSeth Howell void *cb_arg); 6407fe6a43SSeth Howell 6507fe6a43SSeth Howell /** 6607fe6a43SSeth Howell * \brief Mark lvol as read only 6707fe6a43SSeth Howell * \param lvol Handle to lvol 6807fe6a43SSeth Howell * \param cb_fn Completion callback 6907fe6a43SSeth Howell * \param cb_arg Completion callback custom arguments 7007fe6a43SSeth Howell */ 7107fe6a43SSeth Howell void vbdev_lvol_set_read_only(struct spdk_lvol *lvol, spdk_lvol_op_complete cb_fn, void *cb_arg); 7207fe6a43SSeth Howell 7307fe6a43SSeth Howell void vbdev_lvol_rename(struct spdk_lvol *lvol, const char *new_lvol_name, 7407fe6a43SSeth Howell spdk_lvol_op_complete cb_fn, void *cb_arg); 7507fe6a43SSeth Howell 7607fe6a43SSeth Howell /** 7707fe6a43SSeth Howell * Destroy a logical volume 7807fe6a43SSeth Howell * \param lvol Handle to lvol 7907fe6a43SSeth Howell * \param cb_fn Completion callback 8007fe6a43SSeth Howell * \param cb_arg Completion callback custom arguments 8107fe6a43SSeth Howell */ 8207fe6a43SSeth Howell void vbdev_lvol_destroy(struct spdk_lvol *lvol, spdk_lvol_op_complete cb_fn, void *cb_arg); 8307fe6a43SSeth Howell 8407fe6a43SSeth Howell /** 8507fe6a43SSeth Howell * \brief Renames given lvolstore. 8607fe6a43SSeth Howell * 8707fe6a43SSeth Howell * \param lvs Pointer to lvolstore 8807fe6a43SSeth Howell * \param new_name New name of lvs 8907fe6a43SSeth Howell * \param cb_fn Completion callback 9007fe6a43SSeth Howell * \param cb_arg Completion callback custom arguments 9107fe6a43SSeth Howell */ 9207fe6a43SSeth Howell void vbdev_lvs_rename(struct spdk_lvol_store *lvs, const char *new_lvs_name, 9307fe6a43SSeth Howell spdk_lvs_op_complete cb_fn, void *cb_arg); 9407fe6a43SSeth Howell 9507fe6a43SSeth Howell /** 9607fe6a43SSeth Howell * \brief Search for handle lvolstore 9707fe6a43SSeth Howell * \param uuid_str UUID of lvolstore 9807fe6a43SSeth Howell * \return Handle to spdk_lvol_store or NULL if not found. 9907fe6a43SSeth Howell */ 10007fe6a43SSeth Howell struct spdk_lvol_store *vbdev_get_lvol_store_by_uuid(const char *uuid_str); 10107fe6a43SSeth Howell 10207fe6a43SSeth Howell /** 10307fe6a43SSeth Howell * \brief Search for handle to lvolstore 10407fe6a43SSeth Howell * \param name name of lvolstore 10507fe6a43SSeth Howell * \return Handle to spdk_lvol_store or NULL if not found. 10607fe6a43SSeth Howell */ 10707fe6a43SSeth Howell struct spdk_lvol_store *vbdev_get_lvol_store_by_name(const char *name); 10807fe6a43SSeth Howell 10907fe6a43SSeth Howell /** 11007fe6a43SSeth Howell * \brief Search for handle to lvol_store_bdev 11107fe6a43SSeth Howell * \param lvs handle to lvolstore 11207fe6a43SSeth Howell * \return Handle to lvol_store_bdev or NULL if not found. 11307fe6a43SSeth Howell */ 11407fe6a43SSeth Howell struct lvol_store_bdev *vbdev_get_lvs_bdev_by_lvs(struct spdk_lvol_store *lvs); 11507fe6a43SSeth Howell 11607fe6a43SSeth Howell struct spdk_lvol *vbdev_lvol_get_from_bdev(struct spdk_bdev *bdev); 11707fe6a43SSeth Howell 1180c31b86aSMike Gerdts int vbdev_lvol_esnap_dev_create(void *bs_ctx, void *blob_ctx, struct spdk_blob *blob, 1190c31b86aSMike Gerdts const void *esnap_id, uint32_t id_len, 1200c31b86aSMike Gerdts struct spdk_bs_dev **_bs_dev); 1210c31b86aSMike Gerdts 1224210a752SDamiano Cipriani /** 1234210a752SDamiano Cipriani * \brief Make a shallow copy of lvol over a bdev 1244210a752SDamiano Cipriani * 1254210a752SDamiano Cipriani * \param lvol Handle to lvol 1264210a752SDamiano Cipriani * \param bdev_name Name of the bdev to copy on 1274210a752SDamiano Cipriani * \param status_cb_fn Called repeatedly during operation with status updates 1284210a752SDamiano Cipriani * \param status_cb_arg Argument passed to function status_cb_fn. 1294210a752SDamiano Cipriani * \param cb_fn Completion callback 1304210a752SDamiano Cipriani * \param cb_arg Completion callback custom arguments 1314210a752SDamiano Cipriani * 1324210a752SDamiano Cipriani * \return 0 if operation starts correctly, negative errno on failure. 1334210a752SDamiano Cipriani */ 1344210a752SDamiano Cipriani int vbdev_lvol_shallow_copy(struct spdk_lvol *lvol, const char *bdev_name, 1354210a752SDamiano Cipriani spdk_blob_shallow_copy_status status_cb_fn, void *status_cb_arg, 1364210a752SDamiano Cipriani spdk_lvol_op_complete cb_fn, void *cb_arg); 1374210a752SDamiano Cipriani 138d68cc1e9SDamiano Cipriani /** 139d68cc1e9SDamiano Cipriani * \brief Set an external snapshot as the parent of a lvol. 140d68cc1e9SDamiano Cipriani * 141d68cc1e9SDamiano Cipriani * \param lvol Handle to lvol 142d68cc1e9SDamiano Cipriani * \param esnap_name Name of the bdev that acts as external snapshot 143d68cc1e9SDamiano Cipriani * \param cb_fn Completion callback 144d68cc1e9SDamiano Cipriani * \param cb_arg Completion callback custom arguments 145d68cc1e9SDamiano Cipriani */ 146d68cc1e9SDamiano Cipriani void vbdev_lvol_set_external_parent(struct spdk_lvol *lvol, const char *esnap_name, 147d68cc1e9SDamiano Cipriani spdk_lvol_op_complete cb_fn, void *cb_arg); 148d68cc1e9SDamiano Cipriani 14907fe6a43SSeth Howell #endif /* SPDK_VBDEV_LVOL_H */ 150