### 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
'''
    Return the first pre-existing directory and a list of the new directories that will be created.
    '''
    head, tail = os.path.split(dirname)
    b_head = to_bytes(head, errors='surrogate_or_strict')
    if head == '':
        return ('.', [tail])
    if not os.path.exists(b_head):
        if head == '/':
            raise AnsibleModuleError(results={'msg': "The '/' directory doesn't exist on this machine."})
        (pre_existing_dir, new_directory_list) = split_pre_existing_dir(head)
    else:
        return (head, [tail])
    new_directory_list.append(tail)
    return (pre_existing_dir, new_directory_list)
def adjust_recursive_directory_permissions(pre_existing_dir, new_directory_list, module, directory_args, changed):
    '''
    Walk the new directories list and make sure that permissions are as we would expect
    '''
    if new_directory_list:
        working_dir = os.path.join(pre_existing_dir, new_directory_list.pop(0))
        directory_args['path'] = working_dir
        changed = module.set_fs_attributes_if_different(directory_args, changed)
        changed = adjust_recursive_directory_permissions(working_dir, new_directory_list, module, directory_args, changed)
    return changed
def chown_recursive(path, module):