• P
    Ignore backing file errors in FS storage pool · 0ed445e7
    Philipp Hahn 提交于
    Currently a single storage volume with a broken backing file will disable the
    whole storage pool. This can happen when the backing file is on some
    unavailable network storage or if the backing volume is deleted, while the
    storage volumes using it remain.
    Since the storage pool can not be re-activated, re-creating the missing
    or deleting the now useless volumes using libvirt only is not possible.
    
    Fixing this is a little bit tricky:
    1. virStorageBackendProbeTarget() only detects the missing backing file,
       if the backing file format is not explicitly specified. If the
       backing file is created using
    	   kvm-img create -f qcow2 -o backing_fmt=qcow2,backing_file=... ...
       no error is detected at this stage.
       The new return code -3 signals that the backing file could not be
       opened.
    2. The backingStore.format must be >= 0, since values < 0 would break
       virStorageVolTargetDefFormat() when dumping the XML data such as
           <format type='...'/>
       Because of this the format is faked as VIR_STORAGE_FILE_RAW.
    3. virStorageBackendUpdateVolTargetInfo() always opens the backing file
       and thus always detects a missing backing file.
       Since it "only" updates the capacity, allocation, owner, group, mode
       and SELinux label, just ignore errors at this stage, print an error
       message and continue.
    4. Using vol-dump on a broken volume still doesn't work, but at least
       vol-destroy and pool-refresh do work now.
    
    To reproduce:
      dir=$(mktemp -d)
      virsh pool-create-as tmp dir '' '' '' '' "$dir"
      virsh vol-create-as --format qcow2 tmp back 1G
      virsh vol-create-as --format qcow2 --backing-vol-format qcow2 --backing-vol back tmp cow 1G
      virsh vol-delete --pool tmp back
      virsh pool-refresh tmp
    After the last step, the pool will be gone (because it was not persistent). As
    long as the now broken image stays in the directory, you will not be able to
    re-create or re-start the pool.
    Signed-off-by: NPhilipp Hahn <hahn@univention.de>
    0ed445e7
storage_backend_fs.c 31.6 KB