func waitForPath(op trace.Operation, path string) error { defer trace.End(trace.Begin(path)) timeout := time.Duration(pathTimeout) op, _ = trace.WithTimeout(&op, timeout, path) done := make(chan struct{}) go func() { t := time.NewTicker(200 * time.Microsecond) defer t.Stop() for range t.C { if _, err := os.Stat(path); err == nil { close(done) break } // We've timed out. if op.Err() != nil { break } } }() log.Debugf("Waiting for attached disk to appear in /dev/disk/by-path, or timeout") select { case <-done: log.Infof("Attached disk present at %s", path) case <-op.Done(): if op.Err() != nil { return errors.Errorf("timeout waiting for layer to present as %s", path) } } return nil }