code: func newPlayground(src, dir, prefix string, mnt fs.MountUnmounter) (*playground, error) {
  	p := playground{
  		mnt: mnt,
  	}
  
  	var err error
  	p.tmpDir, err = ioutil.TempDir(dir, prefix+".")
  	if err != nil {
  		return nil, errwrap.Wrapf("creating temporary "+prefix+" failed", err)
  	}
  	// removed in Cleanup
  
  	err = p.mnt.Mount(p.tmpDir, p.tmpDir, "bind", syscall.MS_BIND, "")
  	if err != nil {
  		return nil, errwrap.Wrapf("bind mount of "+prefix+" failed", err)
  	}
  	// unmounted in Cleanup
  
  	err = mnt.Mount("", p.tmpDir, "none", syscall.MS_SLAVE, "")
  	if err != nil {
  		return nil, errwrap.Wrapf("slave mount of "+prefix+" failed", err)
  	}
  
  	p.playground = filepath.Join(p.tmpDir, "playground")
  	if err := stage1init.EnsureTargetExists(src, p.playground); err != nil {
  		return nil, errwrap.Wrapf("creating rkt.propagate.stage2/mount failed", err)
  	}
  	// removed in Cleanup
  
  	return &p, nil
  }
docs: // newPlayground creates a playground directory (or file) in the given directory dir with a name beginning with prefix.
  // If dir is empty string, newPlayground uses the default directory for temporary files (see os.TempDir).
  // The playground type (file or directory) is equal to the type of the type of src.
  // The playground can be moved to a new location using syscall.MS_MOVE.
  // Use the Playground() method to get the full playground path.