254
260
static virStoragePoolPtr
255
261
storagePoolLookupByUUID(virConnectPtr conn,
256
262
const unsigned char *uuid) {
257
virStorageDriverStatePtr driver =
258
(virStorageDriverStatePtr)conn->storagePrivateData;
259
virStoragePoolObjPtr pool = virStoragePoolObjFindByUUID(&driver->pools, uuid);
260
virStoragePoolPtr ret;
263
virStorageDriverStatePtr driver = conn->storagePrivateData;
264
virStoragePoolObjPtr pool;
265
virStoragePoolPtr ret = NULL;
267
storageDriverLock(driver);
268
pool = virStoragePoolObjFindByUUID(&driver->pools, uuid);
269
storageDriverUnlock(driver);
263
272
virStorageReportError(conn, VIR_ERR_NO_STORAGE_POOL,
264
273
"%s", _("no pool with matching uuid"));
268
277
ret = virGetStoragePool(conn, pool->def->name, pool->def->uuid);
281
virStoragePoolObjUnlock(pool);
272
285
static virStoragePoolPtr
273
286
storagePoolLookupByName(virConnectPtr conn,
274
287
const char *name) {
275
virStorageDriverStatePtr driver =
276
(virStorageDriverStatePtr)conn->storagePrivateData;
277
virStoragePoolObjPtr pool = virStoragePoolObjFindByName(&driver->pools, name);
278
virStoragePoolPtr ret;
288
virStorageDriverStatePtr driver = conn->storagePrivateData;
289
virStoragePoolObjPtr pool;
290
virStoragePoolPtr ret = NULL;
292
storageDriverLock(driver);
293
pool = virStoragePoolObjFindByName(&driver->pools, name);
294
storageDriverUnlock(driver);
281
297
virStorageReportError(conn, VIR_ERR_NO_STORAGE_POOL,
282
298
"%s", _("no pool with matching name"));
286
302
ret = virGetStoragePool(conn, pool->def->name, pool->def->uuid);
306
virStoragePoolObjUnlock(pool);
326
350
storageListPools(virConnectPtr conn,
327
351
char **const names,
329
virStorageDriverStatePtr driver =
330
(virStorageDriverStatePtr)conn->storagePrivateData;
353
virStorageDriverStatePtr driver = conn->storagePrivateData;
356
storageDriverLock(driver);
333
357
for (i = 0 ; i < driver->pools.count && got < nnames ; i++) {
358
virStoragePoolObjLock(driver->pools.objs[i]);
334
359
if (virStoragePoolObjIsActive(driver->pools.objs[i])) {
335
360
if (!(names[got] = strdup(driver->pools.objs[i]->def->name))) {
336
virStorageReportError(conn, VIR_ERR_NO_MEMORY,
361
virStoragePoolObjUnlock(driver->pools.objs[i]);
362
virReportOOMError(conn);
367
virStoragePoolObjUnlock(driver->pools.objs[i]);
369
storageDriverUnlock(driver);
346
for (i = 0 ; i < got ; i++) {
373
storageDriverUnlock(driver);
374
for (i = 0 ; i < got ; i++)
350
376
memset(names, 0, nnames * sizeof(*names));
355
381
storageNumDefinedPools(virConnectPtr conn) {
356
virStorageDriverStatePtr driver
357
= (virStorageDriverStatePtr)conn->storagePrivateData;
382
virStorageDriverStatePtr driver = conn->storagePrivateData;
358
383
unsigned int i, nactive = 0;
360
for (i = 0 ; i < driver->pools.count ; i++)
385
storageDriverLock(driver);
386
for (i = 0 ; i < driver->pools.count ; i++) {
387
virStoragePoolObjLock(driver->pools.objs[i]);
361
388
if (!virStoragePoolObjIsActive(driver->pools.objs[i]))
390
virStoragePoolObjUnlock(driver->pools.objs[i]);
392
storageDriverUnlock(driver);
421
459
storagePoolCreate(virConnectPtr conn,
423
461
unsigned int flags ATTRIBUTE_UNUSED) {
424
virStorageDriverStatePtr driver =
425
(virStorageDriverStatePtr )conn->storagePrivateData;
462
virStorageDriverStatePtr driver = conn->storagePrivateData;
426
463
virStoragePoolDefPtr def;
427
virStoragePoolObjPtr pool;
428
virStoragePoolPtr ret;
464
virStoragePoolObjPtr pool = NULL;
465
virStoragePoolPtr ret = NULL;
429
466
virStorageBackendPtr backend;
468
storageDriverLock(driver);
431
469
if (!(def = virStoragePoolDefParse(conn, xml, NULL)))
434
if (virStoragePoolObjFindByUUID(&driver->pools, def->uuid) ||
435
virStoragePoolObjFindByName(&driver->pools, def->name)) {
472
pool = virStoragePoolObjFindByUUID(&driver->pools, def->uuid);
474
pool = virStoragePoolObjFindByName(&driver->pools, def->name);
436
477
virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR,
437
478
"%s", _("storage pool already exists"));
438
virStoragePoolDefFree(def);
442
if ((backend = virStorageBackendForType(def->type)) == NULL) {
443
virStoragePoolDefFree(def);
447
if (!(pool = virStoragePoolObjAssignDef(conn, &driver->pools, def))) {
448
virStoragePoolDefFree(def);
482
if ((backend = virStorageBackendForType(def->type)) == NULL)
485
if (!(pool = virStoragePoolObjAssignDef(conn, &driver->pools, def)))
452
489
if (backend->startPool &&
453
490
backend->startPool(conn, pool) < 0)
455
493
if (backend->refreshPool(conn, pool) < 0) {
456
494
if (backend->stopPool)
457
495
backend->stopPool(conn, pool);
460
498
pool->active = 1;
462
500
ret = virGetStoragePool(conn, pool->def->name, pool->def->uuid);
503
virStoragePoolDefFree(def);
505
virStoragePoolObjUnlock(pool);
506
storageDriverUnlock(driver);
468
511
storagePoolDefine(virConnectPtr conn,
470
513
unsigned int flags ATTRIBUTE_UNUSED) {
471
virStorageDriverStatePtr driver
472
= (virStorageDriverStatePtr )conn->storagePrivateData;
514
virStorageDriverStatePtr driver = conn->storagePrivateData;
473
515
virStoragePoolDefPtr def;
474
virStoragePoolObjPtr pool;
475
virStoragePoolPtr ret;
516
virStoragePoolObjPtr pool = NULL;
517
virStoragePoolPtr ret = NULL;
476
518
virStorageBackendPtr backend;
520
storageDriverLock(driver);
478
521
if (!(def = virStoragePoolDefParse(conn, xml, NULL)))
481
if ((backend = virStorageBackendForType(def->type)) == NULL) {
482
virStoragePoolDefFree(def);
486
if (!(pool = virStoragePoolObjAssignDef(conn, &driver->pools, def))) {
487
virStoragePoolDefFree(def);
524
if ((backend = virStorageBackendForType(def->type)) == NULL)
527
if (!(pool = virStoragePoolObjAssignDef(conn, &driver->pools, def)))
491
530
if (virStoragePoolObjSaveDef(conn, driver, pool, def) < 0) {
492
531
virStoragePoolObjRemove(&driver->pools, pool);
496
537
ret = virGetStoragePool(conn, pool->def->name, pool->def->uuid);
540
virStoragePoolDefFree(def);
542
virStoragePoolObjUnlock(pool);
543
storageDriverUnlock(driver);
501
548
storagePoolUndefine(virStoragePoolPtr obj) {
502
virStorageDriverStatePtr driver =
503
(virStorageDriverStatePtr)obj->conn->storagePrivateData;
504
virStoragePoolObjPtr pool = virStoragePoolObjFindByUUID(&driver->pools, obj->uuid);
549
virStorageDriverStatePtr driver = obj->conn->storagePrivateData;
550
virStoragePoolObjPtr pool;
553
storageDriverLock(driver);
554
pool = virStoragePoolObjFindByUUID(&driver->pools, obj->uuid);
507
556
virStorageReportError(obj->conn, VIR_ERR_INVALID_STORAGE_POOL,
508
557
"%s", _("no storage pool with matching uuid"));
512
561
if (virStoragePoolObjIsActive(pool)) {
513
562
virStorageReportError(obj->conn, VIR_ERR_INTERNAL_ERROR,
514
563
"%s", _("pool is still active"));
518
567
if (virStoragePoolObjDeleteDef(obj->conn, pool) < 0)
521
570
if (unlink(pool->autostartLink) < 0 && errno != ENOENT && errno != ENOTDIR)
522
571
storageLog("Failed to delete autostart link '%s': %s",
526
575
VIR_FREE(pool->autostartLink);
528
577
virStoragePoolObjRemove(&driver->pools, pool);
583
virStoragePoolObjUnlock(pool);
584
storageDriverUnlock(driver);
534
589
storagePoolStart(virStoragePoolPtr obj,
535
590
unsigned int flags ATTRIBUTE_UNUSED) {
536
virStorageDriverStatePtr driver =
537
(virStorageDriverStatePtr)obj->conn->storagePrivateData;
538
virStoragePoolObjPtr pool = virStoragePoolObjFindByUUID(&driver->pools, obj->uuid);
591
virStorageDriverStatePtr driver = obj->conn->storagePrivateData;
592
virStoragePoolObjPtr pool;
539
593
virStorageBackendPtr backend;
596
storageDriverLock(driver);
597
pool = virStoragePoolObjFindByUUID(&driver->pools, obj->uuid);
598
storageDriverUnlock(driver);
542
601
virStorageReportError(obj->conn, VIR_ERR_INVALID_STORAGE_POOL,
543
602
"%s", _("no storage pool with matching uuid"));
547
if ((backend = virStorageBackendForType(pool->def->type)) == NULL) {
606
if ((backend = virStorageBackendForType(pool->def->type)) == NULL)
551
609
if (virStoragePoolObjIsActive(pool)) {
552
610
virStorageReportError(obj->conn, VIR_ERR_INTERNAL_ERROR,
553
611
"%s", _("pool already active"));
556
614
if (backend->startPool &&
557
615
backend->startPool(obj->conn, pool) < 0)
559
618
if (backend->refreshPool(obj->conn, pool) < 0) {
560
619
if (backend->stopPool)
561
620
backend->stopPool(obj->conn, pool);
565
624
pool->active = 1;
629
virStoragePoolObjUnlock(pool);
571
634
storagePoolBuild(virStoragePoolPtr obj,
572
635
unsigned int flags) {
573
virStorageDriverStatePtr driver
574
= (virStorageDriverStatePtr)obj->conn->storagePrivateData;
575
virStoragePoolObjPtr pool = virStoragePoolObjFindByUUID(&driver->pools, obj->uuid);
636
virStorageDriverStatePtr driver = obj->conn->storagePrivateData;
637
virStoragePoolObjPtr pool;
576
638
virStorageBackendPtr backend;
641
storageDriverLock(driver);
642
pool = virStoragePoolObjFindByUUID(&driver->pools, obj->uuid);
643
storageDriverUnlock(driver);
579
646
virStorageReportError(obj->conn, VIR_ERR_INVALID_STORAGE_POOL,
580
647
"%s", _("no storage pool with matching uuid"));
584
if ((backend = virStorageBackendForType(pool->def->type)) == NULL) {
651
if ((backend = virStorageBackendForType(pool->def->type)) == NULL)
588
654
if (virStoragePoolObjIsActive(pool)) {
589
655
virStorageReportError(obj->conn, VIR_ERR_INTERNAL_ERROR,
590
656
"%s", _("storage pool is already active"));
594
660
if (backend->buildPool &&
595
661
backend->buildPool(obj->conn, pool, flags) < 0)
667
virStoragePoolObjUnlock(pool);
603
673
storagePoolDestroy(virStoragePoolPtr obj) {
604
virStorageDriverStatePtr driver =
605
(virStorageDriverStatePtr)obj->conn->storagePrivateData;
606
virStoragePoolObjPtr pool = virStoragePoolObjFindByUUID(&driver->pools, obj->uuid);
674
virStorageDriverStatePtr driver = obj->conn->storagePrivateData;
675
virStoragePoolObjPtr pool;
607
676
virStorageBackendPtr backend;
679
storageDriverLock(driver);
680
pool = virStoragePoolObjFindByUUID(&driver->pools, obj->uuid);
610
683
virStorageReportError(obj->conn, VIR_ERR_INVALID_STORAGE_POOL,
611
684
"%s", _("no storage pool with matching uuid"));
615
if ((backend = virStorageBackendForType(pool->def->type)) == NULL) {
688
if ((backend = virStorageBackendForType(pool->def->type)) == NULL)
619
691
if (!virStoragePoolObjIsActive(pool)) {
620
692
virStorageReportError(obj->conn, VIR_ERR_INTERNAL_ERROR,
621
693
"%s", _("storage pool is not active"));
625
697
if (backend->stopPool &&
626
698
backend->stopPool(obj->conn, pool) < 0)
629
701
virStoragePoolObjClearVols(pool);
631
703
pool->active = 0;
633
if (pool->configFile == NULL)
705
if (pool->configFile == NULL) {
634
706
virStoragePoolObjRemove(&driver->pools, pool);
713
virStoragePoolObjUnlock(pool);
714
storageDriverUnlock(driver);
641
720
storagePoolDelete(virStoragePoolPtr obj,
642
721
unsigned int flags) {
643
virStorageDriverStatePtr driver =
644
(virStorageDriverStatePtr)obj->conn->storagePrivateData;
645
virStoragePoolObjPtr pool = virStoragePoolObjFindByUUID(&driver->pools, obj->uuid);
722
virStorageDriverStatePtr driver = obj->conn->storagePrivateData;
723
virStoragePoolObjPtr pool;
646
724
virStorageBackendPtr backend;
727
storageDriverLock(driver);
728
pool = virStoragePoolObjFindByUUID(&driver->pools, obj->uuid);
729
storageDriverUnlock(driver);
649
732
virStorageReportError(obj->conn, VIR_ERR_INVALID_STORAGE_POOL,
650
733
"%s", _("no storage pool with matching uuid"));
654
if ((backend = virStorageBackendForType(pool->def->type)) == NULL) {
737
if ((backend = virStorageBackendForType(pool->def->type)) == NULL)
658
740
if (virStoragePoolObjIsActive(pool)) {
659
741
virStorageReportError(obj->conn, VIR_ERR_INTERNAL_ERROR,
660
742
"%s", _("storage pool is still active"));
664
746
if (!backend->deletePool) {
665
747
virStorageReportError(obj->conn, VIR_ERR_NO_SUPPORT,
666
748
"%s", _("pool does not support volume delete"));
669
751
if (backend->deletePool(obj->conn, pool, flags) < 0)
757
virStoragePoolObjUnlock(pool);
677
763
storagePoolRefresh(virStoragePoolPtr obj,
678
764
unsigned int flags ATTRIBUTE_UNUSED) {
679
virStorageDriverStatePtr driver =
680
(virStorageDriverStatePtr)obj->conn->storagePrivateData;
681
virStoragePoolObjPtr pool = virStoragePoolObjFindByUUID(&driver->pools, obj->uuid);
765
virStorageDriverStatePtr driver = obj->conn->storagePrivateData;
766
virStoragePoolObjPtr pool;
682
767
virStorageBackendPtr backend;
770
storageDriverLock(driver);
771
pool = virStoragePoolObjFindByUUID(&driver->pools, obj->uuid);
772
storageDriverUnlock(driver);
686
775
virStorageReportError(obj->conn, VIR_ERR_INVALID_STORAGE_POOL,
687
776
"%s", _("no storage pool with matching uuid"));
691
if ((backend = virStorageBackendForType(pool->def->type)) == NULL) {
780
if ((backend = virStorageBackendForType(pool->def->type)) == NULL)
695
783
if (!virStoragePoolObjIsActive(pool)) {
696
784
virStorageReportError(obj->conn, VIR_ERR_INTERNAL_ERROR,
697
785
"%s", _("storage pool is not active"));
701
789
virStoragePoolObjClearVols(pool);
702
if ((ret = backend->refreshPool(obj->conn, pool)) < 0) {
790
if (backend->refreshPool(obj->conn, pool) < 0) {
703
791
if (backend->stopPool)
704
792
backend->stopPool(obj->conn, pool);
706
794
pool->active = 0;
708
if (pool->configFile == NULL)
796
if (pool->configFile == NULL) {
709
797
virStoragePoolObjRemove(&driver->pools, pool);
806
virStoragePoolObjUnlock(pool);
739
837
info->capacity = pool->def->capacity;
740
838
info->allocation = pool->def->allocation;
741
839
info->available = pool->def->available;
844
virStoragePoolObjUnlock(pool);
747
849
storagePoolDumpXML(virStoragePoolPtr obj,
748
850
unsigned int flags ATTRIBUTE_UNUSED) {
749
virStorageDriverStatePtr driver =
750
(virStorageDriverStatePtr)obj->conn->storagePrivateData;
751
virStoragePoolObjPtr pool = virStoragePoolObjFindByUUID(&driver->pools, obj->uuid);
851
virStorageDriverStatePtr driver = obj->conn->storagePrivateData;
852
virStoragePoolObjPtr pool;
855
storageDriverLock(driver);
856
pool = virStoragePoolObjFindByUUID(&driver->pools, obj->uuid);
857
storageDriverUnlock(driver);
754
860
virStorageReportError(obj->conn, VIR_ERR_INVALID_STORAGE_POOL,
755
861
"%s", _("no storage pool with matching uuid"));
759
return virStoragePoolDefFormat(obj->conn, pool->def);
865
ret = virStoragePoolDefFormat(obj->conn, pool->def);
869
virStoragePoolObjUnlock(pool);
763
874
storagePoolGetAutostart(virStoragePoolPtr obj,
764
875
int *autostart) {
765
virStorageDriverStatePtr driver =
766
(virStorageDriverStatePtr)obj->conn->storagePrivateData;
767
virStoragePoolObjPtr pool = virStoragePoolObjFindByUUID(&driver->pools, obj->uuid);
876
virStorageDriverStatePtr driver = obj->conn->storagePrivateData;
877
virStoragePoolObjPtr pool;
880
storageDriverLock(driver);
881
pool = virStoragePoolObjFindByUUID(&driver->pools, obj->uuid);
882
storageDriverUnlock(driver);
770
885
virStorageReportError(obj->conn, VIR_ERR_INVALID_STORAGE_POOL,
771
886
"%s", _("no pool with matching uuid"));
775
890
if (!pool->configFile) {
778
893
*autostart = pool->autostart;
899
virStoragePoolObjUnlock(pool);
785
904
storagePoolSetAutostart(virStoragePoolPtr obj,
787
virStorageDriverStatePtr driver =
788
(virStorageDriverStatePtr)obj->conn->storagePrivateData;
789
virStoragePoolObjPtr pool = virStoragePoolObjFindByUUID(&driver->pools, obj->uuid);
906
virStorageDriverStatePtr driver = obj->conn->storagePrivateData;
907
virStoragePoolObjPtr pool;
910
storageDriverLock(driver);
911
pool = virStoragePoolObjFindByUUID(&driver->pools, obj->uuid);
912
storageDriverUnlock(driver);
792
915
virStorageReportError(obj->conn, VIR_ERR_INVALID_STORAGE_POOL,
793
916
"%s", _("no pool with matching uuid"));
797
920
if (!pool->configFile) {
798
921
virStorageReportError(obj->conn, VIR_ERR_INVALID_ARG,
799
922
"%s", _("pool has no config file"));
803
926
autostart = (autostart != 0);
805
if (pool->autostart == autostart)
811
if ((err = virFileMakePath(driver->autostartDir))) {
812
virStorageReportError(obj->conn, VIR_ERR_INTERNAL_ERROR,
813
_("cannot create autostart directory %s: %s"),
814
driver->autostartDir, strerror(err));
818
if (symlink(pool->configFile, pool->autostartLink) < 0) {
819
virStorageReportError(obj->conn, VIR_ERR_INTERNAL_ERROR,
820
_("Failed to create symlink '%s' to '%s': %s"),
821
pool->autostartLink, pool->configFile,
826
if (unlink(pool->autostartLink) < 0 &&
827
errno != ENOENT && errno != ENOTDIR) {
828
virStorageReportError(obj->conn, VIR_ERR_INTERNAL_ERROR,
829
_("Failed to delete symlink '%s': %s"),
830
pool->autostartLink, strerror(errno));
928
if (pool->autostart != autostart) {
932
if ((err = virFileMakePath(driver->autostartDir))) {
933
virReportSystemError(obj->conn, err,
934
_("cannot create autostart directory %s"),
935
driver->autostartDir);
939
if (symlink(pool->configFile, pool->autostartLink) < 0) {
940
virReportSystemError(obj->conn, errno,
941
_("Failed to create symlink '%s' to '%s'"),
942
pool->autostartLink, pool->configFile);
946
if (unlink(pool->autostartLink) < 0 &&
947
errno != ENOENT && errno != ENOTDIR) {
948
virReportSystemError(obj->conn, errno,
949
_("Failed to delete symlink '%s'"),
950
pool->autostartLink);
954
pool->autostart = autostart;
835
pool->autostart = autostart;
960
virStoragePoolObjUnlock(pool);
842
966
storagePoolNumVolumes(virStoragePoolPtr obj) {
843
virStorageDriverStatePtr driver =
844
(virStorageDriverStatePtr)obj->conn->storagePrivateData;
845
virStoragePoolObjPtr pool = virStoragePoolObjFindByUUID(&driver->pools, obj->uuid);
967
virStorageDriverStatePtr driver = obj->conn->storagePrivateData;
968
virStoragePoolObjPtr pool;
971
storageDriverLock(driver);
972
pool = virStoragePoolObjFindByUUID(&driver->pools, obj->uuid);
973
storageDriverUnlock(driver);
848
976
virStorageReportError(obj->conn, VIR_ERR_INVALID_STORAGE_POOL,
849
977
"%s", _("no storage pool with matching uuid"));
853
981
if (!virStoragePoolObjIsActive(pool)) {
854
982
virStorageReportError(obj->conn, VIR_ERR_INTERNAL_ERROR,
855
983
"%s", _("storage pool is not active"));
986
ret = pool->volumes.count;
859
return pool->volumes.count;
990
virStoragePoolObjUnlock(pool);
863
995
storagePoolListVolumes(virStoragePoolPtr obj,
864
996
char **const names,
866
virStorageDriverStatePtr driver =
867
(virStorageDriverStatePtr)obj->conn->storagePrivateData;
868
virStoragePoolObjPtr pool = virStoragePoolObjFindByUUID(&driver->pools, obj->uuid);
998
virStorageDriverStatePtr driver = obj->conn->storagePrivateData;
999
virStoragePoolObjPtr pool;
1002
memset(names, 0, maxnames * sizeof(*names));
1004
storageDriverLock(driver);
1005
pool = virStoragePoolObjFindByUUID(&driver->pools, obj->uuid);
1006
storageDriverUnlock(driver);
872
1009
virStorageReportError(obj->conn, VIR_ERR_INVALID_STORAGE_POOL,
873
1010
"%s", _("no storage pool with matching uuid"));
877
1014
if (!virStoragePoolObjIsActive(pool)) {
878
1015
virStorageReportError(obj->conn, VIR_ERR_INTERNAL_ERROR,
879
1016
"%s", _("storage pool is not active"));
883
memset(names, 0, maxnames * sizeof(*names));
884
1020
for (i = 0 ; i < pool->volumes.count && n < maxnames ; i++) {
885
1021
if ((names[n++] = strdup(pool->volumes.objs[i]->name)) == NULL) {
886
virStorageReportError(obj->conn, VIR_ERR_NO_MEMORY,
1022
virReportOOMError(obj->conn);
1027
virStoragePoolObjUnlock(pool);
1032
virStoragePoolObjUnlock(pool);
895
1033
for (n = 0 ; n < maxnames ; n++)
898
1036
memset(names, 0, maxnames * sizeof(*names));
926
1068
virStorageReportError(obj->conn, VIR_ERR_INVALID_STORAGE_POOL,
927
1069
"%s", _("no storage vol with matching name"));
931
return virGetStorageVol(obj->conn, pool->def->name, vol->name, vol->key);
1073
ret = virGetStorageVol(obj->conn, pool->def->name, vol->name, vol->key);
1077
virStoragePoolObjUnlock(pool);
935
1082
static virStorageVolPtr
936
1083
storageVolumeLookupByKey(virConnectPtr conn,
937
1084
const char *key) {
938
virStorageDriverStatePtr driver =
939
(virStorageDriverStatePtr)conn->storagePrivateData;
1085
virStorageDriverStatePtr driver = conn->storagePrivateData;
1087
virStorageVolPtr ret = NULL;
942
for (i = 0 ; i < driver->pools.count ; i++) {
1089
storageDriverLock(driver);
1090
for (i = 0 ; i < driver->pools.count && !ret ; i++) {
1091
virStoragePoolObjLock(driver->pools.objs[i]);
943
1092
if (virStoragePoolObjIsActive(driver->pools.objs[i])) {
944
1093
virStorageVolDefPtr vol =
945
1094
virStorageVolDefFindByKey(driver->pools.objs[i], key);
948
return virGetStorageVol(conn,
949
driver->pools.objs[i]->def->name,
1097
ret = virGetStorageVol(conn,
1098
driver->pools.objs[i]->def->name,
1102
virStoragePoolObjUnlock(driver->pools.objs[i]);
955
virStorageReportError(conn, VIR_ERR_INVALID_STORAGE_VOL,
956
"%s", _("no storage vol with matching key"));
1104
storageDriverUnlock(driver);
1107
virStorageReportError(conn, VIR_ERR_INVALID_STORAGE_VOL,
1108
"%s", _("no storage vol with matching key"));
960
1113
static virStorageVolPtr
961
1114
storageVolumeLookupByPath(virConnectPtr conn,
962
1115
const char *path) {
963
virStorageDriverStatePtr driver =
964
(virStorageDriverStatePtr)conn->storagePrivateData;
1116
virStorageDriverStatePtr driver = conn->storagePrivateData;
1118
virStorageVolPtr ret = NULL;
967
for (i = 0 ; i < driver->pools.count ; i++) {
1120
storageDriverLock(driver);
1121
for (i = 0 ; i < driver->pools.count && !ret ; i++) {
1122
virStoragePoolObjLock(driver->pools.objs[i]);
968
1123
if (virStoragePoolObjIsActive(driver->pools.objs[i])) {
969
1124
virStorageVolDefPtr vol;
970
1125
const char *stable_path;
977
1132
* virStorageReportError if it fails; we just need to keep
978
1133
* propagating the return code
980
if (stable_path == NULL)
1135
if (stable_path == NULL) {
1136
virStoragePoolObjUnlock(driver->pools.objs[i]);
983
1140
vol = virStorageVolDefFindByPath(driver->pools.objs[i],
985
1142
VIR_FREE(stable_path);
988
return virGetStorageVol(conn,
989
driver->pools.objs[i]->def->name,
1145
ret = virGetStorageVol(conn,
1146
driver->pools.objs[i]->def->name,
1150
virStoragePoolObjUnlock(driver->pools.objs[i]);
995
virStorageReportError(conn, VIR_ERR_INVALID_STORAGE_VOL,
996
"%s", _("no storage vol with matching path"));
1154
virStorageReportError(conn, VIR_ERR_INVALID_STORAGE_VOL,
1155
"%s", _("no storage vol with matching path"));
1158
storageDriverUnlock(driver);
1000
1162
static virStorageVolPtr
1001
1163
storageVolumeCreateXML(virStoragePoolPtr obj,
1002
1164
const char *xmldesc,
1003
1165
unsigned int flags ATTRIBUTE_UNUSED) {
1004
virStorageDriverStatePtr driver =
1005
(virStorageDriverStatePtr)obj->conn->storagePrivateData;
1006
virStoragePoolObjPtr pool = virStoragePoolObjFindByUUID(&driver->pools, obj->uuid);
1166
virStorageDriverStatePtr driver = obj->conn->storagePrivateData;
1167
virStoragePoolObjPtr pool;
1007
1168
virStorageBackendPtr backend;
1008
virStorageVolDefPtr vol;
1169
virStorageVolDefPtr vol = NULL;
1170
virStorageVolPtr ret = NULL;
1172
storageDriverLock(driver);
1173
pool = virStoragePoolObjFindByUUID(&driver->pools, obj->uuid);
1174
storageDriverUnlock(driver);
1011
1177
virStorageReportError(obj->conn, VIR_ERR_INVALID_STORAGE_POOL,
1012
1178
"%s", _("no storage pool with matching uuid"));
1016
1182
if (!virStoragePoolObjIsActive(pool)) {
1017
1183
virStorageReportError(obj->conn, VIR_ERR_INTERNAL_ERROR,
1018
1184
"%s", _("storage pool is not active"));
1022
1188
if ((backend = virStorageBackendForType(pool->def->type)) == NULL)
1025
1191
vol = virStorageVolDefParse(obj->conn, pool->def, xmldesc, NULL);
1026
1192
if (vol == NULL)
1029
1195
if (virStorageVolDefFindByName(pool, vol->name)) {
1030
1196
virStorageReportError(obj->conn, VIR_ERR_INVALID_STORAGE_POOL,
1031
1197
"%s", _("storage vol already exists"));
1032
virStorageVolDefFree(vol);
1036
1201
if (VIR_REALLOC_N(pool->volumes.objs,
1037
1202
pool->volumes.count+1) < 0) {
1038
virStorageReportError(obj->conn, VIR_ERR_NO_MEMORY, NULL);
1039
virStorageVolDefFree(vol);
1203
virReportOOMError(obj->conn);
1043
1207
if (!backend->createVol) {
1044
1208
virStorageReportError(obj->conn, VIR_ERR_NO_SUPPORT,
1045
1209
"%s", _("storage pool does not support volume creation"));
1046
virStorageVolDefFree(vol);
1213
/* XXX ought to drop pool lock while creating instance */
1050
1214
if (backend->createVol(obj->conn, pool, vol) < 0) {
1051
virStorageVolDefFree(vol);
1055
1218
pool->volumes.objs[pool->volumes.count++] = vol;
1057
return virGetStorageVol(obj->conn, pool->def->name, vol->name, vol->key);
1220
ret = virGetStorageVol(obj->conn, pool->def->name, vol->name, vol->key);
1224
virStorageVolDefFree(vol);
1226
virStoragePoolObjUnlock(pool);
1061
1231
storageVolumeDelete(virStorageVolPtr obj,
1062
1232
unsigned int flags) {
1063
virStorageDriverStatePtr driver =
1064
(virStorageDriverStatePtr)obj->conn->storagePrivateData;
1065
virStoragePoolObjPtr pool = virStoragePoolObjFindByName(&driver->pools, obj->pool);
1233
virStorageDriverStatePtr driver = obj->conn->storagePrivateData;
1234
virStoragePoolObjPtr pool;
1066
1235
virStorageBackendPtr backend;
1067
virStorageVolDefPtr vol;
1236
virStorageVolDefPtr vol = NULL;
1068
1237
unsigned int i;
1240
storageDriverLock(driver);
1241
pool = virStoragePoolObjFindByName(&driver->pools, obj->pool);
1242
storageDriverUnlock(driver);
1071
1245
virStorageReportError(obj->conn, VIR_ERR_INVALID_STORAGE_POOL,
1072
1246
"%s", _("no storage pool with matching uuid"));
1076
1250
if (!virStoragePoolObjIsActive(pool)) {
1077
1251
virStorageReportError(obj->conn, VIR_ERR_INTERNAL_ERROR,
1078
1252
"%s", _("storage pool is not active"));
1082
1256
if ((backend = virStorageBackendForType(pool->def->type)) == NULL)
1085
1259
vol = virStorageVolDefFindByName(pool, obj->name);
1088
1262
virStorageReportError(obj->conn, VIR_ERR_INVALID_STORAGE_POOL,
1089
1263
"%s", _("no storage vol with matching name"));
1093
1267
if (!backend->deleteVol) {
1094
1268
virStorageReportError(obj->conn, VIR_ERR_NO_SUPPORT,
1095
1269
"%s", _("storage pool does not support vol deletion"));
1096
virStorageVolDefFree(vol);
1100
if (backend->deleteVol(obj->conn, pool, vol, flags) < 0) {
1274
if (backend->deleteVol(obj->conn, pool, vol, flags) < 0)
1104
1277
for (i = 0 ; i < pool->volumes.count ; i++) {
1105
1278
if (pool->volumes.objs[i] == vol) {
1106
1279
virStorageVolDefFree(vol);
1108
1282
if (i < (pool->volumes.count - 1))
1109
1283
memmove(pool->volumes.objs + i, pool->volumes.objs + i + 1,
1148
1331
virStorageReportError(obj->conn, VIR_ERR_INVALID_STORAGE_POOL,
1149
1332
"%s", _("no storage vol with matching name"));
1153
1336
if ((backend = virStorageBackendForType(pool->def->type)) == NULL)
1156
1339
if (backend->refreshVol &&
1157
1340
backend->refreshVol(obj->conn, pool, vol) < 0)
1160
1343
memset(info, 0, sizeof(*info));
1161
1344
info->type = vol->type;
1162
1345
info->capacity = vol->capacity;
1163
1346
info->allocation = vol->allocation;
1351
virStoragePoolObjUnlock(pool);
1169
1356
storageVolumeGetXMLDesc(virStorageVolPtr obj,
1170
1357
unsigned int flags ATTRIBUTE_UNUSED) {
1171
virStorageDriverStatePtr driver =
1172
(virStorageDriverStatePtr)obj->conn->storagePrivateData;
1173
virStoragePoolObjPtr pool = virStoragePoolObjFindByName(&driver->pools, obj->pool);
1358
virStorageDriverStatePtr driver = obj->conn->storagePrivateData;
1359
virStoragePoolObjPtr pool;
1174
1360
virStorageBackendPtr backend;
1175
1361
virStorageVolDefPtr vol;
1364
storageDriverLock(driver);
1365
pool = virStoragePoolObjFindByName(&driver->pools, obj->pool);
1366
storageDriverUnlock(driver);
1178
1369
virStorageReportError(obj->conn, VIR_ERR_INVALID_STORAGE_POOL,
1179
1370
"%s", _("no storage pool with matching uuid"));
1183
1374
if (!virStoragePoolObjIsActive(pool)) {
1184
1375
virStorageReportError(obj->conn, VIR_ERR_INTERNAL_ERROR,
1185
1376
"%s", _("storage pool is not active"));
1189
1380
vol = virStorageVolDefFindByName(pool, obj->name);
1192
1383
virStorageReportError(obj->conn, VIR_ERR_INVALID_STORAGE_POOL,
1193
1384
"%s", _("no storage vol with matching name"));
1197
1388
if ((backend = virStorageBackendForType(pool->def->type)) == NULL)
1200
return virStorageVolDefFormat(obj->conn, pool->def, vol);
1391
ret = virStorageVolDefFormat(obj->conn, pool->def, vol);
1395
virStoragePoolObjUnlock(pool);
1204
1401
storageVolumeGetPath(virStorageVolPtr obj) {
1205
virStorageDriverStatePtr driver =
1206
(virStorageDriverStatePtr)obj->conn->storagePrivateData;
1207
virStoragePoolObjPtr pool = virStoragePoolObjFindByName(&driver->pools, obj->pool);
1402
virStorageDriverStatePtr driver = obj->conn->storagePrivateData;
1403
virStoragePoolObjPtr pool;
1208
1404
virStorageVolDefPtr vol;
1407
storageDriverLock(driver);
1408
pool = virStoragePoolObjFindByName(&driver->pools, obj->pool);
1409
storageDriverUnlock(driver);
1212
1411
virStorageReportError(obj->conn, VIR_ERR_INVALID_STORAGE_POOL,
1213
1412
"%s", _("no storage pool with matching uuid"));
1217
1416
if (!virStoragePoolObjIsActive(pool)) {
1218
1417
virStorageReportError(obj->conn, VIR_ERR_INTERNAL_ERROR,
1219
1418
"%s", _("storage pool is not active"));
1223
1422
vol = virStorageVolDefFindByName(pool, obj->name);