storage_backend.h 12.5 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 93 94
typedef int (*virStorageBackendVolumeWipe)(virConnectPtr conn,
                                           virStoragePoolObjPtr pool,
                                           virStorageVolDefPtr vol,
                                           unsigned int algorithm,
                                           unsigned int flags);
95

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

109 110 111 112
int virStorageBackendFindGlusterPoolSources(const char *host,
                                            int pooltype,
                                            virStoragePoolSourceListPtr list);

113 114 115 116 117 118 119 120 121 122 123 124 125 126
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);
127

128 129 130 131 132 133
int virStorageBackendVolWipeLocal(virConnectPtr conn,
                                  virStoragePoolObjPtr pool,
                                  virStorageVolDefPtr vol,
                                  unsigned int algorithm,
                                  unsigned int flags);

134 135 136
typedef struct _virStorageBackend virStorageBackend;
typedef virStorageBackend *virStorageBackendPtr;

137 138
/* Callbacks are optional unless documented otherwise; but adding more
 * callbacks provides better pool support.  */
139 140 141
struct _virStorageBackend {
    int type;

142
    virStorageBackendFindPoolSources findPoolSources;
143
    virStorageBackendCheckPool checkPool;
144 145
    virStorageBackendStartPool startPool;
    virStorageBackendBuildPool buildPool;
146
    virStorageBackendRefreshPool refreshPool; /* Must be non-NULL */
147 148 149
    virStorageBackendStopPool stopPool;
    virStorageBackendDeletePool deletePool;

150
    virStorageBackendBuildVol buildVol;
151
    virStorageBackendBuildVolFrom buildVolFrom;
152 153 154
    virStorageBackendCreateVol createVol;
    virStorageBackendRefreshVol refreshVol;
    virStorageBackendDeleteVol deleteVol;
155
    virStorageBackendVolumeResize resizeVol;
156 157
    virStorageBackendVolumeUpload uploadVol;
    virStorageBackendVolumeDownload downloadVol;
158
    virStorageBackendVolumeWipe wipeVol;
159 160 161
};

virStorageBackendPtr virStorageBackendForType(int type);
162

163 164
/* VolOpenCheckMode flags */
enum {
165 166 167 168 169 170
    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 */
171 172
};

173
# define VIR_STORAGE_VOL_OPEN_DEFAULT (VIR_STORAGE_VOL_OPEN_REG      |\
174
                                       VIR_STORAGE_VOL_OPEN_BLOCK)
175

176 177
int virStorageBackendVolOpen(const char *path, struct stat *sb,
                             unsigned int flags)
E
Eric Blake 已提交
178 179
    ATTRIBUTE_RETURN_CHECK
    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
180

181
int virStorageBackendUpdateVolInfo(virStorageVolDefPtr vol,
182
                                   bool updateCapacity,
183
                                   bool withBlockVolFormat,
184
                                   unsigned int openflags);
185
int virStorageBackendUpdateVolTargetInfo(virStorageSourcePtr target,
186
                                         bool updateCapacity,
187
                                         bool withBlockVolFormat,
188
                                         unsigned int openflags);
189
int virStorageBackendUpdateVolTargetInfoFD(virStorageSourcePtr target,
190
                                           int fd,
191 192
                                           struct stat *sb,
                                           bool updateCapacity);
193

194
char *virStorageBackendStablePath(virStoragePoolObjPtr pool,
195
                                  const char *devpath,
196
                                  bool loop);
197

198 199 200 201 202 203 204 205
virCommandPtr
virStorageBackendCreateQemuImgCmd(virConnectPtr conn,
                                  virStoragePoolObjPtr pool,
                                  virStorageVolDefPtr vol,
                                  virStorageVolDefPtr inputvol,
                                  unsigned int flags,
                                  const char *create_tool,
                                  int imgformat);
206

207
/* ------- virStorageFile backends ------------ */
208 209 210 211 212 213
typedef struct _virStorageFileBackend virStorageFileBackend;
typedef virStorageFileBackend *virStorageFileBackendPtr;

struct _virStorageDriverData {
    virStorageFileBackendPtr backend;
    void *priv;
214 215 216

    uid_t uid;
    gid_t gid;
217 218
};

219
typedef int
220
(*virStorageFileBackendInit)(virStorageSourcePtr src);
221 222

typedef void
223
(*virStorageFileBackendDeinit)(virStorageSourcePtr src);
224 225

typedef int
226
(*virStorageFileBackendCreate)(virStorageSourcePtr src);
227 228

typedef int
229
(*virStorageFileBackendUnlink)(virStorageSourcePtr src);
230 231

typedef int
232
(*virStorageFileBackendStat)(virStorageSourcePtr src,
233 234
                             struct stat *st);

235 236 237 238 239
typedef ssize_t
(*virStorageFileBackendReadHeader)(virStorageSourcePtr src,
                                   ssize_t max_len,
                                   char **buf);

240 241
typedef const char *
(*virStorageFileBackendGetUniqueIdentifier)(virStorageSourcePtr src);
242

243 244 245 246
typedef int
(*virStorageFileBackendAccess)(virStorageSourcePtr src,
                               int mode);

247 248 249 250 251
typedef int
(*virStorageFileBackendChown)(virStorageSourcePtr src,
                              uid_t uid,
                              gid_t gid);

252
virStorageFileBackendPtr virStorageFileBackendForType(int type, int protocol);
253 254 255
virStorageFileBackendPtr virStorageFileBackendForTypeInternal(int type,
                                                              int protocol,
                                                              bool report);
256 257


258 259 260 261 262 263 264 265 266 267
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;
268
    virStorageFileBackendReadHeader storageFileReadHeader;
269
    virStorageFileBackendGetUniqueIdentifier storageFileGetUniqueIdentifier;
270 271 272 273 274 275

    /* 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;
276
    virStorageFileBackendAccess storageFileAccess;
277
    virStorageFileBackendChown  storageFileChown;
278 279
};

280
#endif /* __VIR_STORAGE_BACKEND_H__ */