storage_backend.h 11.9 KB
Newer Older
1 2 3
/*
 * storage_backend.h: internal storage driver backend contract
 *
4
 * Copyright (C) 2007-2010, 2012-2014 Red Hat, Inc.
5 6 7 8 9 10 11 12 13 14 15 16 17
 * Copyright (C) 2007-2008 Daniel P. Berrange
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
18
 * License along with this library.  If not, see
O
Osier Yang 已提交
19
 * <http://www.gnu.org/licenses/>.
20 21 22 23 24
 *
 * Author: Daniel P. Berrange <berrange@redhat.com>
 */

#ifndef __VIR_STORAGE_BACKEND_H__
25
# define __VIR_STORAGE_BACKEND_H__
26

E
Eric Blake 已提交
27 28
# include <sys/stat.h>

29 30
# include "internal.h"
# include "storage_conf.h"
31
# include "vircommand.h"
32
# include "storage_driver.h"
33

34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
typedef char * (*virStorageBackendFindPoolSources)(virConnectPtr conn,
                                                   const char *srcSpec,
                                                   unsigned int flags);
typedef int (*virStorageBackendCheckPool)(virConnectPtr conn,
                                          virStoragePoolObjPtr pool,
                                          bool *active);
typedef int (*virStorageBackendStartPool)(virConnectPtr conn,
                                          virStoragePoolObjPtr pool);
typedef int (*virStorageBackendBuildPool)(virConnectPtr conn,
                                          virStoragePoolObjPtr pool,
                                          unsigned int flags);
typedef int (*virStorageBackendRefreshPool)(virConnectPtr conn,
                                            virStoragePoolObjPtr pool);
typedef int (*virStorageBackendStopPool)(virConnectPtr conn,
                                         virStoragePoolObjPtr pool);
typedef int (*virStorageBackendDeletePool)(virConnectPtr conn,
                                           virStoragePoolObjPtr pool,
                                           unsigned int flags);
52
typedef int (*virStorageBackendBuildVol)(virConnectPtr conn,
53 54
                                         virStoragePoolObjPtr pool,
                                         virStorageVolDefPtr vol,
55
                                         unsigned int flags);
56 57 58 59 60 61 62 63 64 65 66 67 68 69
typedef int (*virStorageBackendCreateVol)(virConnectPtr conn,
                                          virStoragePoolObjPtr pool,
                                          virStorageVolDefPtr vol);
typedef int (*virStorageBackendRefreshVol)(virConnectPtr conn,
                                           virStoragePoolObjPtr pool,
                                           virStorageVolDefPtr vol);
typedef int (*virStorageBackendDeleteVol)(virConnectPtr conn,
                                          virStoragePoolObjPtr pool,
                                          virStorageVolDefPtr vol,
                                          unsigned int flags);
typedef int (*virStorageBackendBuildVolFrom)(virConnectPtr conn,
                                             virStoragePoolObjPtr pool,
                                             virStorageVolDefPtr origvol,
                                             virStorageVolDefPtr newvol,
70
                                             unsigned int flags);
71 72 73 74 75
typedef int (*virStorageBackendVolumeResize)(virConnectPtr conn,
                                             virStoragePoolObjPtr pool,
                                             virStorageVolDefPtr vol,
                                             unsigned long long capacity,
                                             unsigned int flags);
76 77 78 79 80 81 82 83 84 85 86 87 88 89
typedef int (*virStorageBackendVolumeDownload)(virConnectPtr conn,
                                               virStoragePoolObjPtr obj,
                                               virStorageVolDefPtr vol,
                                               virStreamPtr stream,
                                               unsigned long long offset,
                                               unsigned long long length,
                                               unsigned int flags);
typedef int (*virStorageBackendVolumeUpload)(virConnectPtr conn,
                                             virStoragePoolObjPtr obj,
                                             virStorageVolDefPtr vol,
                                             virStreamPtr stream,
                                             unsigned long long offset,
                                             unsigned long long len,
                                             unsigned int flags);
90

91 92
/* File creation/cloning functions used for cloning between backends */
int virStorageBackendCreateRaw(virConnectPtr conn,
93
                               virStoragePoolObjPtr pool,
94
                               virStorageVolDefPtr vol,
95 96 97
                               virStorageVolDefPtr inputvol,
                               unsigned int flags);
virStorageBackendBuildVolFrom
98
virStorageBackendGetBuildVolFromFunction(virStorageVolDefPtr vol,
99 100
                                         virStorageVolDefPtr inputvol);
int virStorageBackendFindFSImageTool(char **tool);
101
virStorageBackendBuildVolFrom
102
virStorageBackendFSImageToolTypeToFunc(int tool_type);
103

104 105 106 107
int virStorageBackendFindGlusterPoolSources(const char *host,
                                            int pooltype,
                                            virStoragePoolSourceListPtr list);

108 109 110 111 112 113 114 115 116 117 118 119 120 121
int virStorageBackendVolUploadLocal(virConnectPtr conn,
                                    virStoragePoolObjPtr pool,
                                    virStorageVolDefPtr vol,
                                    virStreamPtr stream,
                                    unsigned long long offset,
                                    unsigned long long len,
                                    unsigned int flags);
int virStorageBackendVolDownloadLocal(virConnectPtr conn,
                                      virStoragePoolObjPtr pool,
                                      virStorageVolDefPtr vol,
                                      virStreamPtr stream,
                                      unsigned long long offset,
                                      unsigned long long len,
                                      unsigned int flags);
122

123 124 125 126 127 128
int virStorageBackendVolWipeLocal(virConnectPtr conn,
                                  virStoragePoolObjPtr pool,
                                  virStorageVolDefPtr vol,
                                  unsigned int algorithm,
                                  unsigned int flags);

129 130 131
typedef struct _virStorageBackend virStorageBackend;
typedef virStorageBackend *virStorageBackendPtr;

132 133
/* Callbacks are optional unless documented otherwise; but adding more
 * callbacks provides better pool support.  */
134 135 136
struct _virStorageBackend {
    int type;

137
    virStorageBackendFindPoolSources findPoolSources;
138
    virStorageBackendCheckPool checkPool;
139 140
    virStorageBackendStartPool startPool;
    virStorageBackendBuildPool buildPool;
141
    virStorageBackendRefreshPool refreshPool; /* Must be non-NULL */
142 143 144
    virStorageBackendStopPool stopPool;
    virStorageBackendDeletePool deletePool;

145
    virStorageBackendBuildVol buildVol;
146
    virStorageBackendBuildVolFrom buildVolFrom;
147 148 149
    virStorageBackendCreateVol createVol;
    virStorageBackendRefreshVol refreshVol;
    virStorageBackendDeleteVol deleteVol;
150
    virStorageBackendVolumeResize resizeVol;
151 152
    virStorageBackendVolumeUpload uploadVol;
    virStorageBackendVolumeDownload downloadVol;
153 154 155
};

virStorageBackendPtr virStorageBackendForType(int type);
156

157 158
/* VolOpenCheckMode flags */
enum {
159 160 161 162 163 164
    VIR_STORAGE_VOL_OPEN_NOERROR = 1 << 0, /* don't error if unexpected type
                                            * encountered, just warn */
    VIR_STORAGE_VOL_OPEN_REG     = 1 << 1, /* regular files okay */
    VIR_STORAGE_VOL_OPEN_BLOCK   = 1 << 2, /* block files okay */
    VIR_STORAGE_VOL_OPEN_CHAR    = 1 << 3, /* char files okay */
    VIR_STORAGE_VOL_OPEN_DIR     = 1 << 4, /* directories okay */
165 166
};

167
# define VIR_STORAGE_VOL_OPEN_DEFAULT (VIR_STORAGE_VOL_OPEN_REG      |\
168
                                       VIR_STORAGE_VOL_OPEN_BLOCK)
169

170 171
int virStorageBackendVolOpen(const char *path, struct stat *sb,
                             unsigned int flags)
E
Eric Blake 已提交
172 173
    ATTRIBUTE_RETURN_CHECK
    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
174

175
int virStorageBackendUpdateVolInfo(virStorageVolDefPtr vol,
176
                                   bool updateCapacity,
177
                                   bool withBlockVolFormat,
178
                                   unsigned int openflags);
179
int virStorageBackendUpdateVolTargetInfo(virStorageSourcePtr target,
180
                                         bool updateCapacity,
181
                                         bool withBlockVolFormat,
182
                                         unsigned int openflags);
183
int virStorageBackendUpdateVolTargetInfoFD(virStorageSourcePtr target,
184
                                           int fd,
185 186
                                           struct stat *sb,
                                           bool updateCapacity);
187

188
char *virStorageBackendStablePath(virStoragePoolObjPtr pool,
189
                                  const char *devpath,
190
                                  bool loop);
191

192 193 194 195 196 197 198 199
virCommandPtr
virStorageBackendCreateQemuImgCmd(virConnectPtr conn,
                                  virStoragePoolObjPtr pool,
                                  virStorageVolDefPtr vol,
                                  virStorageVolDefPtr inputvol,
                                  unsigned int flags,
                                  const char *create_tool,
                                  int imgformat);
200

201
/* ------- virStorageFile backends ------------ */
202 203 204 205 206 207
typedef struct _virStorageFileBackend virStorageFileBackend;
typedef virStorageFileBackend *virStorageFileBackendPtr;

struct _virStorageDriverData {
    virStorageFileBackendPtr backend;
    void *priv;
208 209 210

    uid_t uid;
    gid_t gid;
211 212
};

213
typedef int
214
(*virStorageFileBackendInit)(virStorageSourcePtr src);
215 216

typedef void
217
(*virStorageFileBackendDeinit)(virStorageSourcePtr src);
218 219

typedef int
220
(*virStorageFileBackendCreate)(virStorageSourcePtr src);
221 222

typedef int
223
(*virStorageFileBackendUnlink)(virStorageSourcePtr src);
224 225

typedef int
226
(*virStorageFileBackendStat)(virStorageSourcePtr src,
227 228
                             struct stat *st);

229 230 231 232 233
typedef ssize_t
(*virStorageFileBackendReadHeader)(virStorageSourcePtr src,
                                   ssize_t max_len,
                                   char **buf);

234 235
typedef const char *
(*virStorageFileBackendGetUniqueIdentifier)(virStorageSourcePtr src);
236

237 238 239 240
typedef int
(*virStorageFileBackendAccess)(virStorageSourcePtr src,
                               int mode);

241
virStorageFileBackendPtr virStorageFileBackendForType(int type, int protocol);
242 243 244
virStorageFileBackendPtr virStorageFileBackendForTypeInternal(int type,
                                                              int protocol,
                                                              bool report);
245 246


247 248 249 250 251 252 253 254 255 256
struct _virStorageFileBackend {
    int type;
    int protocol;

    /* All storage file callbacks may be omitted if not implemented */

    /* The following group of callbacks is expected to set a libvirt
     * error on failure. */
    virStorageFileBackendInit backendInit;
    virStorageFileBackendDeinit backendDeinit;
257
    virStorageFileBackendReadHeader storageFileReadHeader;
258
    virStorageFileBackendGetUniqueIdentifier storageFileGetUniqueIdentifier;
259 260 261 262 263 264

    /* The following group of callbacks is expected to set errno
     * and return -1 on error. No libvirt error shall be reported */
    virStorageFileBackendCreate storageFileCreate;
    virStorageFileBackendUnlink storageFileUnlink;
    virStorageFileBackendStat   storageFileStat;
265
    virStorageFileBackendAccess storageFileAccess;
266 267
};

268
#endif /* __VIR_STORAGE_BACKEND_H__ */