virstoragefile.h 17.0 KB
Newer Older
1
/*
2
 * virstoragefile.h: file utility functions for FS storage backend
3
 *
4
 * Copyright (C) 2007-2009, 2012-2016 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_FILE_H__
25
# define __VIR_STORAGE_FILE_H__
26

27 28
# include <sys/stat.h>

29
# include "virbitmap.h"
30
# include "virobject.h"
31 32
# include "virseclabel.h"
# include "virstorageencryption.h"
33
# include "virutil.h"
34
# include "virsecret.h"
35

36 37 38 39 40 41 42 43
/* Minimum header size required to probe all known formats with
 * virStorageFileProbeFormat, or obtain metadata from a known format.
 * Rounded to multiple of 512 (ISO has a 5-byte magic at offset
 * 32769).  Some formats can be probed with fewer bytes.  Although
 * some formats theoretically permit metadata that can rely on offsets
 * beyond this size, in practice that doesn't matter.  */
# define VIR_STORAGE_MAX_HEADER 0x8200

E
Eric Blake 已提交
44

45 46 47 48
/* Types of disk backends (host resource).  Comparable to the public
 * virStorageVolType, except we have an undetermined state, don't have
 * a netdir type, and add a volume type for reference through a
 * storage pool.  */
49
typedef enum {
50
    VIR_STORAGE_TYPE_NONE,
E
Eric Blake 已提交
51
    VIR_STORAGE_TYPE_FILE,
52
    VIR_STORAGE_TYPE_BLOCK,
E
Eric Blake 已提交
53 54 55 56 57
    VIR_STORAGE_TYPE_DIR,
    VIR_STORAGE_TYPE_NETWORK,
    VIR_STORAGE_TYPE_VOLUME,

    VIR_STORAGE_TYPE_LAST
58
} virStorageType;
E
Eric Blake 已提交
59 60 61 62

VIR_ENUM_DECL(virStorage)


63
typedef enum {
64
    VIR_STORAGE_FILE_AUTO_SAFE = -2,
65
    VIR_STORAGE_FILE_AUTO = -1,
E
Eric Blake 已提交
66 67
    VIR_STORAGE_FILE_NONE = 0,
    VIR_STORAGE_FILE_RAW,
68 69 70 71 72
    VIR_STORAGE_FILE_DIR,
    VIR_STORAGE_FILE_BOCHS,
    VIR_STORAGE_FILE_CLOOP,
    VIR_STORAGE_FILE_DMG,
    VIR_STORAGE_FILE_ISO,
73 74 75 76 77 78
    VIR_STORAGE_FILE_VPC,
    VIR_STORAGE_FILE_VDI,

    /* Not direct file formats, but used for various drivers */
    VIR_STORAGE_FILE_FAT,
    VIR_STORAGE_FILE_VHD,
79
    VIR_STORAGE_FILE_PLOOP,
80 81 82 83 84 85

    /* Not a format, but a marker: all formats below this point have
     * libvirt support for following a backing chain */
    VIR_STORAGE_FILE_BACKING,

    VIR_STORAGE_FILE_COW = VIR_STORAGE_FILE_BACKING,
86 87
    VIR_STORAGE_FILE_QCOW,
    VIR_STORAGE_FILE_QCOW2,
A
Adam Litke 已提交
88
    VIR_STORAGE_FILE_QED,
89
    VIR_STORAGE_FILE_VMDK,
E
Eric Blake 已提交
90

91
    VIR_STORAGE_FILE_LAST,
92
} virStorageFileFormat;
93 94 95

VIR_ENUM_DECL(virStorageFileFormat);

96
typedef enum {
97
    VIR_STORAGE_FILE_FEATURE_LAZY_REFCOUNTS = 0,
98 99

    VIR_STORAGE_FILE_FEATURE_LAST
100
} virStorageFileFeature;
101 102 103

VIR_ENUM_DECL(virStorageFileFeature);

E
Eric Blake 已提交
104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123
typedef struct _virStoragePerms virStoragePerms;
typedef virStoragePerms *virStoragePermsPtr;
struct _virStoragePerms {
    mode_t mode;
    uid_t uid;
    gid_t gid;
    char *label;
};


typedef struct _virStorageTimestamps virStorageTimestamps;
typedef virStorageTimestamps *virStorageTimestampsPtr;
struct _virStorageTimestamps {
    struct timespec atime;
    struct timespec btime; /* birth time unknown if btime.tv_nsec == -1 */
    struct timespec ctime;
    struct timespec mtime;
};


124
/* Information related to network storage */
125
typedef enum {
126
    VIR_STORAGE_NET_PROTOCOL_NONE,
127 128 129 130 131 132 133 134 135 136
    VIR_STORAGE_NET_PROTOCOL_NBD,
    VIR_STORAGE_NET_PROTOCOL_RBD,
    VIR_STORAGE_NET_PROTOCOL_SHEEPDOG,
    VIR_STORAGE_NET_PROTOCOL_GLUSTER,
    VIR_STORAGE_NET_PROTOCOL_ISCSI,
    VIR_STORAGE_NET_PROTOCOL_HTTP,
    VIR_STORAGE_NET_PROTOCOL_HTTPS,
    VIR_STORAGE_NET_PROTOCOL_FTP,
    VIR_STORAGE_NET_PROTOCOL_FTPS,
    VIR_STORAGE_NET_PROTOCOL_TFTP,
137
    VIR_STORAGE_NET_PROTOCOL_SSH,
138
    VIR_STORAGE_NET_PROTOCOL_VXHS,
139 140

    VIR_STORAGE_NET_PROTOCOL_LAST
141
} virStorageNetProtocol;
142 143 144 145

VIR_ENUM_DECL(virStorageNetProtocol)


146
typedef enum {
147 148 149 150 151
    VIR_STORAGE_NET_HOST_TRANS_TCP,
    VIR_STORAGE_NET_HOST_TRANS_UNIX,
    VIR_STORAGE_NET_HOST_TRANS_RDMA,

    VIR_STORAGE_NET_HOST_TRANS_LAST
152
} virStorageNetHostTransport;
153 154 155 156 157 158 159

VIR_ENUM_DECL(virStorageNetHostTransport)

typedef struct _virStorageNetHostDef virStorageNetHostDef;
typedef virStorageNetHostDef *virStorageNetHostDefPtr;
struct _virStorageNetHostDef {
    char *name;
160
    unsigned int port;
161
    int transport; /* virStorageNetHostTransport */
162 163 164
    char *socket;  /* path to unix socket */
};

165 166 167 168 169 170
/* Information for a storage volume from a virStoragePool */

/*
 * Used for volume "type" disk to indicate how to represent
 * the disk source if the specified "pool" is of iscsi type.
 */
171
typedef enum {
172 173 174 175 176 177 178 179 180 181 182 183 184
    VIR_STORAGE_SOURCE_POOL_MODE_DEFAULT = 0,

    /* Use the path as it shows up on host, e.g.
     * /dev/disk/by-path/ip-$ip-iscsi-$iqn:iscsi.iscsi-pool0-lun-1
     */
    VIR_STORAGE_SOURCE_POOL_MODE_HOST,

    /* Use the URI from the storage pool source element host attribute. E.g.
     * file=iscsi://demo.org:6000/iqn.1992-01.com.example/1.
     */
    VIR_STORAGE_SOURCE_POOL_MODE_DIRECT,

    VIR_STORAGE_SOURCE_POOL_MODE_LAST
185
} virStorageSourcePoolMode;
186 187 188 189 190 191 192

VIR_ENUM_DECL(virStorageSourcePoolMode)

typedef struct _virStorageSourcePoolDef virStorageSourcePoolDef;
struct _virStorageSourcePoolDef {
    char *pool; /* pool name */
    char *volume; /* volume name */
193
    int voltype; /* virStorageVolType, internal only */
194
    int pooltype; /* virStoragePoolType from storage_conf.h, internal only */
195 196
    int actualtype; /* virStorageType, internal only */
    int mode; /* virStorageSourcePoolMode */
197 198 199
};
typedef virStorageSourcePoolDef *virStorageSourcePoolDefPtr;

200

201 202 203 204 205 206 207 208 209 210 211 212 213 214 215
typedef enum {
    VIR_STORAGE_AUTH_TYPE_NONE,
    VIR_STORAGE_AUTH_TYPE_CHAP,
    VIR_STORAGE_AUTH_TYPE_CEPHX,

    VIR_STORAGE_AUTH_TYPE_LAST,
} virStorageAuthType;
VIR_ENUM_DECL(virStorageAuth)

typedef struct _virStorageAuthDef virStorageAuthDef;
typedef virStorageAuthDef *virStorageAuthDefPtr;
struct _virStorageAuthDef {
    char *username;
    char *secrettype; /* <secret type='%s' for disk source */
    int authType;     /* virStorageAuthType */
216
    virSecretLookupTypeDef seclookupdef;
217 218
};

219 220
typedef struct _virStorageDriverData virStorageDriverData;
typedef virStorageDriverData *virStorageDriverDataPtr;
221

222 223 224
typedef struct _virStorageSource virStorageSource;
typedef virStorageSource *virStorageSourcePtr;

225 226 227 228 229
/* Stores information related to a host resource.  In the case of backing
 * chains, multiple source disks join to form a single guest view.
 *
 * IMPORTANT: When adding fields to this struct it's also necessary to add
 * appropriate code to the virStorageSourceCopy deep copy function */
230
struct _virStorageSource {
231
    unsigned int id; /* backing chain identifier, 0 is unset */
232
    int type; /* virStorageType */
233
    char *path;
234
    int protocol; /* virStorageNetProtocol */
235
    char *volume; /* volume name for remote storage */
236
    char *snapshot; /* for storage systems supporting internal snapshots */
237 238
    char *configFile; /* some storage systems use config file as part of
                         the source definition */
239 240 241
    size_t nhosts;
    virStorageNetHostDefPtr hosts;
    virStorageSourcePoolDefPtr srcpool;
242
    virStorageAuthDefPtr auth;
243
    bool authInherited;
244
    virStorageEncryptionPtr encryption;
245
    bool encryptionInherited;
E
Eric Blake 已提交
246

247 248
    virObjectPtr privateData;

249
    char *driverName;
250 251
    int format; /* virStorageFileFormat in domain backing chains, but
                 * pool-specific enum for storage volumes */
E
Eric Blake 已提交
252 253
    virBitmapPtr features;
    char *compat;
C
Chunyan Liu 已提交
254
    bool nocow;
255
    bool sparse;
256

E
Eric Blake 已提交
257 258
    virStoragePermsPtr perms;
    virStorageTimestampsPtr timestamps;
259
    unsigned long long capacity; /* in bytes, 0 if unknown */
260 261
    unsigned long long allocation; /* in bytes, 0 if unknown */
    unsigned long long physical; /* in bytes, 0 if unknown */
262 263
    bool has_allocation; /* Set to true when provided in XML */

264 265
    size_t nseclabels;
    virSecurityDeviceLabelDefPtr *seclabels;
266

267 268 269 270 271 272
    /* Don't ever write to the image */
    bool readonly;

    /* image is shared across hosts */
    bool shared;

273
    /* backing chain of the storage source */
274
    virStorageSourcePtr backingStore;
275

276 277
    /* metadata for storage driver access to remote and local volumes */
    virStorageDriverDataPtr drv;
278 279

    /* metadata about storage image which need separate fields */
280 281
    /* Relative name by which this image was opened from its parent, or NULL
     * if this image was opened by absolute name */
282 283 284 285
    char *relPath;
    /* Name of the child backing store recorded in metadata of the
     * current file.  */
    char *backingStoreRaw;
286 287 288

    /* metadata that allows identifying given storage source */
    char *nodeformat;  /* name of the format handler object */
289
    char *nodestorage; /* name of the storage object */
290 291 292 293 294 295 296

    /* An optional setting to enable usage of TLS for the storage source */
    int haveTLS; /* enum virTristateBool */

    /* Indication whether the haveTLS value was altered due to qemu.conf
     * setting when haveTLS is missing from the domain config file */
    bool tlsFromConfig;
297 298 299 300 301 302 303

    /* If TLS is used, then mgmt of the TLS credentials occurs via an
     * object that is generated using a specific alias for a specific
     * certificate directory with listen and verify bools. */
    char *tlsAlias;
    char *tlsCertdir;
    bool tlsVerify;
304 305

    bool detected; /* true if this entry was not provided by the user */
306 307 308

    unsigned int debugLevel;
    bool debug;
309 310 311
};


312 313 314 315
# ifndef DEV_BSIZE
#  define DEV_BSIZE 512
# endif

316
int virStorageFileProbeFormat(const char *path, uid_t uid, gid_t gid);
317

318 319 320 321
int virStorageFileGetMetadataInternal(virStorageSourcePtr meta,
                                      char *buf,
                                      size_t len,
                                      int *backingFormat)
322
    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
323

324 325
virStorageSourcePtr virStorageFileGetMetadataFromFD(const char *path,
                                                    int fd,
326 327
                                                    int format,
                                                    int *backingFormat);
328 329 330
virStorageSourcePtr virStorageFileGetMetadataFromBuf(const char *path,
                                                     char *buf,
                                                     size_t len,
331
                                                     int format,
332
                                                     int *backingFormat)
333
    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
334
int virStorageFileChainGetBroken(virStorageSourcePtr chain,
335
                                 char **broken_file);
336

337 338 339 340 341
int virStorageFileParseChainIndex(const char *diskTarget,
                                  const char *name,
                                  unsigned int *chainIndex)
    ATTRIBUTE_NONNULL(3);

342 343 344 345 346
int virStorageFileParseBackingStoreStr(const char *str,
                                       char **target,
                                       unsigned int *chainIndex)
    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(3);

347
virStorageSourcePtr virStorageFileChainLookup(virStorageSourcePtr chain,
348
                                              virStorageSourcePtr startFrom,
349
                                              const char *name,
350
                                              unsigned int idx,
351
                                              virStorageSourcePtr *parent)
352
    ATTRIBUTE_NONNULL(1);
353

354 355 356
int virStorageFileResize(const char *path,
                         unsigned long long capacity,
                         bool pre_allocate);
357

358
int virStorageFileIsClusterFS(const char *path);
359
bool virStorageIsFile(const char *path);
360
bool virStorageIsRelative(const char *backing);
361

362 363 364 365
int virStorageFileGetLVMKey(const char *path,
                            char **key);
int virStorageFileGetSCSIKey(const char *path,
                             char **key);
366

367 368 369 370 371
void virStorageAuthDefFree(virStorageAuthDefPtr def);
virStorageAuthDefPtr virStorageAuthDefCopy(const virStorageAuthDef *src);
virStorageAuthDefPtr virStorageAuthDefParse(xmlDocPtr xml, xmlNodePtr root);
int virStorageAuthDefFormat(virBufferPtr buf, virStorageAuthDefPtr authdef);

372 373 374 375
virSecurityDeviceLabelDefPtr
virStorageSourceGetSecurityLabelDef(virStorageSourcePtr src,
                                    const char *model);

376 377 378 379 380
void virStorageNetHostDefClear(virStorageNetHostDefPtr def);
void virStorageNetHostDefFree(size_t nhosts, virStorageNetHostDefPtr hosts);
virStorageNetHostDefPtr virStorageNetHostDefCopy(size_t nhosts,
                                                 virStorageNetHostDefPtr hosts);

381 382 383
int virStorageSourceInitChainElement(virStorageSourcePtr newelem,
                                     virStorageSourcePtr old,
                                     bool force);
384 385
void virStorageSourcePoolDefFree(virStorageSourcePoolDefPtr def);
void virStorageSourceClear(virStorageSourcePtr def);
386
int virStorageSourceGetActualType(const virStorageSource *def);
387
bool virStorageSourceIsLocalStorage(const virStorageSource *src);
388
bool virStorageSourceIsEmpty(virStorageSourcePtr src);
389
bool virStorageSourceIsBlockLocal(const virStorageSource *src);
390
void virStorageSourceFree(virStorageSourcePtr def);
391
void virStorageSourceBackingStoreClear(virStorageSourcePtr def);
392 393
int virStorageSourceUpdatePhysicalSize(virStorageSourcePtr src,
                                       int fd, struct stat const *sb);
394 395
int virStorageSourceUpdateBackingSizes(virStorageSourcePtr src,
                                       int fd, struct stat const *sb);
396 397 398
int virStorageSourceUpdateCapacity(virStorageSourcePtr src,
                                   char *buf, ssize_t len,
                                   bool probe);
399

400
virStorageSourcePtr virStorageSourceNewFromBacking(virStorageSourcePtr parent);
401 402 403
virStorageSourcePtr virStorageSourceCopy(const virStorageSource *src,
                                         bool backingChain)
    ATTRIBUTE_NONNULL(1);
404

405 406 407 408
int virStorageSourceParseRBDColonString(const char *rbdstr,
                                        virStorageSourcePtr src)
    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);

409 410 411 412 413 414 415
typedef int
(*virStorageFileSimplifyPathReadlinkCallback)(const char *path,
                                              char **link,
                                              void *data);
char *virStorageFileCanonicalizePath(const char *path,
                                     virStorageFileSimplifyPathReadlinkCallback cb,
                                     void *cbdata);
416

417 418 419 420 421
int virStorageFileGetRelativeBackingPath(virStorageSourcePtr from,
                                         virStorageSourcePtr to,
                                         char **relpath)
    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3);

422
int virStorageFileCheckCompat(const char *compat);
423 424 425

virStorageSourcePtr virStorageSourceNewFromBackingAbsolute(const char *path);

426 427
bool virStorageSourceIsRelative(virStorageSourcePtr src);

428 429 430 431 432 433
virStorageSourcePtr
virStorageSourceFindByNodeName(virStorageSourcePtr top,
                               const char *nodeName,
                               unsigned int *index)
    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);

434
void
435 436
virStorageSourceNetworkAssignDefaultPorts(virStorageSourcePtr src)
    ATTRIBUTE_NONNULL(1);
437

438 439 440 441 442 443
bool
virStorageSourceIsBacking(const virStorageSource *src);
bool
virStorageSourceHasBacking(const virStorageSource *src);


444 445 446 447 448 449 450
int
virStorageSourcePrivateDataParseRelPath(xmlXPathContextPtr ctxt,
                                        virStorageSourcePtr src);
int
virStorageSourcePrivateDataFormatRelPath(virStorageSourcePtr src,
                                         virBufferPtr buf);

451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482
int virStorageFileInit(virStorageSourcePtr src);
int virStorageFileInitAs(virStorageSourcePtr src,
                         uid_t uid, gid_t gid);
void virStorageFileDeinit(virStorageSourcePtr src);

int virStorageFileCreate(virStorageSourcePtr src);
int virStorageFileUnlink(virStorageSourcePtr src);
int virStorageFileStat(virStorageSourcePtr src,
                       struct stat *stat);
ssize_t virStorageFileRead(virStorageSourcePtr src,
                           size_t offset,
                           size_t len,
                           char **buf);
const char *virStorageFileGetUniqueIdentifier(virStorageSourcePtr src);
int virStorageFileAccess(virStorageSourcePtr src, int mode);
int virStorageFileChown(const virStorageSource *src, uid_t uid, gid_t gid);

bool virStorageFileSupportsSecurityDriver(const virStorageSource *src);
bool virStorageFileSupportsAccess(const virStorageSource *src);

int virStorageFileGetMetadata(virStorageSourcePtr src,
                              uid_t uid, gid_t gid,
                              bool allow_probe,
                              bool report_broken)
    ATTRIBUTE_NONNULL(1);

char *virStorageFileGetBackingStoreStr(virStorageSourcePtr src)
    ATTRIBUTE_NONNULL(1);

void virStorageFileReportBrokenChain(int errcode,
                                     virStorageSourcePtr src,
                                     virStorageSourcePtr parent);
483

484
#endif /* __VIR_STORAGE_FILE_H__ */