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

27
# include "virbitmap.h"
28 29
# include "virseclabel.h"
# include "virstorageencryption.h"
30
# include "virutil.h"
31

32 33 34 35 36 37 38 39
/* 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 已提交
40

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

    VIR_STORAGE_TYPE_LAST
54
} virStorageType;
E
Eric Blake 已提交
55 56 57 58

VIR_ENUM_DECL(virStorage)


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

    /* 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,
81 82
    VIR_STORAGE_FILE_QCOW,
    VIR_STORAGE_FILE_QCOW2,
A
Adam Litke 已提交
83
    VIR_STORAGE_FILE_QED,
84
    VIR_STORAGE_FILE_VMDK,
E
Eric Blake 已提交
85

86
    VIR_STORAGE_FILE_LAST,
87
} virStorageFileFormat;
88 89 90

VIR_ENUM_DECL(virStorageFileFormat);

91
typedef enum {
92
    VIR_STORAGE_FILE_FEATURE_LAZY_REFCOUNTS = 0,
93 94

    VIR_STORAGE_FILE_FEATURE_LAST
95
} virStorageFileFeature;
96 97 98

VIR_ENUM_DECL(virStorageFileFeature);

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


119
/* Information related to network storage */
120
typedef enum {
121 122 123 124 125 126 127 128 129 130 131 132
    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,

    VIR_STORAGE_NET_PROTOCOL_LAST
133
} virStorageNetProtocol;
134 135 136 137

VIR_ENUM_DECL(virStorageNetProtocol)


138
typedef enum {
139 140 141 142 143
    VIR_STORAGE_NET_HOST_TRANS_TCP,
    VIR_STORAGE_NET_HOST_TRANS_UNIX,
    VIR_STORAGE_NET_HOST_TRANS_RDMA,

    VIR_STORAGE_NET_HOST_TRANS_LAST
144
} virStorageNetHostTransport;
145 146 147 148 149 150 151 152

VIR_ENUM_DECL(virStorageNetHostTransport)

typedef struct _virStorageNetHostDef virStorageNetHostDef;
typedef virStorageNetHostDef *virStorageNetHostDefPtr;
struct _virStorageNetHostDef {
    char *name;
    char *port;
153
    virStorageNetHostTransport transport;
154 155 156
    char *socket;  /* path to unix socket */
};

157 158 159 160 161 162
/* 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.
 */
163
typedef enum {
164 165 166 167 168 169 170 171 172 173 174 175 176
    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
177
} virStorageSourcePoolMode;
178 179 180 181 182 183 184

VIR_ENUM_DECL(virStorageSourcePoolMode)

typedef struct _virStorageSourcePoolDef virStorageSourcePoolDef;
struct _virStorageSourcePoolDef {
    char *pool; /* pool name */
    char *volume; /* volume name */
185 186 187 188
    virStorageVolType voltype; /* internal only */
    int pooltype; /* virStoragePoolType from storage_conf.h, internal only */
    virStorageType actualtype; /* internal only */
    virStorageSourcePoolMode mode;
189 190 191
};
typedef virStorageSourcePoolDef *virStorageSourcePoolDefPtr;

192

193
typedef enum {
194 195 196 197 198
    VIR_STORAGE_SECRET_TYPE_NONE,
    VIR_STORAGE_SECRET_TYPE_UUID,
    VIR_STORAGE_SECRET_TYPE_USAGE,

    VIR_STORAGE_SECRET_TYPE_LAST
199
} virStorageSecretType;
200

201 202
typedef struct _virStorageDriverData virStorageDriverData;
typedef virStorageDriverData *virStorageDriverDataPtr;
203

204 205 206 207 208 209 210
typedef struct _virStorageSource virStorageSource;
typedef virStorageSource *virStorageSourcePtr;

/* Stores information related to a host resource.  In the case of
 * backing chains, multiple source disks join to form a single guest
 * view.  */
struct _virStorageSource {
211
    virStorageType type;
212
    char *path;
213
    virStorageNetProtocol protocol;
214 215 216 217 218
    size_t nhosts;
    virStorageNetHostDefPtr hosts;
    virStorageSourcePoolDefPtr srcpool;
    struct {
        char *username;
219
        virStorageSecretType secretType;
220 221 222 223 224 225
        union {
            unsigned char uuid[VIR_UUID_BUFLEN];
            char *usage;
        } secret;
    } auth;
    virStorageEncryptionPtr encryption;
E
Eric Blake 已提交
226

227
    char *driverName;
228 229
    int format; /* virStorageFileFormat in domain backing chains, but
                 * pool-specific enum for storage volumes */
E
Eric Blake 已提交
230 231
    virBitmapPtr features;
    char *compat;
232

E
Eric Blake 已提交
233 234
    virStoragePermsPtr perms;
    virStorageTimestampsPtr timestamps;
235 236
    unsigned long long allocation; /* in bytes, 0 if unknown */
    unsigned long long capacity; /* in bytes, 0 if unknown */
237 238
    size_t nseclabels;
    virSecurityDeviceLabelDefPtr *seclabels;
239

240
    /* backing chain of the storage source */
241
    virStorageSourcePtr backingStore;
242

243 244
    /* metadata for storage driver access to remote and local volumes */
    virStorageDriverDataPtr drv;
245 246 247 248 249 250 251 252 253 254 255

    /* metadata about storage image which need separate fields */
    /* Name of the current file as spelled by the user (top level) or
     * metadata of the overlay (if this is a backing store).  */
    char *relPath;
    /* Directory to start from if backingStoreRaw is a relative file
     * name.  */
    char *relDir;
    /* Name of the child backing store recorded in metadata of the
     * current file.  */
    char *backingStoreRaw;
256 257 258
};


259 260 261 262
# ifndef DEV_BSIZE
#  define DEV_BSIZE 512
# endif

263
int virStorageFileProbeFormat(const char *path, uid_t uid, gid_t gid);
264

265 266 267
int virStorageFileGetMetadata(virStorageSourcePtr src,
                              uid_t uid, gid_t gid,
                              bool allow_probe)
E
Eric Blake 已提交
268
    ATTRIBUTE_NONNULL(1);
269 270 271 272 273 274 275 276
virStorageSourcePtr virStorageFileGetMetadataFromFD(const char *path,
                                                    int fd,
                                                    int format);
virStorageSourcePtr virStorageFileGetMetadataFromBuf(const char *path,
                                                     char *buf,
                                                     size_t len,
                                                     char **backing,
                                                     int *backingFormat)
E
Eric Blake 已提交
277 278
    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(4)
    ATTRIBUTE_NONNULL(5);
279
int virStorageFileChainGetBroken(virStorageSourcePtr chain,
280
                                 char **broken_file);
281

282 283 284 285 286
int virStorageFileParseChainIndex(const char *diskTarget,
                                  const char *name,
                                  unsigned int *chainIndex)
    ATTRIBUTE_NONNULL(3);

287
virStorageSourcePtr virStorageFileChainLookup(virStorageSourcePtr chain,
288
                                              virStorageSourcePtr startFrom,
289
                                              const char *name,
290
                                              unsigned int idx,
291
                                              const char **parent)
292
    ATTRIBUTE_NONNULL(1);
293

294 295 296 297
int virStorageFileResize(const char *path,
                         unsigned long long capacity,
                         unsigned long long orig_capacity,
                         bool pre_allocate);
298

299
int virStorageFileIsClusterFS(const char *path);
300
bool virStorageIsFile(const char *path);
301

302 303 304 305
int virStorageFileGetLVMKey(const char *path,
                            char **key);
int virStorageFileGetSCSIKey(const char *path,
                             char **key);
306

307 308 309 310 311
void virStorageNetHostDefClear(virStorageNetHostDefPtr def);
void virStorageNetHostDefFree(size_t nhosts, virStorageNetHostDefPtr hosts);
virStorageNetHostDefPtr virStorageNetHostDefCopy(size_t nhosts,
                                                 virStorageNetHostDefPtr hosts);

312 313 314
void virStorageSourceAuthClear(virStorageSourcePtr def);
void virStorageSourcePoolDefFree(virStorageSourcePoolDefPtr def);
void virStorageSourceClear(virStorageSourcePtr def);
315
int virStorageSourceGetActualType(virStorageSourcePtr def);
316
void virStorageSourceFree(virStorageSourcePtr def);
317
void virStorageSourceClearBackingStore(virStorageSourcePtr def);
318

319
#endif /* __VIR_STORAGE_FILE_H__ */