mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-02-01 17:35:17 +00:00
storage: Add API to check accessibility of storage volumes
Add a storage driver API equivalent of the access() function. Implementations for the filesystem and gluster backends are provided.
This commit is contained in:
parent
684ec651e9
commit
4cb2505557
@ -198,6 +198,10 @@ typedef ssize_t
|
||||
typedef const char *
|
||||
(*virStorageFileBackendGetUniqueIdentifier)(virStorageSourcePtr src);
|
||||
|
||||
typedef int
|
||||
(*virStorageFileBackendAccess)(virStorageSourcePtr src,
|
||||
int mode);
|
||||
|
||||
virStorageFileBackendPtr virStorageFileBackendForType(int type, int protocol);
|
||||
|
||||
|
||||
@ -220,6 +224,7 @@ struct _virStorageFileBackend {
|
||||
virStorageFileBackendCreate storageFileCreate;
|
||||
virStorageFileBackendUnlink storageFileUnlink;
|
||||
virStorageFileBackendStat storageFileStat;
|
||||
virStorageFileBackendAccess storageFileAccess;
|
||||
};
|
||||
|
||||
#endif /* __VIR_STORAGE_BACKEND_H__ */
|
||||
|
@ -1433,6 +1433,15 @@ virStorageFileBackendFileGetUniqueIdentifier(virStorageSourcePtr src)
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
virStorageFileBackendFileAccess(virStorageSourcePtr src,
|
||||
int mode)
|
||||
{
|
||||
return virFileAccessibleAs(src->path, mode,
|
||||
src->drv->uid, src->drv->gid);
|
||||
}
|
||||
|
||||
|
||||
virStorageFileBackend virStorageFileBackendFile = {
|
||||
.type = VIR_STORAGE_TYPE_FILE,
|
||||
|
||||
@ -1442,6 +1451,7 @@ virStorageFileBackend virStorageFileBackendFile = {
|
||||
.storageFileUnlink = virStorageFileBackendFileUnlink,
|
||||
.storageFileStat = virStorageFileBackendFileStat,
|
||||
.storageFileReadHeader = virStorageFileBackendFileReadHeader,
|
||||
.storageFileAccess = virStorageFileBackendFileAccess,
|
||||
|
||||
.storageFileGetUniqueIdentifier = virStorageFileBackendFileGetUniqueIdentifier,
|
||||
};
|
||||
@ -1455,6 +1465,7 @@ virStorageFileBackend virStorageFileBackendBlock = {
|
||||
|
||||
.storageFileStat = virStorageFileBackendFileStat,
|
||||
.storageFileReadHeader = virStorageFileBackendFileReadHeader,
|
||||
.storageFileAccess = virStorageFileBackendFileAccess,
|
||||
|
||||
.storageFileGetUniqueIdentifier = virStorageFileBackendFileGetUniqueIdentifier,
|
||||
};
|
||||
@ -1466,6 +1477,8 @@ virStorageFileBackend virStorageFileBackendDir = {
|
||||
.backendInit = virStorageFileBackendFileInit,
|
||||
.backendDeinit = virStorageFileBackendFileDeinit,
|
||||
|
||||
.storageFileAccess = virStorageFileBackendFileAccess,
|
||||
|
||||
.storageFileGetUniqueIdentifier = virStorageFileBackendFileGetUniqueIdentifier,
|
||||
};
|
||||
|
||||
|
@ -703,6 +703,16 @@ virStorageFileBackendGlusterReadHeader(virStorageSourcePtr src,
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
virStorageFileBackendGlusterAccess(virStorageSourcePtr src,
|
||||
int mode)
|
||||
{
|
||||
virStorageFileBackendGlusterPrivPtr priv = src->drv->priv;
|
||||
|
||||
return glfs_access(priv->vol, src->path, mode);
|
||||
}
|
||||
|
||||
|
||||
virStorageFileBackend virStorageFileBackendGluster = {
|
||||
.type = VIR_STORAGE_TYPE_NETWORK,
|
||||
.protocol = VIR_STORAGE_NET_PROTOCOL_GLUSTER,
|
||||
@ -713,4 +723,5 @@ virStorageFileBackend virStorageFileBackendGluster = {
|
||||
.storageFileUnlink = virStorageFileBackendGlusterUnlink,
|
||||
.storageFileStat = virStorageFileBackendGlusterStat,
|
||||
.storageFileReadHeader = virStorageFileBackendGlusterReadHeader,
|
||||
.storageFileAccess = virStorageFileBackendGlusterAccess,
|
||||
};
|
||||
|
@ -3017,3 +3017,27 @@ virStorageFileGetUniqueIdentifier(virStorageSourcePtr src)
|
||||
|
||||
return src->drv->backend->storageFileGetUniqueIdentifier(src);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* virStorageFileAccess: Check accessibility of a storage file
|
||||
*
|
||||
* @src: storage file to check access permissions
|
||||
* @mode: accessibility check options (see man 2 access)
|
||||
*
|
||||
* Returns 0 on success, -1 on error and sets errno. No libvirt
|
||||
* error is reported. Returns -2 if the operation isn't supported
|
||||
* by libvirt storage backend.
|
||||
*/
|
||||
int
|
||||
virStorageFileAccess(virStorageSourcePtr src,
|
||||
int mode)
|
||||
{
|
||||
if (!virStorageFileIsInitialized(src) ||
|
||||
!src->drv->backend->storageFileAccess) {
|
||||
errno = ENOSYS;
|
||||
return -2;
|
||||
}
|
||||
|
||||
return src->drv->backend->storageFileAccess(src, mode);
|
||||
}
|
||||
|
@ -42,6 +42,7 @@ ssize_t virStorageFileReadHeader(virStorageSourcePtr src,
|
||||
ssize_t max_len,
|
||||
char **buf);
|
||||
const char *virStorageFileGetUniqueIdentifier(virStorageSourcePtr src);
|
||||
int virStorageFileAccess(virStorageSourcePtr src, int mode);
|
||||
|
||||
int storageRegister(void);
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user