[libvirt] [PATCH v2] storage: add wipeVol to iscsi-direct storage backend

Michal Privoznik mprivozn at redhat.com
Fri Aug 10 14:10:49 UTC 2018


On 08/10/2018 03:33 PM, clem at lse.epita.fr wrote:
> From: Clementine Hayat <clem at lse.epita.fr>
> 
> Change set volume capacity to get volume capacity and put the connection
> and helpers in one function to avoid code duplicates.
> 
> Signed-off-by: Clementine Hayat <clem at lse.epita.fr>
> ---
> 
> Set BLOCK_PER_PACKET to 128. Not sure about this value. Should be
> potentially tuned.
> 
>  src/storage/storage_backend_iscsi_direct.c | 173 ++++++++++++++++++---
>  1 file changed, 152 insertions(+), 21 deletions(-)

Apart from Jano's comments ....

> 
> diff --git a/src/storage/storage_backend_iscsi_direct.c b/src/storage/storage_backend_iscsi_direct.c
> index 0764356b62..958f5937f9 100644
> --- a/src/storage/storage_backend_iscsi_direct.c
> +++ b/src/storage/storage_backend_iscsi_direct.c
> @@ -41,6 +41,8 @@
>  
>  #define ISCSI_DEFAULT_TARGET_PORT 3260
>  #define VIR_ISCSI_TEST_UNIT_TIMEOUT 30 * 1000
> +#define BLOCK_PER_PACKET 128
> +#define VOL_NAME_PREFIX "unit:0:0:"
>  
>  VIR_LOG_INIT("storage.storage_backend_iscsi_direct");
>  
> @@ -225,7 +227,7 @@ virISCSIDirectSetVolumeAttributes(virStoragePoolObjPtr pool,
>  {
>      virStoragePoolDefPtr def = virStoragePoolObjGetDef(pool);
>  
> -    if (virAsprintf(&vol->name, "unit:0:0:%u", lun) < 0)
> +    if (virAsprintf(&vol->name, "%s%u", VOL_NAME_PREFIX, lun) < 0)
>          return -1;
>      if (virAsprintf(&vol->key, "ip-%s-iscsi-%s-lun-%u", portal,
>                      def->source.devices[0].path, lun) < 0)
> @@ -237,13 +239,13 @@ virISCSIDirectSetVolumeAttributes(virStoragePoolObjPtr pool,
>  }
>  
>  static int
> -virISCSIDirectSetVolumeCapacity(struct iscsi_context *iscsi,
> -                                virStorageVolDefPtr vol,
> -                                int lun)
> +virISCSIDirectGetVolumeCapacity(struct iscsi_context *iscsi,
> +                                int lun,
> +                                uint32_t *block_size,
> +                                uint32_t *nb_block)
>  {
>      struct scsi_task *task = NULL;
>      struct scsi_inquiry_standard *inq = NULL;
> -    long long size = 0;
>      int ret = -1;
>  
>      if (!(task = iscsi_inquiry_sync(iscsi, lun, 0, 0, 64)) ||
> @@ -282,10 +284,8 @@ virISCSIDirectSetVolumeCapacity(struct iscsi_context *iscsi,
>              goto cleanup;
>          }
>  
> -        size  = rc10->block_size;
> -        size *= rc10->lba;
> -        vol->target.capacity = size;
> -        vol->target.allocation = size;
> +        *block_size  = rc10->block_size;
> +        *nb_block = rc10->lba;
>  
>      }
>  
> @@ -303,6 +303,8 @@ virISCSIDirectRefreshVol(virStoragePoolObjPtr pool,
>  {
>      virStoragePoolDefPtr def = virStoragePoolObjGetDef(pool);
>      virStorageVolDefPtr vol = NULL;
> +    uint32_t block_size;
> +    uint32_t nb_block;
>      int ret = -1;
>  
>      virStoragePoolObjClearVols(pool);
> @@ -314,9 +316,12 @@ virISCSIDirectRefreshVol(virStoragePoolObjPtr pool,
>  
>      vol->type = VIR_STORAGE_VOL_NETWORK;
>  
> -    if (virISCSIDirectSetVolumeCapacity(iscsi, vol, lun) < 0)
> +    if (virISCSIDirectGetVolumeCapacity(iscsi, lun,
> +                                        &block_size, &nb_block) < 0)
>          goto cleanup;
>  
> +    vol->target.capacity = block_size * nb_block;
> +    vol->target.allocation = block_size * nb_block;
>      def->capacity += vol->target.capacity;
>      def->allocation += vol->target.allocation;
>  
> @@ -553,24 +558,33 @@ virStorageBackendISCSIDirectFindPoolSources(const char *srcSpec,
>      virStoragePoolSourceFree(source);
>      return ret;
>  }
> +static int
> +virStorageBackendISCSIDirectSetConnection(virStoragePoolObjPtr pool,
> +                                          struct iscsi_context **iscsi,
> +                                          char **portal)
> +{
> +    virStoragePoolDefPtr def = virStoragePoolObjGetDef(pool);
> +
> +    if (!(*iscsi = virISCSIDirectCreateContext(def->source.initiator.iqn)))
> +        return -1;
> +    if (!(*portal = virStorageBackendISCSIDirectPortal(&def->source)))
> +        return -1;
> +    if (virStorageBackendISCSIDirectSetAuth(*iscsi, &def->source) < 0)
> +        return -1;
> +    if (virISCSIDirectSetContext(*iscsi, def->source.devices[0].path, ISCSI_SESSION_NORMAL) < 0)
> +        return -1;
> +    if (virISCSIDirectConnect(*iscsi, *portal) < 0)
> +        return -1;
> +    return 0;

This function can return iscsi directly. And can accept @portal to be
NULL (in which case caller says "I don't care about portal").

Apart from that the patch looks good.

Michal




More information about the libvir-list mailing list