storage_backend.h 13.7 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
                               virStorageVolDefPtr inputvol,
                               unsigned int flags);
111 112 113 114 115 116 117 118

int virStorageBackendCreatePloop(virConnectPtr conn,
                                 virStoragePoolObjPtr pool,
                                 virStorageVolDefPtr vol,
                                 virStorageVolDefPtr inputvol,
                                 unsigned int flags);


119
virStorageBackendBuildVolFrom
120
virStorageBackendGetBuildVolFromFunction(virStorageVolDefPtr vol,
121 122
                                         virStorageVolDefPtr inputvol);
int virStorageBackendFindFSImageTool(char **tool);
123
virStorageBackendBuildVolFrom
124
virStorageBackendFSImageToolTypeToFunc(int tool_type);
125

126 127 128 129
int virStorageBackendFindGlusterPoolSources(const char *host,
                                            int pooltype,
                                            virStoragePoolSourceListPtr list);

130 131 132 133 134 135 136 137 138 139 140 141 142 143
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);
144

145 146 147 148 149 150
int virStorageBackendVolWipeLocal(virConnectPtr conn,
                                  virStoragePoolObjPtr pool,
                                  virStorageVolDefPtr vol,
                                  unsigned int algorithm,
                                  unsigned int flags);

151 152 153
typedef struct _virStorageBackend virStorageBackend;
typedef virStorageBackend *virStorageBackendPtr;

154 155
/* Callbacks are optional unless documented otherwise; but adding more
 * callbacks provides better pool support.  */
156 157 158
struct _virStorageBackend {
    int type;

159
    virStorageBackendFindPoolSources findPoolSources;
160
    virStorageBackendCheckPool checkPool;
161 162
    virStorageBackendStartPool startPool;
    virStorageBackendBuildPool buildPool;
163
    virStorageBackendRefreshPool refreshPool; /* Must be non-NULL */
164 165 166
    virStorageBackendStopPool stopPool;
    virStorageBackendDeletePool deletePool;

167
    virStorageBackendBuildVol buildVol;
168
    virStorageBackendBuildVolFrom buildVolFrom;
169 170 171
    virStorageBackendCreateVol createVol;
    virStorageBackendRefreshVol refreshVol;
    virStorageBackendDeleteVol deleteVol;
172
    virStorageBackendVolumeResize resizeVol;
173 174
    virStorageBackendVolumeUpload uploadVol;
    virStorageBackendVolumeDownload downloadVol;
175
    virStorageBackendVolumeWipe wipeVol;
176 177 178
};

virStorageBackendPtr virStorageBackendForType(int type);
179

180 181
/* VolOpenCheckMode flags */
enum {
182 183 184 185 186 187
    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 */
188 189
};

J
John Ferlan 已提交
190 191 192 193 194 195 196 197 198
/* VolReadErrorMode flags
 * If flag is present, then operation won't cause fatal error for
 * specified operation, rather a VIR_WARN will be issued and a -2 returned
 * for function call
 */
enum {
    VIR_STORAGE_VOL_READ_NOERROR    = 1 << 0, /* ignore *read errors */
};

199
# define VIR_STORAGE_VOL_OPEN_DEFAULT (VIR_STORAGE_VOL_OPEN_REG      |\
200
                                       VIR_STORAGE_VOL_OPEN_BLOCK)
201

202 203
int virStorageBackendVolOpen(const char *path, struct stat *sb,
                             unsigned int flags)
E
Eric Blake 已提交
204 205
    ATTRIBUTE_RETURN_CHECK
    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
206

207 208 209
# define VIR_STORAGE_DEFAULT_POOL_PERM_MODE 0755
# define VIR_STORAGE_DEFAULT_VOL_PERM_MODE  0600

210
int virStorageBackendUpdateVolInfo(virStorageVolDefPtr vol,
211
                                   bool withBlockVolFormat,
212 213
                                   unsigned int openflags,
                                   unsigned int readflags);
214
int virStorageBackendUpdateVolTargetInfo(virStorageSourcePtr target,
215
                                         bool withBlockVolFormat,
216 217
                                         unsigned int openflags,
                                         unsigned int readflags);
218
int virStorageBackendUpdateVolTargetInfoFD(virStorageSourcePtr target,
219
                                           int fd,
220
                                           struct stat *sb);
221

222
bool virStorageBackendPoolPathIsStable(const char *path);
223
char *virStorageBackendStablePath(virStoragePoolObjPtr pool,
224
                                  const char *devpath,
225
                                  bool loop);
226

227
virCommandPtr
228 229 230 231 232 233 234
virStorageBackendCreateQemuImgCmdFromVol(virConnectPtr conn,
                                         virStoragePoolObjPtr pool,
                                         virStorageVolDefPtr vol,
                                         virStorageVolDefPtr inputvol,
                                         unsigned int flags,
                                         const char *create_tool,
                                         int imgformat);
235

236
/* ------- virStorageFile backends ------------ */
237 238 239 240 241 242
typedef struct _virStorageFileBackend virStorageFileBackend;
typedef virStorageFileBackend *virStorageFileBackendPtr;

struct _virStorageDriverData {
    virStorageFileBackendPtr backend;
    void *priv;
243 244 245

    uid_t uid;
    gid_t gid;
246 247
};

248
typedef int
249
(*virStorageFileBackendInit)(virStorageSourcePtr src);
250 251

typedef void
252
(*virStorageFileBackendDeinit)(virStorageSourcePtr src);
253 254

typedef int
255
(*virStorageFileBackendCreate)(virStorageSourcePtr src);
256 257

typedef int
258
(*virStorageFileBackendUnlink)(virStorageSourcePtr src);
259 260

typedef int
261
(*virStorageFileBackendStat)(virStorageSourcePtr src,
262 263
                             struct stat *st);

264 265 266 267 268
typedef ssize_t
(*virStorageFileBackendReadHeader)(virStorageSourcePtr src,
                                   ssize_t max_len,
                                   char **buf);

269 270
typedef const char *
(*virStorageFileBackendGetUniqueIdentifier)(virStorageSourcePtr src);
271

272 273 274 275
typedef int
(*virStorageFileBackendAccess)(virStorageSourcePtr src,
                               int mode);

276 277 278 279 280
typedef int
(*virStorageFileBackendChown)(virStorageSourcePtr src,
                              uid_t uid,
                              gid_t gid);

281
virStorageFileBackendPtr virStorageFileBackendForType(int type, int protocol);
282 283 284
virStorageFileBackendPtr virStorageFileBackendForTypeInternal(int type,
                                                              int protocol,
                                                              bool report);
285 286


287 288 289 290 291 292 293 294 295 296
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;
297
    virStorageFileBackendReadHeader storageFileReadHeader;
298
    virStorageFileBackendGetUniqueIdentifier storageFileGetUniqueIdentifier;
299 300 301 302 303 304

    /* 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;
305
    virStorageFileBackendAccess storageFileAccess;
306
    virStorageFileBackendChown  storageFileChown;
307 308
};

309
#endif /* __VIR_STORAGE_BACKEND_H__ */