code: func (d *Driver) Put(id string) error {
  	d.locker.Lock(id)
  	defer d.locker.Unlock(id)
  	// If id has a root, just return
  	if _, err := os.Stat(path.Join(d.dir(id), "root")); err == nil {
  		return nil
  	}
  	mountpoint := path.Join(d.dir(id), "merged")
  	logger := logrus.WithField("storage-driver", "overlay")
  	if count := d.ctr.Decrement(mountpoint); count > 0 {
  		return nil
  	}
  	if err := unix.Unmount(mountpoint, unix.MNT_DETACH); err != nil {
  		logger.Debugf("Failed to unmount %s overlay: %v", id, err)
  	}
  
  	// Remove the mountpoint here. Removing the mountpoint (in newer kernels)
  	// will cause all other instances of this mount in other mount namespaces
  	// to be unmounted. This is necessary to avoid cases where an overlay mount
  	// that is present in another namespace will cause subsequent mounts
  	// operations to fail with ebusy.  We ignore any errors here because this may
  	// fail on older kernels which don't have
  	// torvalds/linux@8ed936b5671bfb33d89bc60bdcc7cf0470ba52fe applied.
  	if err := unix.Rmdir(mountpoint); err != nil {
  		logger.Debugf("Failed to remove %s overlay: %v", id, err)
  	}
  	return nil
  }
docs: // Put unmounts the mount path created for the give id.
  // It also removes the 'merged' directory to force the kernel to unmount the
  // overlay mount in other namespaces.