{"record":{"id":"5b67de20c838404c","repo":"dagger/dagger","slug":"cannot-get-layer-information-from-mount-option-ty","errorCode":null,"errorMessage":"cannot get layer information from mount option (type = %q)","messagePattern":"cannot get layer information from mount option \\(type = %q\\)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"engine/snapshots/fsdiff/overlay_linux.go","lineNumber":44,"sourceCode":"\tif len(lower) == 0 && len(upper) == 1 {\n\t\tupperM := upper[0]\n\t\tif upperM.Type != \"bind\" {\n\t\t\treturn \"\", errors.Errorf(\"bottommost upper must be bind mount but %q\", upperM.Type)\n\t\t}\n\t\tupperdir = upperM.Source\n\t} else if len(lower) == 1 && len(upper) == 1 {\n\t\tvar lowerlayers []string\n\t\tlowerM := lower[0]\n\t\tif lowerM.Type == \"bind\" {\n\t\t\tlowerlayers = []string{lowerM.Source}\n\t\t} else if IsOverlayMountType(lowerM) {\n\t\t\tvar err error\n\t\t\tlowerlayers, err = GetOverlayLayers(lowerM)\n\t\t\tif err != nil {\n\t\t\t\treturn \"\", err\n\t\t\t}\n\t\t} else {\n\t\t\treturn \"\", errors.Errorf(\"cannot get layer information from mount option (type = %q)\", lowerM.Type)\n\t\t}\n\n\t\tupperM := upper[0]\n\t\tif !IsOverlayMountType(upperM) {\n\t\t\treturn \"\", errors.Errorf(\"upper snapshot isn't overlay mounted (type = %q)\", upperM.Type)\n\t\t}\n\t\tupperlayers, err := GetOverlayLayers(upperM)\n\t\tif err != nil {\n\t\t\treturn \"\", err\n\t\t}\n\n\t\tif len(upperlayers) != len(lowerlayers)+1 {\n\t\t\treturn \"\", errors.Errorf(\"cannot determine diff of more than one upper directories\")\n\t\t}\n\t\tfor i := 0; i < len(lowerlayers); i++ {\n\t\t\tif upperlayers[i] != lowerlayers[i] {\n\t\t\t\treturn \"\", errors.Errorf(\"layer %d must be common between upper and lower snapshots\", i)\n\t\t\t}","sourceCodeStart":26,"sourceCodeEnd":62,"githubUrl":"https://github.com/dagger/dagger/blob/82ba2681dbe30d3547a1dc50ea495900ab5b6047/engine/snapshots/fsdiff/overlay_linux.go#L26-L62","documentation":"In the one-lower/one-upper case, GetUpperdir parses lowerdir information out of the lower mount's options via GetOverlayLayers. If the lower mount is neither a bind mount nor an overlay mount type, the engine cannot extract layer info and returns this error naming the offending type. It means the lower snapshot's mounts are not in a form the overlay differ understands.","triggerScenarios":"differFor -> GetUpperdir with len(lower)==1 and lower[0].Type not in (\"bind\", overlay types recognized by IsOverlayMountType/GetOverlayLayers) — e.g. native, copy-on-write2, fuse-overlayfs, or a custom snapshotter's mount type.","commonSituations":"Differencing snapshots taken by a non-overlay snapshotter (native, btrfs, zfs) while the fsdiff overlay differ expects overlay/bind semantics; plugin snapshotters emitting novel mount types; stale snapshots created before a snapshotter switch.","solutions":["Verify both snapshots belong to the overlay-based snapshotter; re-create snapshots with the overlay snapshotter if they came from native/btrfs/zfs.","Extend or check GetOverlayLayers support for the mount type you actually have, or route non-overlay snapshots to a different differ.","Dump lower[0] (Type + Options) and confirm it is a standard overlay mount with lowerdir= options.","Align engine/snapshotter versions so mount-type naming matches what GetUpperdir recognizes."],"exampleFix":"// before: assumes overlay-compatible lower\nmtrs, err := sn.Mounts(ctx, chainID)\nupper, err := fsdiff.GetUpperdir(mtrs[:1], mtrs[1:])\n// after\nif !fsdiff.IsOverlayMountType(mtrs[0]) && mtrs[0].Type != \"bind\" {\n    return fmt.Errorf(\"fsdiff requires overlay or bind lower mount, got %q\", mtrs[0].Type)\n}\nupper, err = fsdiff.GetUpperdir(mtrs[:1], mtrs[1:])","handlingStrategy":"validation","validationCode":"lowerM := lower[0]\nif lowerM.Type != \"bind\" && !fsdiff.IsOverlayMountType(lowerM) {\n    return fmt.Errorf(\"fsdiff needs bind/overlay lower mount, got %q\", lowerM.Type)\n}","typeGuard":"func lowerSupported(m mount.Mount) bool {\n    return m.Type == \"bind\" || fsdiff.IsOverlayMountType(m)\n}","tryCatchPattern":"upper, err := fsdiff.GetUpperdir(lower, upperM)\nif err != nil && strings.Contains(err.Error(), \"cannot get layer information from mount option\") {\n    return fmt.Errorf(\"lower snapshot from incompatible snapshotter (type %s); recreate with overlay snapshotter\", lower[0].Type)\n}","preventionTips":["Ensure both snapshots come from the overlay-based snapshotter","Reject or re-route native/btrfs/zfs snapshots to a non-overlay differ","Verify overlay lowerdir= options exist on overlay-typed mounts","Re-create stale snapshots after changing snapshotters"],"tags":["overlayfs","mount","linux","snapshotter"],"backgroundTag":"unexpected-mount-type","analyzedSha":"82ba2681dbe30d3547a1dc50ea495900ab5b6047","analyzedAt":"2026-09-05T07:21:37.930Z","contentChangedAt":"2026-09-05T07:21:37.930Z","schemaVersion":2},"datasetVersion":"2026-09-12T12:17:11.808Z"}