storage_backend.h 13.1 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
typedef char * (*virStorageBackendFindPoolSources)(virConnectPtr conn,
                                                   const char *srcSpec,
                                                   unsigned int flags);
37
typedef int (*virStorageBackendCheckPool)(virStoragePoolObjPtr pool,
38 39 40 41 42 43 44 45 46 47 48 49 50
                                          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);
51 52 53 54 55 56 57 58 59 60

/* A 'buildVol' backend must remove any volume created on error since
 * the storage driver does not distinguish whether the failure is due
 * to failure to create the volume, to reserve any space necessary for
 * the volume, to get data about the volume, to change it's accessibility,
 * etc. This avoids issues arising from a creation failure due to some
 * external action which created a volume of the same name that libvirt
 * was not aware of between checking the pool and the create attempt. It
 * also avoids extra round trips to just delete a file.
 */
61
typedef int (*virStorageBackendBuildVol)(virConnectPtr conn,
62 63
                                         virStoragePoolObjPtr pool,
                                         virStorageVolDefPtr vol,
64
                                         unsigned int flags);
65 66 67 68 69 70 71 72 73 74 75 76 77 78
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,
79
                                             unsigned int flags);
80 81 82 83 84
typedef int (*virStorageBackendVolumeResize)(virConnectPtr conn,
                                             virStoragePoolObjPtr pool,
                                             virStorageVolDefPtr vol,
                                             unsigned long long capacity,
                                             unsigned int flags);
85 86 87 88 89 90 91 92 93 94 95 96 97 98
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);
99 100 101 102 103
typedef int (*virStorageBackendVolumeWipe)(virConnectPtr conn,
                                           virStoragePoolObjPtr pool,
                                           virStorageVolDefPtr vol,
                                           unsigned int algorithm,
                                           unsigned int flags);
104

105 106
/* File creation/cloning functions used for cloning between backends */
int virStorageBackendCreateRaw(virConnectPtr conn,
107
                               virStoragePoolObjPtr pool,
108
                               virStorageVolDefPtr vol,
109 110 111
                               virStorageVolDefPtr inputvol,
                               unsigned int flags);
virStorageBackendBuildVolFrom
112
virStorageBackendGetBuildVolFromFunction(virStorageVolDefPtr vol,
113 114
                                         virStorageVolDefPtr inputvol);
int virStorageBackendFindFSImageTool(char **tool);
115
virStorageBackendBuildVolFrom
116
virStorageBackendFSImageToolTypeToFunc(int tool_type);
117

118 119 120 121
int virStorageBackendFindGlusterPoolSources(const char *host,
                                            int pooltype,
                                            virStoragePoolSourceListPtr list);

122 123 124 125 126 127 128 129 130 131 132 133 134 135
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);
136

137 138 139 140 141 142
int virStorageBackendVolWipeLocal(virConnectPtr conn,
                                  virStoragePoolObjPtr pool,
                                  virStorageVolDefPtr vol,
                                  unsigned int algorithm,
                                  unsigned int flags);

143 144 145
typedef struct _virStorageBackend virStorageBackend;
typedef virStorageBackend *virStorageBackendPtr;

146 147
/* Callbacks are optional unless documented otherwise; but adding more
 * callbacks provides better pool support.  */
148 149 150
struct _virStorageBackend {
    int type;

151
    virStorageBackendFindPoolSources findPoolSources;
152
    virStorageBackendCheckPool checkPool;
153 154
    virStorageBackendStartPool startPool;
    virStorageBackendBuildPool buildPool;
155
    virStorageBackendRefreshPool refreshPool; /* Must be non-NULL */
156 157 158
    virStorageBackendStopPool stopPool;
    virStorageBackendDeletePool deletePool;

159
    virStorageBackendBuildVol buildVol;
160
    virStorageBackendBuildVolFrom buildVolFrom;
161 162 163
    virStorageBackendCreateVol createVol;
    virStorageBackendRefreshVol refreshVol;
    virStorageBackendDeleteVol deleteVol;
164
    virStorageBackendVolumeResize resizeVol;
165 166
    virStorageBackendVolumeUpload uploadVol;
    virStorageBackendVolumeDownload downloadVol;
167
    virStorageBackendVolumeWipe wipeVol;
168 169 170
};

virStorageBackendPtr virStorageBackendForType(int type);
171

172 173
/* VolOpenCheckMode flags */
enum {
174 175 176 177 178 179
    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 */
180 181
};

182
# define VIR_STORAGE_VOL_OPEN_DEFAULT (VIR_STORAGE_VOL_OPEN_REG      |\
183
                                       VIR_STORAGE_VOL_OPEN_BLOCK)
184

185 186
int virStorageBackendVolOpen(const char *path, struct stat *sb,
                             unsigned int flags)
E
Eric Blake 已提交
187 188
    ATTRIBUTE_RETURN_CHECK
    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
189

190 191 192
# define VIR_STORAGE_DEFAULT_POOL_PERM_MODE 0755
# define VIR_STORAGE_DEFAULT_VOL_PERM_MODE  0600

193
int virStorageBackendUpdateVolInfo(virStorageVolDefPtr vol,
194
                                   bool withBlockVolFormat,
195 196
                                   unsigned int openflags,
                                   unsigned int readflags);
197
int virStorageBackendUpdateVolTargetInfo(virStorageSourcePtr target,
198
                                         bool withBlockVolFormat,
199 200
                                         unsigned int openflags,
                                         unsigned int readflags);
201
int virStorageBackendUpdateVolTargetInfoFD(virStorageSourcePtr target,
202
                                           int fd,
203
                                           struct stat *sb);
204

205
bool virStorageBackendPoolPathIsStable(const char *path);
206
char *virStorageBackendStablePath(virStoragePoolObjPtr pool,
207
                                  const char *devpath,
208
                                  bool loop);
209

210
virCommandPtr
211 212 213 214 215 216 217
virStorageBackendCreateQemuImgCmdFromVol(virConnectPtr conn,
                                         virStoragePoolObjPtr pool,
                                         virStorageVolDefPtr vol,
                                         virStorageVolDefPtr inputvol,
                                         unsigned int flags,
                                         const char *create_tool,
                                         int imgformat);
218

219
/* ------- virStorageFile backends ------------ */
220 221 222 223 224 225
typedef struct _virStorageFileBackend virStorageFileBackend;
typedef virStorageFileBackend *virStorageFileBackendPtr;

struct _virStorageDriverData {
    virStorageFileBackendPtr backend;
    void *priv;
226 227 228

    uid_t uid;
    gid_t gid;
229 230
};

231
typedef int
232
(*virStorageFileBackendInit)(virStorageSourcePtr src);
233 234

typedef void
235
(*virStorageFileBackendDeinit)(virStorageSourcePtr src);
236 237

typedef int
238
(*virStorageFileBackendCreate)(virStorageSourcePtr src);
239 240

typedef int
241
(*virStorageFileBackendUnlink)(virStorageSourcePtr src);
242 243

typedef int
244
(*virStorageFileBackendStat)(virStorageSourcePtr src,
245 246
                             struct stat *st);

247 248 249 250 251
typedef ssize_t
(*virStorageFileBackendReadHeader)(virStorageSourcePtr src,
                                   ssize_t max_len,
                                   char **buf);

252 253
typedef const char *
(*virStorageFileBackendGetUniqueIdentifier)(virStorageSourcePtr src);
254

255 256 257 258
typedef int
(*virStorageFileBackendAccess)(virStorageSourcePtr src,
                               int mode);

259 260 261 262 263
typedef int
(*virStorageFileBackendChown)(virStorageSourcePtr src,
                              uid_t uid,
                              gid_t gid);

264
virStorageFileBackendPtr virStorageFileBackendForType(int type, int protocol);
265 266 267
virStorageFileBackendPtr virStorageFileBackendForTypeInternal(int type,
                                                              int protocol,
                                                              bool report);
268 269


270 271 272 273 274 275 276 277 278 279
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;
280
    virStorageFileBackendReadHeader storageFileReadHeader;
281
    virStorageFileBackendGetUniqueIdentifier storageFileGetUniqueIdentifier;
282 283 284 285 286 287

    /* 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;
288
    virStorageFileBackendAccess storageFileAccess;
289
    virStorageFileBackendChown  storageFileChown;
290 291
};

292
#endif /* __VIR_STORAGE_BACKEND_H__ */