{"record":{"id":"34c3add9f87fc541","repo":"kubernetes/kops","slug":"unknown-option-q","errorCode":null,"errorMessage":"unknown option: %q","messagePattern":"unknown option: %q","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"upup/pkg/fi/nodeup/nodetasks/bindmount.go","lineNumber":207,"sourceCode":"}\n\nfunc (e *BindMount) execute(t Executor) error {\n\tvar simpleOptions []string\n\tvar makeOptions []string\n\tvar remountOptions []string\n\tfor _, option := range e.Options {\n\t\tswitch option {\n\t\tcase \"ro\":\n\t\t\tsimpleOptions = append(simpleOptions, option)\n\n\t\tcase \"rshared\":\n\t\t\tmakeOptions = append(makeOptions, \"--make-rshared\")\n\n\t\tcase \"exec\", \"noexec\", \"suid\", \"nosuid\", \"dev\", \"nodev\":\n\t\t\tremountOptions = append(remountOptions, option)\n\n\t\tdefault:\n\t\t\treturn fmt.Errorf(\"unknown option: %q\", option)\n\t\t}\n\t}\n\n\t{\n\t\targs := []string{\"mount\"}\n\t\tif e.Recursive {\n\t\t\targs = append(args, \"--rbind\")\n\t\t} else {\n\t\t\targs = append(args, \"--bind\")\n\t\t}\n\t\tif len(simpleOptions) != 0 {\n\t\t\targs = append(args, \"-o\", strings.Join(simpleOptions, \",\"))\n\t\t}\n\t\targs = append(args, e.Source, e.Mountpoint)\n\n\t\tklog.Infof(\"running mount command %s\", args)\n\t\tif output, err := t.CombinedOutput(args); err != nil {\n\t\t\treturn fmt.Errorf(\"error doing mount %q: %v: %s\", strings.Join(args, \" \"), err, string(output))","sourceCodeStart":189,"sourceCodeEnd":225,"githubUrl":"https://github.com/kubernetes/kops/blob/4c8573c808a73d578c5eadc86d410646ea0b0d73/upup/pkg/fi/nodeup/nodetasks/bindmount.go#L189-L225","documentation":"BindMount.execute parses the mount Options list into categories (simple, remount, make-shared options). An option it does not recognize (not a mount flag like exec/noexec/suid/nosuid/dev/nodev, not ro/rw/shared etc.) causes this error. It is a programming/config validation error preventing the mount from being performed.","triggerScenarios":"A BindMount task is created with an option string outside the known switch cases — e.g. a typo like \"recatime\" instead of \"relatime\" or a kernel-specific flag the task does not handle.","commonSituations":"Custom model code or patched kOps adding new mount options; typo in instance-group/mount configuration; upstream adding kernel options not yet handled by bindmount.go.","solutions":["Remove or correct the unsupported option in the BindMount task's Options list","Only use options known to the switch: ro/rw, shared/rshared/private/rprivate/slave/rslave, exec/noexec, suid/nosuid, dev/nodev, --make-rshared","Update kOps to a version supporting the desired option, or extend bindmount.go's switch","Check which option value triggered it — the %q in the error names the exact culprit"],"exampleFix":"// before\ne.Options = []string{\"rw\", \"relatime\"}\n// returns \"unknown option: \\\"relatime\\\"\"\n// after\ne.Options = []string{\"rw\"} // only handled options","handlingStrategy":"validation","validationCode":"var known = map[string]bool{\n  \"ro\": true, \"rw\": true, \"shared\": true, \"rshared\": true, \"private\": true,\n  \"rprivate\": true, \"slave\": true, \"rslave\": true, \"exec\": true, \"noexec\": true,\n  \"suid\": true, \"nosuid\": true, \"dev\": true, \"nodev\": true,\n}\nfor _, o := range opts {\n  if !known[o] { return fmt.Errorf(\"unsupported bindmount option %q\", o) }\n}","typeGuard":null,"tryCatchPattern":"if err := nodeup.Run(ctx); err != nil {\n  if strings.Contains(err.Error(), \"unknown option\") {\n    // message names the offending option via %q — fix the task config\n  }\n}","preventionTips":["Restrict BindMount.Options to the options handled by bindmount.go's switch","Add unit tests asserting all configured mount options are in the known set","Keep kOps current so newly added kernel options are supported","Review custom model patches that inject extra mount options"],"tags":["mount","validation","nodeup"],"backgroundTag":"unsupported-mount-option","analyzedSha":"4c8573c808a73d578c5eadc86d410646ea0b0d73","analyzedAt":"2026-09-05T04:13:19.212Z","contentChangedAt":"2026-09-05T04:13:19.212Z","schemaVersion":2},"datasetVersion":"2026-09-12T07:17:12.445Z"}