code: func (c *csiMountMgr) applyFSGroup(fsType string, fsGroup *int64) error {
  	if fsGroup != nil {
  		if fsType == "" {
  			klog.V(4).Info(log("mounter.SetupAt WARNING: skipping fsGroup, fsType not provided"))
  			return nil
  		}
  
  		accessModes := c.spec.PersistentVolume.Spec.AccessModes
  		if c.spec.PersistentVolume.Spec.AccessModes == nil {
  			klog.V(4).Info(log("mounter.SetupAt WARNING: skipping fsGroup, access modes not provided"))
  			return nil
  		}
  		if !hasReadWriteOnce(accessModes) {
  			klog.V(4).Info(log("mounter.SetupAt WARNING: skipping fsGroup, only support ReadWriteOnce access mode"))
  			return nil
  		}
  
  		if c.readOnly {
  			klog.V(4).Info(log("mounter.SetupAt WARNING: skipping fsGroup, volume is readOnly"))
  			return nil
  		}
  
  		err := volume.SetVolumeOwnership(c, fsGroup)
  		if err != nil {
  			return err
  		}
  
  		klog.V(4).Info(log("mounter.SetupAt fsGroup [%d] applied successfully to %s", *fsGroup, c.volumeID))
  	}
  
  	return nil
  }
docs: // applyFSGroup applies the volume ownership it derives its logic
  // from https://github.com/kubernetes/kubernetes/issues/66323
  // 1) if fstype is "", then skip fsgroup (could be indication of non-block filesystem)
  // 2) if fstype is provided and pv.AccessMode == ReadWriteOnly and !c.spec.ReadOnly then apply fsgroup