lxd/storage_lvm.go
func (s *storageLvm) StoragePoolMount() (bool, error) {
	source := s.pool.Config["source"]
	if source == "" {
		return false, fmt.Errorf("no \"source\" property found for the storage pool")
	}

	if !filepath.IsAbs(source) {
		return true, nil
	}

	poolMountLockID := getPoolMountLockID(s.pool.Name)
	lxdStorageMapLock.Lock()
	if waitChannel, ok := lxdStorageOngoingOperationMap[poolMountLockID]; ok {
		lxdStorageMapLock.Unlock()
		if _, ok := <-waitChannel; ok {
			logger.Warnf("Received value over semaphore, this should not have happened")
		}
		// Give the benefit of the doubt and assume that the other
		// thread actually succeeded in mounting the storage pool.
		return false, nil
	}

	lxdStorageOngoingOperationMap[poolMountLockID] = make(chan bool)
	lxdStorageMapLock.Unlock()

	removeLockFromMap := func() {
		lxdStorageMapLock.Lock()
		if waitChannel, ok := lxdStorageOngoingOperationMap[poolMountLockID]; ok {
			close(waitChannel)
			delete(lxdStorageOngoingOperationMap, poolMountLockID)
		}
		lxdStorageMapLock.Unlock()
	}

	defer removeLockFromMap()

	if filepath.IsAbs(source) && !shared.IsBlockdevPath(source) {
		// Try to prepare new loop device.
		loopF, loopErr := prepareLoopDev(source, 0)
		if loopErr != nil {
			return false, loopErr
		}
		// Make sure that LO_FLAGS_AUTOCLEAR is unset.
		loopErr = unsetAutoclearOnLoopDev(int(loopF.Fd()))
		if loopErr != nil {
			return false, loopErr
		}
		s.loopInfo = loopF
	}

	return true, nil
}
func (s *storageLvm) StoragePoolMount() (bool, error) {
	source := s.pool.Config["source"]
	if source == "" {
		return false, fmt.Errorf("no \"source\" property found for the storage pool")
	}

	if !filepath.IsAbs(source) {
		return true, nil
	}

	poolMountLockID := getPoolMountLockID(s.pool.Name)
	lxdStorageMapLock.Lock()
	if waitChannel, ok := lxdStorageOngoingOperationMap[poolMountLockID]; ok {
		lxdStorageMapLock.Unlock()
		if _, ok := <-waitChannel; ok {
			logger.Warnf("Received value over semaphore, this should not have happened")
		}
		// Give the benefit of the doubt and assume that the other
		// thread actually succeeded in mounting the storage pool.
		return false, nil
	}

	lxdStorageOngoingOperationMap[poolMountLockID] = make(chan bool)
	lxdStorageMapLock.Unlock()

	removeLockFromMap := func() {
		lxdStorageMapLock.Lock()
		if waitChannel, ok := lxdStorageOngoingOperationMap[poolMountLockID]; ok {
			close(waitChannel)
			delete(lxdStorageOngoingOperationMap, poolMountLockID)
		}
		lxdStorageMapLock.Unlock()
	}

	defer removeLockFromMap()

	if filepath.IsAbs(source) && !shared.IsBlockdevPath(source) {
		// Try to prepare new loop device.
		loopF, loopErr := prepareLoopDev(source, 0)
		if loopErr != nil {
			return false, loopErr
		}
		// Make sure that LO_FLAGS_AUTOCLEAR is unset.
		loopErr = unsetAutoclearOnLoopDev(int(loopF.Fd()))
		if loopErr != nil {
			return false, loopErr
		}
		s.loopInfo = loopF
	}

	return true, nil
}
func ( s * storageLvm ) StoragePoolMount ( ) ( bool , error ) { source := s . pool . Config [ " " ] if source == " " { return false , fmt . Errorf ( " \" \" " ) } if ! filepath . IsAbs ( source ) { return true , nil } poolMountLockID := getPoolMountLockID ( s . pool . Name ) lxdStorageMapLock . Lock ( ) if waitChannel , ok := lxdStorageOngoingOperationMap [ poolMountLockID ] ; ok { lxdStorageMapLock . Unlock ( ) if _ , ok := <- waitChannel ; ok { logger . Warnf ( " " ) } // Give the benefit of the doubt and assume that the other // thread actually succeeded in mounting the storage pool. return false , nil } lxdStorageOngoingOperationMap [ poolMountLockID ] = make ( chan bool ) lxdStorageMapLock . Unlock ( ) removeLockFromMap := func ( ) { lxdStorageMapLock . Lock ( ) if waitChannel , ok := lxdStorageOngoingOperationMap [ poolMountLockID ] ; ok { close ( waitChannel ) delete ( lxdStorageOngoingOperationMap , poolMountLockID ) } lxdStorageMapLock . Unlock ( ) } defer removeLockFromMap ( ) if filepath . IsAbs ( source ) && ! shared . IsBlockdevPath ( source ) { // Try to prepare new loop device. loopF , loopErr := prepareLoopDev ( source , 0 ) if loopErr != nil { return false , loopErr } // Make sure that LO_FLAGS_AUTOCLEAR is unset. loopErr = unsetAutoclearOnLoopDev ( int ( loopF . Fd ( ) ) ) if loopErr != nil { return false , loopErr } s . loopInfo = loopF } return true , nil }
// Currently only used for loop-backed LVM storage pools. Can be called without
// overhead since it is essentially a noop for non-loop-backed LVM storage
// pools.
Currently only used for loop - backed LVM storage pools . Can be called without overhead since it is essentially a noop for non - loop - backed LVM storage pools .