### Summary

I use the `ansible.builtin.copy` module. Unfortunately, there is a combination of parameters where check mode prints `ok`, although when running in run mode, there is an actual change.

Unexpected malfunction is reproducible tested on `2.9.27`, `2.12.6` and `2.13.0`

### Issue Type

Bug Report

### Component Name

copy

### Ansible Version

```console
$ ansible --version
ansible 2.9.27
  config file = None
  configured module search path = ['/home/phoffmann/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /home/phoffmann/.local/share/virtualenvs/ansible-2.9-TCZdLugh/lib/python3.8/site-packages/ansible
  executable location = /home/phoffmann/.local/share/virtualenvs/ansible-2.9-TCZdLugh/bin/ansible
  python version = 3.8.12 (default, Apr  8 2022, 11:41:59) [GCC 9.4.0]

$ ansible --version
ansible [core 2.12.6]
  config file = None
  configured module search path = ['/home/phoffmann/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /home/phoffmann/.pyenv/versions/3.8.12/lib/python3.8/site-packages/ansible
  ansible collection location = /home/phoffmann/.ansible/collections:/usr/share/ansible/collections
  executable location = /home/phoffmann/.pyenv/versions/3.8.12/bin/ansible
  python version = 3.8.12 (default, Apr  8 2022, 11:41:59) [GCC 9.4.0]
  jinja version = 3.1.2
  libyaml = True


$ ansible --version
ansible [core 2.13.0]
  config file = None
  configured module search path = ['/home/phoffmann/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /home/phoffmann/.local/share/virtualenvs/ansible-2.13-v8S06Uvz/lib/python3.8/site-packages/ansible
  ansible collection location = /home/phoffmann/.ansible/collections:/usr/share/ansible/collections
  executable location = /home/phoffmann/.local/share/virtualenvs/ansible-2.13-v8S06Uvz/bin/ansible
  python version = 3.8.12 (default, Apr  8 2022, 11:41:59) [GCC 9.4.0]
  jinja version = 3.1.2
  libyaml = True
```


### Configuration

```console
$ ansible-config dump --only-changed -t all
```


### OS / Environment

Ubuntu 20.04

### Steps to Reproduce

```yaml
---
- hosts: localhost
  tasks:
    - name: create file
      file:
        path: /tmp/ansible_foo
        state: touch
        owner: '{{ ansible_env.USER }}'
        group: '{{ ansible_env.USER }}'
        mode: 0600

    - name: Copy file with permissions
      copy:
        src: /tmp/ansible_foo
        dest: /tmp/ansible_foo2
        mode: 0644
        remote_src: yes

    - name: create file
      file:
        path: /tmp/ansible_foo2
        owner: '{{ ansible_env.USER }}'
        group: '{{ ansible_env.USER }}'
        mode: 0600
```


### Expected Results

I expect task `Copy file with permissions` to print `changed` 

Expected Result:
```
TASK [Copy file with permissions] ********************************************************************************************************************
--- before
+++ after
@@ -1,4 +1,4 @@
 {
-    "mode": "0600",
+    "mode": "0644",
     "path": "/tmp/ansible_foo2"
 }

```
It prints the expected `changed` as soon as `remote_src: yes` is removed.



### Actual Results

```console
TASK [Copy file with permissions] ********************************************************************************************************************
ok: [localhost]
```


### Code of Conduct

- [X] I agree to follow the Ansible Code of Conduct
changed = group_changed
    return changed
def copy_diff_files(src, dest, module):
    """Copy files that are different between `src` directory and `dest` directory."""
    changed = False
    owner = module.params['owner']
    group = module.params['group']
    local_follow = module.params['local_follow']
    diff_files = filecmp.dircmp(src, dest).diff_files
    if len(diff_files):
        changed = True
    if not module.check_mode:
        for item in diff_files:
            src_item_path = os.path.join(src, item)
            dest_item_path = os.path.join(dest, item)
            b_src_item_path = to_bytes(src_item_path, errors='surrogate_or_strict')
            b_dest_item_path = to_bytes(dest_item_path, errors='surrogate_or_strict')
            if os.path.islink(b_src_item_path) and local_follow is False:
                linkto = os.readlink(b_src_item_path)
                os.symlink(linkto, b_dest_item_path)
            else:
                shutil.copyfile(b_src_item_path, b_dest_item_path)
                shutil.copymode(b_src_item_path, b_dest_item_path)
            if owner is not None:
                module.set_owner_if_different(b_dest_item_path, owner, False)
            if group is not None:
                module.set_group_if_different(b_dest_item_path, group, False)
            changed = True
    return changed
def copy_left_only(src, dest, module):