package host import "errors" // generationCensusRefusal is a refusal of root's kernel generation census // (productionGenerationKernelCensus). Recovery with no journal open defers // a settlement this refused (settleWithoutJournal), and only this: an image // that does not verify, malformed state and a failed durable write keep // their own errors and still fail. type generationCensusRefusal struct{ err error } func (r *generationCensusRefusal) Error() string { return "generation census: " + r.err.Error() } func (r *generationCensusRefusal) Unwrap() error { return r.err } // onlyCensusRefusal reports whether every error err carries is a // generationCensusRefusal: a wrapped refusal is, a join with any other // error (a durable write that failed beside it) is not. func onlyCensusRefusal(err error) bool { switch e := err.(type) { case nil: return false case *generationCensusRefusal: return true case interface{ Unwrap() []error }: found := false for _, inner := range e.Unwrap() { if inner == nil { continue } if !onlyCensusRefusal(inner) { return false } found = true } return found } if inner := errors.Unwrap(err); inner != nil { return onlyCensusRefusal(inner) } return false }