mirror of
https://github.com/libvirt/libvirt.git
synced 2025-02-25 18:55:26 -06: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 *
|
typedef const char *
|
||||||
(*virStorageFileBackendGetUniqueIdentifier)(virStorageSourcePtr src);
|
(*virStorageFileBackendGetUniqueIdentifier)(virStorageSourcePtr src);
|
||||||
|
|
||||||
|
typedef int
|
||||||
|
(*virStorageFileBackendAccess)(virStorageSourcePtr src,
|
||||||
|
int mode);
|
||||||
|
|
||||||
virStorageFileBackendPtr virStorageFileBackendForType(int type, int protocol);
|
virStorageFileBackendPtr virStorageFileBackendForType(int type, int protocol);
|
||||||
|
|
||||||
|
|
||||||
@ -220,6 +224,7 @@ struct _virStorageFileBackend {
|
|||||||
virStorageFileBackendCreate storageFileCreate;
|
virStorageFileBackendCreate storageFileCreate;
|
||||||
virStorageFileBackendUnlink storageFileUnlink;
|
virStorageFileBackendUnlink storageFileUnlink;
|
||||||
virStorageFileBackendStat storageFileStat;
|
virStorageFileBackendStat storageFileStat;
|
||||||
|
virStorageFileBackendAccess storageFileAccess;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* __VIR_STORAGE_BACKEND_H__ */
|
#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 = {
|
virStorageFileBackend virStorageFileBackendFile = {
|
||||||
.type = VIR_STORAGE_TYPE_FILE,
|
.type = VIR_STORAGE_TYPE_FILE,
|
||||||
|
|
||||||
@ -1442,6 +1451,7 @@ virStorageFileBackend virStorageFileBackendFile = {
|
|||||||
.storageFileUnlink = virStorageFileBackendFileUnlink,
|
.storageFileUnlink = virStorageFileBackendFileUnlink,
|
||||||
.storageFileStat = virStorageFileBackendFileStat,
|
.storageFileStat = virStorageFileBackendFileStat,
|
||||||
.storageFileReadHeader = virStorageFileBackendFileReadHeader,
|
.storageFileReadHeader = virStorageFileBackendFileReadHeader,
|
||||||
|
.storageFileAccess = virStorageFileBackendFileAccess,
|
||||||
|
|
||||||
.storageFileGetUniqueIdentifier = virStorageFileBackendFileGetUniqueIdentifier,
|
.storageFileGetUniqueIdentifier = virStorageFileBackendFileGetUniqueIdentifier,
|
||||||
};
|
};
|
||||||
@ -1455,6 +1465,7 @@ virStorageFileBackend virStorageFileBackendBlock = {
|
|||||||
|
|
||||||
.storageFileStat = virStorageFileBackendFileStat,
|
.storageFileStat = virStorageFileBackendFileStat,
|
||||||
.storageFileReadHeader = virStorageFileBackendFileReadHeader,
|
.storageFileReadHeader = virStorageFileBackendFileReadHeader,
|
||||||
|
.storageFileAccess = virStorageFileBackendFileAccess,
|
||||||
|
|
||||||
.storageFileGetUniqueIdentifier = virStorageFileBackendFileGetUniqueIdentifier,
|
.storageFileGetUniqueIdentifier = virStorageFileBackendFileGetUniqueIdentifier,
|
||||||
};
|
};
|
||||||
@ -1466,6 +1477,8 @@ virStorageFileBackend virStorageFileBackendDir = {
|
|||||||
.backendInit = virStorageFileBackendFileInit,
|
.backendInit = virStorageFileBackendFileInit,
|
||||||
.backendDeinit = virStorageFileBackendFileDeinit,
|
.backendDeinit = virStorageFileBackendFileDeinit,
|
||||||
|
|
||||||
|
.storageFileAccess = virStorageFileBackendFileAccess,
|
||||||
|
|
||||||
.storageFileGetUniqueIdentifier = virStorageFileBackendFileGetUniqueIdentifier,
|
.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 = {
|
virStorageFileBackend virStorageFileBackendGluster = {
|
||||||
.type = VIR_STORAGE_TYPE_NETWORK,
|
.type = VIR_STORAGE_TYPE_NETWORK,
|
||||||
.protocol = VIR_STORAGE_NET_PROTOCOL_GLUSTER,
|
.protocol = VIR_STORAGE_NET_PROTOCOL_GLUSTER,
|
||||||
@ -713,4 +723,5 @@ virStorageFileBackend virStorageFileBackendGluster = {
|
|||||||
.storageFileUnlink = virStorageFileBackendGlusterUnlink,
|
.storageFileUnlink = virStorageFileBackendGlusterUnlink,
|
||||||
.storageFileStat = virStorageFileBackendGlusterStat,
|
.storageFileStat = virStorageFileBackendGlusterStat,
|
||||||
.storageFileReadHeader = virStorageFileBackendGlusterReadHeader,
|
.storageFileReadHeader = virStorageFileBackendGlusterReadHeader,
|
||||||
|
.storageFileAccess = virStorageFileBackendGlusterAccess,
|
||||||
};
|
};
|
||||||
|
@ -3017,3 +3017,27 @@ virStorageFileGetUniqueIdentifier(virStorageSourcePtr src)
|
|||||||
|
|
||||||
return src->drv->backend->storageFileGetUniqueIdentifier(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,
|
ssize_t max_len,
|
||||||
char **buf);
|
char **buf);
|
||||||
const char *virStorageFileGetUniqueIdentifier(virStorageSourcePtr src);
|
const char *virStorageFileGetUniqueIdentifier(virStorageSourcePtr src);
|
||||||
|
int virStorageFileAccess(virStorageSourcePtr src, int mode);
|
||||||
|
|
||||||
int storageRegister(void);
|
int storageRegister(void);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user