code: func (d *Driver) Put(id string) error {
  	title := fmt.Sprintf("lcowdriver: put: %s", id)
  
  	// Get the service VM that we need to remove from
  	svm, err := d.serviceVms.get(d.getVMID(id))
  	if err == errVMUnknown {
  		return nil
  	} else if err == errVMisTerminating {
  		return svm.getStopError()
  	}
  
  	// Generate the mounts that Get() might have mounted
  	disks, err := d.getAllMounts(id)
  	if err != nil {
  		logrus.Debugf("%s failed to get all layer details for %s: %s", title, d.dir(id), err)
  		return fmt.Errorf("%s failed to get layer details for %s: %s", title, d.dir(id), err)
  	}
  
  	// Now, we want to perform the unmounts, hot-remove and stop the service vm.
  	// We want to go though all the steps even if we have an error to clean up properly
  	err = svm.deleteUnionMount(unionMountName(disks), disks...)
  	if err != nil {
  		logrus.Debugf("%s failed to delete union mount %s: %s", title, id, err)
  	}
  
  	err1 := svm.hotRemoveVHDs(disks...)
  	if err1 != nil {
  		logrus.Debugf("%s failed to hot remove vhds %s: %s", title, id, err)
  		if err == nil {
  			err = err1
  		}
  	}
  
  	err1 = d.terminateServiceVM(id, fmt.Sprintf("Put %s", id), false)
  	if err1 != nil {
  		logrus.Debugf("%s failed to terminate service vm %s: %s", title, id, err1)
  		if err == nil {
  			err = err1
  		}
  	}
  	logrus.Debugf("Put succeeded on id %s", id)
  	return err
  }
docs: // Put does the reverse of get. If there are no more references to
  // the layer, it unmounts it from the utility VM.