xref: /spdk/module/bdev/lvol/vbdev_lvol.h (revision e0d7428b482257aa6999b8b4cc44159dcc292df9)
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