### Summary

When using the file module to iterate over a list of files, some of which could be hardlinks, the file module fails with "src is required for creating new hardlinks"  However, I am simply trying to modify the permissions of the files, not create new ones. 

For example, I gather the list of files like so (keep in mind some of these are regular files, some of them are hardlinks):

```
  - name: Finding all *.crt files in the pki directory
    find:
      paths: "{{ item }}"
      patterns: '*.crt'
    loop: "{{ crt_directories }}"
    register: crt_find
```

So at this point, `crt_find` is a list of files and hard links.

Then, I iterate over `crt_find` to set the permissions on all of the files and hardlinks using the file module:

```
  - name: Setting certificate file Permissions
    file:
      path: "{{ item.1.path }}"
      mode: 0644
    loop: "{{ crt_find.results | subelements('files') }}"
```

This works perfectly fine for regular files. When it gets to a hardlink, it fails with "src is required for creating new hardlinks."  The problem is, I'm not trying to create a new hardlink. I'm simply trying to modify the permissions. 

Interestingly, this goes away if I explicitly define `state: file` as a parameter on the file module task:

```
  - name: Setting certificate file Permissions
    file:
      path: "{{ item.1.path }}"
      state: file  # <---------------This fixes the problem
      mode: 0644
    loop: "{{ crt_find.results | subelements('files') }}"
```

While I've clearly found a solution to my problem, it definitely seems like a bug with the file module, as `state: file` is the default if omitted.

### Issue Type

Bug Report

### Component Name

ansible.builtin.file 

### Ansible Version

```console
$ ansible --version
ansible [core 2.11.5]
  config file = /Users/me/.ansible.cfg
  configured module search path = ['/Users/me/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /Users/me/venv/lib/python3.8/site-packages/ansible
  ansible collection location = /Users/me/.ansible/collections:/usr/share/ansible/collections
  executable location = /Users/me/venv/bin/ansible
  python version = 3.8.2 (default, Jun  8 2021, 11:59:35) [Clang 12.0.5 (clang-1205.0.22.11)]
  jinja version = 3.0.1
  libyaml = False
```


### Configuration

```console
$ ansible-config dump --only-changed
DEFAULT_ROLES_PATH(/Users/me/.ansible.cfg) = ['/Users/me/repos']
DEFAULT_STDOUT_CALLBACK(env: ANSIBLE_STDOUT_CALLBACK) = yaml
HOST_KEY_CHECKING(/Users/me/.ansible.cfg) = False
```


### OS / Environment

Control machine = MacOS
Target machine = Ubuntu 20

### Steps to Reproduce

Stated in the Summary

### Expected Results

Stated in the Summary

### Actual Results

```console
Stated in the Summary
```


### Code of Conduct

- [X] I agree to follow the Ansible Code of Conduct
description:
    - If C(absent), directories will be recursively deleted, and files or symlinks will
      be unlinked. In the case of a directory, if C(diff) is declared, you will see the files and folders deleted listed
      under C(path_contents). Note that C(absent) will not cause C(file) to fail if the C(path) does
      not exist as the state did not change.
    - If C(directory), all intermediate subdirectories will be created if they
      do not exist. Since Ansible 1.7 they will be created with the supplied permissions.
    - If C(file), with no other options, returns the current state of C(path).
    - If C(file), even with other options (such as C(mode)), the file will be modified if it exists but will NOT be created if it does not exist.
      Set to C(touch) or use the M(ansible.builtin.copy) or M(ansible.builtin.template) module if you want to create the file if it does not exist.
    - If C(hard), the hard link will be created or changed.
    - If C(link), the symbolic link will be created or changed.
    - If C(touch) (new in 1.4), an empty file will be created if the file does not
      exist, while an existing file or directory will receive updated file access and
      modification times (similar to the way C(touch) works from the command line).
    type: str
    default: file
    choices: [ absent, directory, file, hard, link, touch ]
  src:
    description:
    - Path of the file to link to.
    - This applies only to C(state=link) and C(state=hard).
    - For C(state=link), this will also accept a non-existing path.
    - Relative paths are relative to the file being created (C(path)) which is how
      the Unix command C(ln -s SRC DEST) treats relative paths.
    type: path
  recurse:
    description:
    - Recursively set the specified file attributes on directory contents.
    - This applies only when C(state) is set to C(directory).