virstoragefile.h 14.4 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 31
# include "virseclabel.h"
# include "virstorageencryption.h"
32
# include "virutil.h"
33
# include "virsecret.h"
34

35 36 37 38 39 40 41 42
/* 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 已提交
43

44 45 46 47
/* 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.  */
48
typedef enum {
49
    VIR_STORAGE_TYPE_NONE,
E
Eric Blake 已提交
50
    VIR_STORAGE_TYPE_FILE,
51
    VIR_STORAGE_TYPE_BLOCK,
E
Eric Blake 已提交
52 53 54 55 56
    VIR_STORAGE_TYPE_DIR,
    VIR_STORAGE_TYPE_NETWORK,
    VIR_STORAGE_TYPE_VOLUME,

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

VIR_ENUM_DECL(virStorage)


62
typedef enum {
63
    VIR_STORAGE_FILE_AUTO_SAFE = -2,
64
    VIR_STORAGE_FILE_AUTO = -1,
E
Eric Blake 已提交
65 66
    VIR_STORAGE_FILE_NONE = 0,
    VIR_STORAGE_FILE_RAW,
67 68 69 70 71
    VIR_STORAGE_FILE_DIR,
    VIR_STORAGE_FILE_BOCHS,
    VIR_STORAGE_FILE_CLOOP,
    VIR_STORAGE_FILE_DMG,
    VIR_STORAGE_FILE_ISO,
72 73 74 75 76 77
    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,
78
    VIR_STORAGE_FILE_PLOOP,
79 80 81 82 83 84

    /* 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,
85 86
    VIR_STORAGE_FILE_QCOW,
    VIR_STORAGE_FILE_QCOW2,
A
Adam Litke 已提交
87
    VIR_STORAGE_FILE_QED,
88
    VIR_STORAGE_FILE_VMDK,
E
Eric Blake 已提交
89

90
    VIR_STORAGE_FILE_LAST,
91
} virStorageFileFormat;
92 93 94

VIR_ENUM_DECL(virStorageFileFormat);

95
typedef enum {
96
    VIR_STORAGE_FILE_FEATURE_LAZY_REFCOUNTS = 0,
97 98

    VIR_STORAGE_FILE_FEATURE_LAST
99
} virStorageFileFeature;
100 101 102

VIR_ENUM_DECL(virStorageFileFeature);

E
Eric Blake 已提交
103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122
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;
};


123
/* Information related to network storage */
124
typedef enum {
125
    VIR_STORAGE_NET_PROTOCOL_NONE,
126 127 128 129 130 131 132 133 134 135
    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,
136
    VIR_STORAGE_NET_PROTOCOL_SSH,
137 138

    VIR_STORAGE_NET_PROTOCOL_LAST
139
} virStorageNetProtocol;
140 141 142 143

VIR_ENUM_DECL(virStorageNetProtocol)


144
typedef enum {
145 146 147 148 149
    VIR_STORAGE_NET_HOST_TRANS_TCP,
    VIR_STORAGE_NET_HOST_TRANS_UNIX,
    VIR_STORAGE_NET_HOST_TRANS_RDMA,

    VIR_STORAGE_NET_HOST_TRANS_LAST
150
} virStorageNetHostTransport;
151 152 153 154 155 156 157

VIR_ENUM_DECL(virStorageNetHostTransport)

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

163 164 165 166 167 168
/* 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.
 */
169
typedef enum {
170 171 172 173 174 175 176 177 178 179 180 181 182
    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
183
} virStorageSourcePoolMode;
184 185 186 187 188 189 190

VIR_ENUM_DECL(virStorageSourcePoolMode)

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

198

199 200 201 202 203 204 205 206 207 208 209 210 211 212 213
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 */
214
    virSecretLookupTypeDef seclookupdef;
215 216
};

217 218
typedef struct _virStorageDriverData virStorageDriverData;
typedef virStorageDriverData *virStorageDriverDataPtr;
219

220 221 222
typedef struct _virStorageSource virStorageSource;
typedef virStorageSource *virStorageSourcePtr;

223 224 225 226 227
/* 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 */
228
struct _virStorageSource {
229
    int type; /* virStorageType */
230
    char *path;
231
    int protocol; /* virStorageNetProtocol */
232
    char *volume; /* volume name for remote storage */
233
    char *snapshot; /* for storage systems supporting internal snapshots */
234 235
    char *configFile; /* some storage systems use config file as part of
                         the source definition */
236 237 238
    size_t nhosts;
    virStorageNetHostDefPtr hosts;
    virStorageSourcePoolDefPtr srcpool;
239
    virStorageAuthDefPtr auth;
240
    virStorageEncryptionPtr encryption;
E
Eric Blake 已提交
241

242
    char *driverName;
243 244
    int format; /* virStorageFileFormat in domain backing chains, but
                 * pool-specific enum for storage volumes */
E
Eric Blake 已提交
245 246
    virBitmapPtr features;
    char *compat;
C
Chunyan Liu 已提交
247
    bool nocow;
248
    bool sparse;
249

E
Eric Blake 已提交
250 251
    virStoragePermsPtr perms;
    virStorageTimestampsPtr timestamps;
252
    unsigned long long capacity; /* in bytes, 0 if unknown */
253 254
    unsigned long long allocation; /* in bytes, 0 if unknown */
    unsigned long long physical; /* in bytes, 0 if unknown */
255 256
    bool has_allocation; /* Set to true when provided in XML */

257 258
    size_t nseclabels;
    virSecurityDeviceLabelDefPtr *seclabels;
259

260 261 262 263 264 265
    /* Don't ever write to the image */
    bool readonly;

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

266
    /* backing chain of the storage source */
267
    virStorageSourcePtr backingStore;
268

269 270
    /* metadata for storage driver access to remote and local volumes */
    virStorageDriverDataPtr drv;
271 272

    /* metadata about storage image which need separate fields */
273 274
    /* Relative name by which this image was opened from its parent, or NULL
     * if this image was opened by absolute name */
275 276 277 278
    char *relPath;
    /* Name of the child backing store recorded in metadata of the
     * current file.  */
    char *backingStoreRaw;
279 280 281 282

    /* metadata that allows identifying given storage source */
    char *nodeformat;  /* name of the format handler object */
    char *nodebacking; /* name of the backing storage object */
283 284 285
};


286 287 288 289
# ifndef DEV_BSIZE
#  define DEV_BSIZE 512
# endif

290
int virStorageFileProbeFormat(const char *path, uid_t uid, gid_t gid);
291

292 293 294 295
int virStorageFileGetMetadataInternal(virStorageSourcePtr meta,
                                      char *buf,
                                      size_t len,
                                      int *backingFormat)
296
    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
297

298 299
virStorageSourcePtr virStorageFileGetMetadataFromFD(const char *path,
                                                    int fd,
300 301
                                                    int format,
                                                    int *backingFormat);
302 303 304
virStorageSourcePtr virStorageFileGetMetadataFromBuf(const char *path,
                                                     char *buf,
                                                     size_t len,
305
                                                     int format,
306
                                                     int *backingFormat)
307
    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
308
int virStorageFileChainGetBroken(virStorageSourcePtr chain,
309
                                 char **broken_file);
310

311 312 313 314 315
int virStorageFileParseChainIndex(const char *diskTarget,
                                  const char *name,
                                  unsigned int *chainIndex)
    ATTRIBUTE_NONNULL(3);

316 317 318 319 320
int virStorageFileParseBackingStoreStr(const char *str,
                                       char **target,
                                       unsigned int *chainIndex)
    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(3);

321
virStorageSourcePtr virStorageFileChainLookup(virStorageSourcePtr chain,
322
                                              virStorageSourcePtr startFrom,
323
                                              const char *name,
324
                                              unsigned int idx,
325
                                              virStorageSourcePtr *parent)
326
    ATTRIBUTE_NONNULL(1);
327

328 329 330 331
int virStorageFileResize(const char *path,
                         unsigned long long capacity,
                         unsigned long long orig_capacity,
                         bool pre_allocate);
332

333
int virStorageFileIsClusterFS(const char *path);
334
bool virStorageIsFile(const char *path);
335
bool virStorageIsRelative(const char *backing);
336

337 338 339 340
int virStorageFileGetLVMKey(const char *path,
                            char **key);
int virStorageFileGetSCSIKey(const char *path,
                             char **key);
341

342 343 344 345 346
void virStorageAuthDefFree(virStorageAuthDefPtr def);
virStorageAuthDefPtr virStorageAuthDefCopy(const virStorageAuthDef *src);
virStorageAuthDefPtr virStorageAuthDefParse(xmlDocPtr xml, xmlNodePtr root);
int virStorageAuthDefFormat(virBufferPtr buf, virStorageAuthDefPtr authdef);

347 348 349 350
virSecurityDeviceLabelDefPtr
virStorageSourceGetSecurityLabelDef(virStorageSourcePtr src,
                                    const char *model);

351 352 353 354 355
void virStorageNetHostDefClear(virStorageNetHostDefPtr def);
void virStorageNetHostDefFree(size_t nhosts, virStorageNetHostDefPtr hosts);
virStorageNetHostDefPtr virStorageNetHostDefCopy(size_t nhosts,
                                                 virStorageNetHostDefPtr hosts);

356 357 358
int virStorageSourceInitChainElement(virStorageSourcePtr newelem,
                                     virStorageSourcePtr old,
                                     bool force);
359 360
void virStorageSourcePoolDefFree(virStorageSourcePoolDefPtr def);
void virStorageSourceClear(virStorageSourcePtr def);
361
int virStorageSourceGetActualType(const virStorageSource *def);
362
bool virStorageSourceIsLocalStorage(const virStorageSource *src);
363
bool virStorageSourceIsEmpty(virStorageSourcePtr src);
364
bool virStorageSourceIsBlockLocal(const virStorageSource *src);
365
void virStorageSourceFree(virStorageSourcePtr def);
366
void virStorageSourceBackingStoreClear(virStorageSourcePtr def);
367 368
int virStorageSourceUpdatePhysicalSize(virStorageSourcePtr src,
                                       int fd, struct stat const *sb);
369 370
int virStorageSourceUpdateBackingSizes(virStorageSourcePtr src,
                                       int fd, struct stat const *sb);
371 372 373
int virStorageSourceUpdateCapacity(virStorageSourcePtr src,
                                   char *buf, ssize_t len,
                                   bool probe);
374

375
virStorageSourcePtr virStorageSourceNewFromBacking(virStorageSourcePtr parent);
376 377 378
virStorageSourcePtr virStorageSourceCopy(const virStorageSource *src,
                                         bool backingChain)
    ATTRIBUTE_NONNULL(1);
379

380 381 382 383
int virStorageSourceParseRBDColonString(const char *rbdstr,
                                        virStorageSourcePtr src)
    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);

384 385 386 387 388 389 390
typedef int
(*virStorageFileSimplifyPathReadlinkCallback)(const char *path,
                                              char **link,
                                              void *data);
char *virStorageFileCanonicalizePath(const char *path,
                                     virStorageFileSimplifyPathReadlinkCallback cb,
                                     void *cbdata);
391

392 393 394 395 396
int virStorageFileGetRelativeBackingPath(virStorageSourcePtr from,
                                         virStorageSourcePtr to,
                                         char **relpath)
    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3);

397
int virStorageFileCheckCompat(const char *compat);
398 399 400

virStorageSourcePtr virStorageSourceNewFromBackingAbsolute(const char *path);

401 402
bool virStorageSourceIsRelative(virStorageSourcePtr src);

403 404 405 406 407 408
virStorageSourcePtr
virStorageSourceFindByNodeName(virStorageSourcePtr top,
                               const char *nodeName,
                               unsigned int *index)
    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);

409
void
410 411
virStorageSourceNetworkAssignDefaultPorts(virStorageSourcePtr src)
    ATTRIBUTE_NONNULL(1);
412

413
#endif /* __VIR_STORAGE_FILE_H__ */