virstoragefile.h 20.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
#pragma once
23

24
#include <sys/stat.h>
25

26 27 28 29 30 31 32
#include "virbitmap.h"
#include "virobject.h"
#include "virseclabel.h"
#include "virstorageencryption.h"
#include "virutil.h"
#include "virsecret.h"
#include "virenum.h"
33
#include "virpci.h"
34

35 36 37 38 39 40
/* 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.  */
41
#define VIR_STORAGE_MAX_HEADER 0x8200
42

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
    VIR_STORAGE_TYPE_DIR,
    VIR_STORAGE_TYPE_NETWORK,
    VIR_STORAGE_TYPE_VOLUME,
55
    VIR_STORAGE_TYPE_NVME,
E
Eric Blake 已提交
56 57

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

60
VIR_ENUM_DECL(virStorage);
E
Eric Blake 已提交
61 62


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
VIR_ENUM_DECL(virStorageNetProtocol);
144 145


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
VIR_ENUM_DECL(virStorageNetHostTransport);
155 156 157 158 159

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
VIR_ENUM_DECL(virStorageSourcePoolMode);
188 189 190 191 192

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
    int actualtype; /* virStorageType, internal only */
196
    int mode; /* virStorageSourcePoolMode, currently makes sense only for iscsi pool */
197 198 199
};
typedef virStorageSourcePoolDef *virStorageSourcePoolDefPtr;

200

201 202 203 204 205 206 207
typedef enum {
    VIR_STORAGE_AUTH_TYPE_NONE,
    VIR_STORAGE_AUTH_TYPE_CHAP,
    VIR_STORAGE_AUTH_TYPE_CEPHX,

    VIR_STORAGE_AUTH_TYPE_LAST,
} virStorageAuthType;
208
VIR_ENUM_DECL(virStorageAuth);
209 210 211 212 213 214 215

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 221 222 223
typedef struct _virStoragePRDef virStoragePRDef;
typedef virStoragePRDef *virStoragePRDefPtr;
struct _virStoragePRDef {
    int managed; /* enum virTristateBool */
    char *path;
224 225 226

    /* manager object alias */
    char *mgralias;
227 228
};

229 230 231 232 233 234
typedef struct _virStorageSourceInitiatorDef virStorageSourceInitiatorDef;
typedef virStorageSourceInitiatorDef *virStorageSourceInitiatorDefPtr;
struct _virStorageSourceInitiatorDef {
    char *iqn; /* Initiator IQN */
};

235 236 237 238 239 240 241 242 243 244
typedef struct _virStorageSourceNVMeDef virStorageSourceNVMeDef;
typedef virStorageSourceNVMeDef *virStorageSourceNVMeDefPtr;
struct _virStorageSourceNVMeDef {
    unsigned long long namespace;
    int managed; /* enum virTristateBool */
    virPCIDeviceAddress pciAddr;

    /* Don't forget to update virStorageSourceNVMeDefCopy */
};

245 246 247 248 249 250 251 252 253 254

typedef struct _virStorageSourceSlice virStorageSourceSlice;
typedef virStorageSourceSlice *virStorageSourceSlicePtr;
struct _virStorageSourceSlice {
    unsigned long long offset;
    unsigned long long size;
    char *nodename;
};


255 256
typedef struct _virStorageDriverData virStorageDriverData;
typedef virStorageDriverData *virStorageDriverDataPtr;
257

258 259 260
typedef struct _virStorageSource virStorageSource;
typedef virStorageSource *virStorageSourcePtr;

261 262 263 264 265
/* 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 */
266
struct _virStorageSource {
267 268
    virObject parent;

269
    unsigned int id; /* backing chain identifier, 0 is unset */
270
    int type; /* virStorageType */
271
    char *path;
272
    int protocol; /* virStorageNetProtocol */
273
    char *volume; /* volume name for remote storage */
274
    char *snapshot; /* for storage systems supporting internal snapshots */
275 276
    char *configFile; /* some storage systems use config file as part of
                         the source definition */
277 278 279
    size_t nhosts;
    virStorageNetHostDefPtr hosts;
    virStorageSourcePoolDefPtr srcpool;
280
    virStorageAuthDefPtr auth;
281
    bool authInherited;
282
    virStorageEncryptionPtr encryption;
283
    bool encryptionInherited;
284
    virStoragePRDefPtr pr;
E
Eric Blake 已提交
285

286 287
    virStorageSourceNVMeDefPtr nvme; /* type == VIR_STORAGE_TYPE_NVME */

288 289
    virStorageSourceInitiatorDef initiator;

290 291
    virObjectPtr privateData;

292 293
    int format; /* virStorageFileFormat in domain backing chains, but
                 * pool-specific enum for storage volumes */
E
Eric Blake 已提交
294 295
    virBitmapPtr features;
    char *compat;
C
Chunyan Liu 已提交
296
    bool nocow;
297
    bool sparse;
298

299 300
    virStorageSourceSlicePtr sliceStorage;

E
Eric Blake 已提交
301 302
    virStoragePermsPtr perms;
    virStorageTimestampsPtr timestamps;
303
    unsigned long long capacity; /* in bytes, 0 if unknown */
304 305
    unsigned long long allocation; /* in bytes, 0 if unknown */
    unsigned long long physical; /* in bytes, 0 if unknown */
306 307
    bool has_allocation; /* Set to true when provided in XML */

308 309
    size_t nseclabels;
    virSecurityDeviceLabelDefPtr *seclabels;
310

311 312 313 314 315 316
    /* Don't ever write to the image */
    bool readonly;

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

317
    /* backing chain of the storage source */
318
    virStorageSourcePtr backingStore;
319

320 321 322
    /* external data store storage source */
    virStorageSourcePtr externalDataStore;

323 324
    /* metadata for storage driver access to remote and local volumes */
    virStorageDriverDataPtr drv;
325 326

    /* metadata about storage image which need separate fields */
327 328
    /* Relative name by which this image was opened from its parent, or NULL
     * if this image was opened by absolute name */
329 330 331 332
    char *relPath;
    /* Name of the child backing store recorded in metadata of the
     * current file.  */
    char *backingStoreRaw;
333
    virStorageFileFormat backingStoreRawFormat;
334 335
    /* Name of the child data file recorded in metadata of the current file. */
    char *externalDataStoreRaw;
336 337 338

    /* metadata that allows identifying given storage source */
    char *nodeformat;  /* name of the format handler object */
339
    char *nodestorage; /* name of the storage object */
340 341 342 343 344 345 346

    /* 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;
347 348 349 350 351 352

    /* 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;
353 354

    bool detected; /* true if this entry was not provided by the user */
355 356 357

    unsigned int debugLevel;
    bool debug;
358

359
    /* Libvirt currently stores the following properties in virDomainDiskDef.
360 361 362 363 364 365
     * These instances are currently just copies from the parent definition and
     * are not mapped back to the XML */
    int iomode; /* enum virDomainDiskIo */
    int cachemode; /* enum virDomainDiskCache */
    int discard; /* enum virDomainDiskDiscard */
    int detect_zeroes; /* enum virDomainDiskDetectZeroes */
366 367 368

    bool floppyimg; /* set to true if the storage source is going to be used
                       as a source for floppy drive */
369 370

    bool hostcdrom; /* backing device is a cdrom */
371 372
};

373 374
G_DEFINE_AUTOPTR_CLEANUP_FUNC(virStorageSource, virObjectUnref);

375

376 377 378
#ifndef DEV_BSIZE
# define DEV_BSIZE 512
#endif
379

380
int virStorageFileProbeFormat(const char *path, uid_t uid, gid_t gid);
381

382 383
virStorageSourcePtr virStorageFileGetMetadataFromFD(const char *path,
                                                    int fd,
384
                                                    int format);
385 386 387
virStorageSourcePtr virStorageFileGetMetadataFromBuf(const char *path,
                                                     char *buf,
                                                     size_t len,
388
                                                     int format)
389
    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
390
int virStorageFileChainGetBroken(virStorageSourcePtr chain,
391
                                 char **broken_file);
392

393 394 395 396 397
int virStorageFileParseChainIndex(const char *diskTarget,
                                  const char *name,
                                  unsigned int *chainIndex)
    ATTRIBUTE_NONNULL(3);

398 399 400 401 402
int virStorageFileParseBackingStoreStr(const char *str,
                                       char **target,
                                       unsigned int *chainIndex)
    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(3);

403
virStorageSourcePtr virStorageFileChainLookup(virStorageSourcePtr chain,
404
                                              virStorageSourcePtr startFrom,
405
                                              const char *name,
406
                                              unsigned int idx,
407
                                              virStorageSourcePtr *parent)
408
    ATTRIBUTE_NONNULL(1);
409

410 411 412
int virStorageFileResize(const char *path,
                         unsigned long long capacity,
                         bool pre_allocate);
413

414
int virStorageFileIsClusterFS(const char *path);
415
bool virStorageIsFile(const char *path);
416
bool virStorageIsRelative(const char *backing);
417

418 419 420
int virStorageFileGetLVMKey(const char *path,
                            char **key);
int virStorageFileGetSCSIKey(const char *path,
421 422
                             char **key,
                             bool ignoreError);
423 424
int virStorageFileGetNPIVKey(const char *path,
                             char **key);
425

426 427
void virStorageAuthDefFree(virStorageAuthDefPtr def);
virStorageAuthDefPtr virStorageAuthDefCopy(const virStorageAuthDef *src);
428 429
virStorageAuthDefPtr virStorageAuthDefParse(xmlNodePtr node,
                                            xmlXPathContextPtr ctxt);
430
void virStorageAuthDefFormat(virBufferPtr buf, virStorageAuthDefPtr authdef);
431

432 433 434
void virStoragePRDefFree(virStoragePRDefPtr prd);
virStoragePRDefPtr virStoragePRDefParseXML(xmlXPathContextPtr ctxt);
void virStoragePRDefFormat(virBufferPtr buf,
435 436
                           virStoragePRDefPtr prd,
                           bool migratable);
437 438
bool virStoragePRDefIsEqual(virStoragePRDefPtr a,
                            virStoragePRDefPtr b);
439
bool virStoragePRDefIsManaged(virStoragePRDefPtr prd);
440

441 442 443
bool
virStorageSourceChainHasManagedPR(virStorageSourcePtr src);

444 445 446
void virStorageSourceNVMeDefFree(virStorageSourceNVMeDefPtr def);
G_DEFINE_AUTOPTR_CLEANUP_FUNC(virStorageSourceNVMeDef, virStorageSourceNVMeDefFree);

447 448
bool virStorageSourceChainHasNVMe(const virStorageSource *src);

449 450 451 452
virSecurityDeviceLabelDefPtr
virStorageSourceGetSecurityLabelDef(virStorageSourcePtr src,
                                    const char *model);

453 454 455 456 457
void virStorageNetHostDefClear(virStorageNetHostDefPtr def);
void virStorageNetHostDefFree(size_t nhosts, virStorageNetHostDefPtr hosts);
virStorageNetHostDefPtr virStorageNetHostDefCopy(size_t nhosts,
                                                 virStorageNetHostDefPtr hosts);

458 459 460
int virStorageSourceInitChainElement(virStorageSourcePtr newelem,
                                     virStorageSourcePtr old,
                                     bool force);
461 462
void virStorageSourcePoolDefFree(virStorageSourcePoolDefPtr def);
void virStorageSourceClear(virStorageSourcePtr def);
463
int virStorageSourceGetActualType(const virStorageSource *def);
464
bool virStorageSourceIsLocalStorage(const virStorageSource *src);
465
bool virStorageSourceIsEmpty(virStorageSourcePtr src);
466
bool virStorageSourceIsBlockLocal(const virStorageSource *src);
467
virStorageSourcePtr virStorageSourceNew(void);
468
void virStorageSourceBackingStoreClear(virStorageSourcePtr def);
469 470
int virStorageSourceUpdatePhysicalSize(virStorageSourcePtr src,
                                       int fd, struct stat const *sb);
471 472
int virStorageSourceUpdateBackingSizes(virStorageSourcePtr src,
                                       int fd, struct stat const *sb);
473
int virStorageSourceUpdateCapacity(virStorageSourcePtr src,
474
                                   char *buf, ssize_t len);
475

476 477 478
int virStorageSourceNewFromBacking(virStorageSourcePtr parent,
                                   virStorageSourcePtr *backing);

479 480 481
virStorageSourcePtr virStorageSourceCopy(const virStorageSource *src,
                                         bool backingChain)
    ATTRIBUTE_NONNULL(1);
482 483 484
bool virStorageSourceIsSameLocation(virStorageSourcePtr a,
                                    virStorageSourcePtr b)
    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
485

486 487 488 489
int virStorageSourceParseRBDColonString(const char *rbdstr,
                                        virStorageSourcePtr src)
    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);

490 491 492 493 494 495 496
typedef int
(*virStorageFileSimplifyPathReadlinkCallback)(const char *path,
                                              char **link,
                                              void *data);
char *virStorageFileCanonicalizePath(const char *path,
                                     virStorageFileSimplifyPathReadlinkCallback cb,
                                     void *cbdata);
497

498 499 500 501 502
int virStorageFileGetRelativeBackingPath(virStorageSourcePtr from,
                                         virStorageSourcePtr to,
                                         char **relpath)
    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3);

503
int virStorageFileCheckCompat(const char *compat);
504

505 506
int virStorageSourceNewFromBackingAbsolute(const char *path,
                                           virStorageSourcePtr *src);
507

508 509
bool virStorageSourceIsRelative(virStorageSourcePtr src);

510 511 512 513 514 515
virStorageSourcePtr
virStorageSourceFindByNodeName(virStorageSourcePtr top,
                               const char *nodeName,
                               unsigned int *index)
    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);

516
void
517 518
virStorageSourceNetworkAssignDefaultPorts(virStorageSourcePtr src)
    ATTRIBUTE_NONNULL(1);
519

520 521 522 523 524 525
bool
virStorageSourceIsBacking(const virStorageSource *src);
bool
virStorageSourceHasBacking(const virStorageSource *src);


526 527 528 529 530 531 532
int
virStorageSourcePrivateDataParseRelPath(xmlXPathContextPtr ctxt,
                                        virStorageSourcePtr src);
int
virStorageSourcePrivateDataFormatRelPath(virStorageSourcePtr src,
                                         virBufferPtr buf);

533 534 535 536 537 538 539 540 541 542 543 544 545 546 547
void
virStorageSourceInitiatorParseXML(xmlXPathContextPtr ctxt,
                                  virStorageSourceInitiatorDefPtr initiator);

void
virStorageSourceInitiatorFormatXML(virStorageSourceInitiatorDefPtr initiator,
                                   virBufferPtr buf);

int
virStorageSourceInitiatorCopy(virStorageSourceInitiatorDefPtr dest,
                              const virStorageSourceInitiatorDef *src);

void
virStorageSourceInitiatorClear(virStorageSourceInitiatorDefPtr initiator);

548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564
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);

565 566
int virStorageFileSupportsSecurityDriver(const virStorageSource *src);
int virStorageFileSupportsAccess(const virStorageSource *src);
567
int virStorageFileSupportsCreate(const virStorageSource *src);
568
int virStorageFileSupportsBackingChainTraversal(const virStorageSource *src);
569 570 571 572 573 574

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

575 576 577
int virStorageFileGetBackingStoreStr(virStorageSourcePtr src,
                                     char **backing)
    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
578 579 580 581

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

583
G_DEFINE_AUTOPTR_CLEANUP_FUNC(virStorageAuthDef, virStorageAuthDefFree);