From ebdea845f0ecec9db18d5cbec9d311ced4e90404 Mon Sep 17 00:00:00 2001 From: Hrudaya Date: Wed, 12 Jul 2023 10:12:19 +0000 Subject: [PATCH] fix(snapshot): reset num_used_clusters_cache when snapshot created from thin provisioned lvol Signed-off-by: Hrudaya --- include/spdk/blob.h | 9 +++++++++ lib/blob/blobstore.c | 18 +++++++++++++++--- lib/lvol/lvol.c | 6 ++++++ 3 files changed, 30 insertions(+), 3 deletions(-) diff --git a/include/spdk/blob.h b/include/spdk/blob.h index e955987a351..d244160e64c 100644 --- a/include/spdk/blob.h +++ b/include/spdk/blob.h @@ -485,6 +485,15 @@ uint64_t spdk_blob_get_next_unallocated_io_unit(struct spdk_blob *blob, uint64_t */ uint64_t spdk_blob_calc_used_clusters(struct spdk_blob *blob); +/** + * Reset num_used_clusters_cache, if blob is thin provisioned and snapshot is + * created from it. New snapshot will own the data, hence the clusted information + * present in the blob cache can be cleared. + * \param blob Blob struct to query + * \return void + */ +void spdk_blob_reset_used_clusters_cache(struct spdk_blob *blob); + struct spdk_blob_xattr_opts { /* Number of attributes */ size_t count; diff --git a/lib/blob/blobstore.c b/lib/blob/blobstore.c index 05f5081ad7b..3902cd7e67e 100644 --- a/lib/blob/blobstore.c +++ b/lib/blob/blobstore.c @@ -5789,6 +5789,15 @@ spdk_blob_calc_used_clusters(struct spdk_blob *blob) return num; } +void +spdk_blob_reset_used_clusters_cache(struct spdk_blob *blob) +{ + assert(blob != NULL); + if (spdk_blob_is_thin_provisioned(blob)) { + blob->num_used_clusters_cache = 0; + } +} + /* START spdk_bs_create_blob */ static void @@ -7845,7 +7854,8 @@ spdk_blob_io_writev(struct spdk_blob *blob, struct spdk_io_channel *channel, struct iovec *iov, int iovcnt, uint64_t offset, uint64_t length, spdk_blob_op_complete cb_fn, void *cb_arg) { - blob_request_submit_rw_iov(blob, channel, iov, iovcnt, offset, length, 0, cb_fn, cb_arg, false, NULL); + blob_request_submit_rw_iov(blob, channel, iov, iovcnt, offset, length, 0, cb_fn, cb_arg, false, + NULL); } void @@ -7853,7 +7863,8 @@ spdk_blob_io_readv(struct spdk_blob *blob, struct spdk_io_channel *channel, struct iovec *iov, int iovcnt, uint64_t offset, uint64_t length, uint32_t ext_io_flags, spdk_blob_op_complete cb_fn, void *cb_arg) { - blob_request_submit_rw_iov(blob, channel, iov, iovcnt, offset, length, ext_io_flags, cb_fn, cb_arg, true, NULL); + blob_request_submit_rw_iov(blob, channel, iov, iovcnt, offset, length, ext_io_flags, cb_fn, cb_arg, + true, NULL); } void @@ -7870,7 +7881,8 @@ spdk_blob_io_readv_ext(struct spdk_blob *blob, struct spdk_io_channel *channel, struct iovec *iov, int iovcnt, uint64_t offset, uint64_t length, uint32_t ext_io_flags, spdk_blob_op_complete cb_fn, void *cb_arg, struct spdk_blob_ext_io_opts *io_opts) { - blob_request_submit_rw_iov(blob, channel, iov, iovcnt, offset, length, ext_io_flags, cb_fn, cb_arg, true, + blob_request_submit_rw_iov(blob, channel, iov, iovcnt, offset, length, ext_io_flags, cb_fn, cb_arg, + true, io_opts); } diff --git a/lib/lvol/lvol.c b/lib/lvol/lvol.c index e0eba88915d..a456543114f 100644 --- a/lib/lvol/lvol.c +++ b/lib/lvol/lvol.c @@ -1213,6 +1213,12 @@ create_lvol_snapshot(struct spdk_lvol *origlvol, const char *snapshot_name, } origblob = origlvol->blob; + /* + * Reset used clusters cache if blob is thin provisioned and new snapshot + * is created from it. + */ + spdk_blob_reset_used_clusters_cache(origblob); + lvs = origlvol->lvol_store; if (lvs == NULL) { SPDK_ERRLOG("lvol store does not exist\n");