mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-12-24 22:55:23 +00:00
storage: Add storage file backends for gluster
Implement storage backend functions to deal with gluster volumes and implement the "stat" and "unlink" backend APIs.
This commit is contained in:
parent
e62d09b155
commit
a44b7b87bc
@ -126,6 +126,9 @@ static virStorageFileBackendPtr fileBackends[] = {
|
|||||||
#if WITH_STORAGE_FS
|
#if WITH_STORAGE_FS
|
||||||
&virStorageFileBackendFile,
|
&virStorageFileBackendFile,
|
||||||
&virStorageFileBackendBlock,
|
&virStorageFileBackendBlock,
|
||||||
|
#endif
|
||||||
|
#if WITH_STORAGE_GLUSTER
|
||||||
|
&virStorageFileBackendGluster,
|
||||||
#endif
|
#endif
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
@ -477,3 +477,142 @@ virStorageBackend virStorageBackendGluster = {
|
|||||||
|
|
||||||
.deleteVol = virStorageBackendGlusterVolDelete,
|
.deleteVol = virStorageBackendGlusterVolDelete,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct _virStorageFileBackendGlusterPriv virStorageFileBackendGlusterPriv;
|
||||||
|
typedef virStorageFileBackendGlusterPriv *virStorageFileBackendGlusterPrivPtr;
|
||||||
|
|
||||||
|
struct _virStorageFileBackendGlusterPriv {
|
||||||
|
glfs_t *vol;
|
||||||
|
char *volname;
|
||||||
|
char *path;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
static void
|
||||||
|
virStorageFileBackendGlusterDeinit(virStorageFilePtr file)
|
||||||
|
{
|
||||||
|
VIR_DEBUG("deinitializing gluster storage file %p(%s/%s)",
|
||||||
|
file, file->hosts[0].name, file->path);
|
||||||
|
virStorageFileBackendGlusterPrivPtr priv = file->priv;
|
||||||
|
|
||||||
|
glfs_fini(priv->vol);
|
||||||
|
VIR_FREE(priv->volname);
|
||||||
|
|
||||||
|
VIR_FREE(priv);
|
||||||
|
file->priv = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
virStorageFileBackendGlusterInit(virStorageFilePtr file)
|
||||||
|
{
|
||||||
|
virStorageFileBackendGlusterPrivPtr priv = NULL;
|
||||||
|
virDomainDiskHostDefPtr host = &(file->hosts[0]);
|
||||||
|
const char *hostname = host->name;
|
||||||
|
int port = 0;
|
||||||
|
|
||||||
|
VIR_DEBUG("initializing gluster storage file %p(%s/%s)",
|
||||||
|
file, hostname, file->path);
|
||||||
|
|
||||||
|
if (VIR_ALLOC(priv) < 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
if (VIR_STRDUP(priv->volname, file->path) < 0)
|
||||||
|
goto error;
|
||||||
|
|
||||||
|
if (!(priv->path = strchr(priv->volname, '/'))) {
|
||||||
|
virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||||
|
_("invalid path of gluster volume: '%s'"),
|
||||||
|
file->path);
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
|
*priv->path = '\0';
|
||||||
|
priv->path++;
|
||||||
|
|
||||||
|
if (host->port &&
|
||||||
|
virStrToLong_i(host->port, NULL, 10, &port) < 0) {
|
||||||
|
virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||||
|
_("failed to parse port number '%s'"),
|
||||||
|
host->port);
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (host->transport == VIR_DOMAIN_DISK_PROTO_TRANS_UNIX)
|
||||||
|
hostname = host->socket;
|
||||||
|
|
||||||
|
|
||||||
|
if (!(priv->vol = glfs_new(priv->volname))) {
|
||||||
|
virReportOOMError();
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (glfs_set_volfile_server(priv->vol,
|
||||||
|
virDomainDiskProtocolTransportTypeToString(host->transport),
|
||||||
|
hostname, port) < 0) {
|
||||||
|
virReportSystemError(errno,
|
||||||
|
_("failed to set gluster volfile server '%s'"),
|
||||||
|
hostname);
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (glfs_init(priv->vol) < 0) {
|
||||||
|
virReportSystemError(errno,
|
||||||
|
_("failed to initialize gluster connection to "
|
||||||
|
"server: '%s'"), hostname);
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
|
file->priv = priv;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
error:
|
||||||
|
VIR_FREE(priv->volname);
|
||||||
|
glfs_fini(priv->vol);
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int
|
||||||
|
virStorageFileBackendGlusterUnlink(virStorageFilePtr file)
|
||||||
|
{
|
||||||
|
virStorageFileBackendGlusterPrivPtr priv = file->priv;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
ret = glfs_unlink(priv->vol, priv->path);
|
||||||
|
/* preserve errno */
|
||||||
|
|
||||||
|
VIR_DEBUG("removing storage file %p(%s/%s): ret=%d, errno=%d",
|
||||||
|
file, file->hosts[0].name, file->path, ret, errno);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int
|
||||||
|
virStorageFileBackendGlusterStat(virStorageFilePtr file,
|
||||||
|
struct stat *st)
|
||||||
|
{
|
||||||
|
virStorageFileBackendGlusterPrivPtr priv = file->priv;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
ret = glfs_stat(priv->vol, priv->path, st);
|
||||||
|
/* preserve errno */
|
||||||
|
|
||||||
|
VIR_DEBUG("stat of storage file %p(%s/%s): ret=%d, errno=%d",
|
||||||
|
file, file->hosts[0].name, file->path, ret, errno);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
virStorageFileBackend virStorageFileBackendGluster = {
|
||||||
|
.type = VIR_DOMAIN_DISK_TYPE_NETWORK,
|
||||||
|
.protocol = VIR_DOMAIN_DISK_PROTOCOL_GLUSTER,
|
||||||
|
|
||||||
|
.backendInit = virStorageFileBackendGlusterInit,
|
||||||
|
.backendDeinit = virStorageFileBackendGlusterDeinit,
|
||||||
|
|
||||||
|
.storageFileUnlink = virStorageFileBackendGlusterUnlink,
|
||||||
|
.storageFileStat = virStorageFileBackendGlusterStat,
|
||||||
|
};
|
||||||
|
@ -25,5 +25,6 @@
|
|||||||
# include "storage_backend.h"
|
# include "storage_backend.h"
|
||||||
|
|
||||||
extern virStorageBackend virStorageBackendGluster;
|
extern virStorageBackend virStorageBackendGluster;
|
||||||
|
extern virStorageFileBackend virStorageFileBackendGluster;
|
||||||
|
|
||||||
#endif /* __VIR_STORAGE_BACKEND_GLUSTER_H__ */
|
#endif /* __VIR_STORAGE_BACKEND_GLUSTER_H__ */
|
||||||
|
Loading…
Reference in New Issue
Block a user