{"record":{"id":"929bee6c11704be3","repo":"juicedata/juicefs","slug":"not-a-juicefs-mount-point","errorCode":null,"errorMessage":"not a JuiceFS mount point","messagePattern":"not a JuiceFS mount point","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"cmd/umount.go","lineNumber":107,"sourceCode":"\t\t}\n\tdefault:\n\t\treturn fmt.Errorf(\"OS %s is not supported\", runtime.GOOS)\n\t}\n\tout, err := cmd.CombinedOutput()\n\tif err != nil && len(out) != 0 {\n\t\terr = errors.New(string(out))\n\t}\n\treturn err\n}\n\nfunc umount(ctx *cli.Context) error {\n\tsetup(ctx, 1)\n\tmp := ctx.Args().Get(0)\n\tif ctx.Bool(\"flush\") {\n\t\traw, err := readConfig(mp)\n\t\tif err != nil {\n\t\t\tif os.IsNotExist(err) {\n\t\t\t\treturn fmt.Errorf(\"not a JuiceFS mount point\")\n\t\t\t}\n\t\t\treturn errors.Wrap(err, \"failed to read config\")\n\t\t}\n\n\t\tvar conf vfs.Config\n\t\tif err = json.Unmarshal(raw, &conf); err != nil {\n\t\t\treturn errors.Wrap(err, \"failed to parse config\")\n\t\t}\n\t\tif conf.Chunk.Writeback {\n\t\t\tstagingDir := path.Join(conf.Chunk.CacheDir, \"rawstaging\")\n\t\t\tif err := waitWritebackComplete(stagingDir); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tdefer func() {\n\t\t\t\tsize, _ := fileSizeInDir(stagingDir)\n\t\t\t\tclearLastLine()\n\t\t\t\tif size == 0 {\n\t\t\t\t\tfmt.Println(\"\\rAll staging chunks are flushed\")","sourceCodeStart":89,"sourceCodeEnd":125,"githubUrl":"https://github.com/juicedata/juicefs/blob/c9a67b23e8e08ec23ec331aa6f1675e2319e921c/cmd/umount.go#L89-L125","documentation":"umount with --flush first reads the mount's config file via readConfig(mp) to locate the control file. If readConfig fails with an fs.ErrNotExist, the path is not a JuiceFS mount point (no .jfsconfig / control metadata exists there), and this error is returned. It distinguishes 'not our mount' from other config-read failures, which are wrapped separately.","triggerScenarios":"`juicefs umount <path> --flush` where <path> is not a JuiceFS mount point, is a plain directory, or is a mount of another filesystem type.","commonSituations":"Typo in the mount point path; trying to flush-unmount an NFS/tmpfs mount; mount already crashed so config file was cleaned up; using the volume name instead of the mount path.","solutions":["Verify the path is an active JuiceFS mount (`mount | grep juicefs` or `cat <mp>/.control` presence).","Check the path spelling — pass the exact mount point directory.","If you don't need cache flushing, run `juicefs umount <mp>` without --flush.","If the mount crashed but caches should be flushed, remount first or clean up manually."],"exampleFix":"// before\njuicefs umount /mnt/nfs-data --flush\n// after\njuicefs umount /mnt/jfs --flush","handlingStrategy":"validation","validationCode":"if _, err := os.Stat(filepath.Join(mp, \".stats\")); err != nil {\n    return fmt.Errorf(\"%s is not a JuiceFS mount point\", mp)\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Verify the target is a live JuiceFS mount with `mount | grep juicefs` before umount --flush","Pass the exact mount point directory, not a subpath, volume name, or other filesystem's mount","Drop --flush when you only need to detach and don't care about cache flush"],"tags":["umount","mountpoint","cli"],"backgroundTag":"resource-not-found","analyzedSha":"c9a67b23e8e08ec23ec331aa6f1675e2319e921c","analyzedAt":"2026-09-06T17:55:48.476Z","contentChangedAt":"2026-09-06T17:55:48.476Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}