Re: [PATCH v3] cifs: Show reason why autodisabling serverino support
From: Steve French
Date: Thu Jul 09 2026 - 09:05:32 EST
merged into cifs-2.6.git for-next
On Mon, Jul 6, 2026 at 1:31 PM Pali Rohár <pali@xxxxxxxxxx> wrote:
>
> Extend cifs_autodisable_serverino() function to print also text message why
> the function was called.
>
> The text message is printed just once for mount then autodisabling
> serverino support. Once the serverino support is disabled for mount it will
> not be re-enabled. So those text messages do not cause flooding logs.
>
> This change allows to debug issues why cifs.ko decide to turn off server
> inode number support and hence disable support for detection of hardlinks.
>
> Signed-off-by: Pali Rohár <pali@xxxxxxxxxx>
> ---
> fs/smb/client/cifsproto.h | 2 +-
> fs/smb/client/connect.c | 2 +-
> fs/smb/client/dfs_cache.c | 2 +-
> fs/smb/client/inode.c | 7 ++++---
> fs/smb/client/misc.c | 6 +++++-
> fs/smb/client/readdir.c | 4 ++--
> 6 files changed, 14 insertions(+), 9 deletions(-)
>
> diff --git a/fs/smb/client/cifsproto.h b/fs/smb/client/cifsproto.h
> index 1ed97957038f..1202934d7b94 100644
> --- a/fs/smb/client/cifsproto.h
> +++ b/fs/smb/client/cifsproto.h
> @@ -317,7 +317,7 @@ int generate_smb311signingkey(struct cifs_ses *ses,
>
> #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
> #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
> -void cifs_autodisable_serverino(struct cifs_sb_info *cifs_sb);
> +void cifs_autodisable_serverino(struct cifs_sb_info *cifs_sb, const char *reason, int rc);
> bool couldbe_mf_symlink(const struct cifs_fattr *fattr);
> int check_mf_symlink(unsigned int xid, struct cifs_tcon *tcon,
> struct cifs_sb_info *cifs_sb, struct cifs_fattr *fattr,
> diff --git a/fs/smb/client/connect.c b/fs/smb/client/connect.c
> index 85aec302c89e..522c2abd930c 100644
> --- a/fs/smb/client/connect.c
> +++ b/fs/smb/client/connect.c
> @@ -3875,7 +3875,7 @@ int cifs_mount(struct cifs_sb_info *cifs_sb, struct smb3_fs_context *ctx)
> * After reconnecting to a different server, unique ids won't match anymore, so we disable
> * serverino. This prevents dentry revalidation to think the dentry are stale (ESTALE).
> */
> - cifs_autodisable_serverino(cifs_sb);
> + cifs_autodisable_serverino(cifs_sb, "DFS failover may potentially connect to a different server, inode numbers won't match anymore", 0);
> /*
> * Force the use of prefix path to support failover on DFS paths that resolve to targets
> * that have different prefix paths.
> diff --git a/fs/smb/client/dfs_cache.c b/fs/smb/client/dfs_cache.c
> index 83f8cf2f8d2b..42eee0de8895 100644
> --- a/fs/smb/client/dfs_cache.c
> +++ b/fs/smb/client/dfs_cache.c
> @@ -1328,7 +1328,7 @@ int dfs_cache_remount_fs(struct cifs_sb_info *cifs_sb)
> * After reconnecting to a different server, unique ids won't match anymore, so we disable
> * serverino. This prevents dentry revalidation to think the dentry are stale (ESTALE).
> */
> - cifs_autodisable_serverino(cifs_sb);
> + cifs_autodisable_serverino(cifs_sb, "DFS failover may potentially connect to a different server, inode numbers won't match anymore", 0);
> /*
> * Force the use of prefix path to support failover on DFS paths that resolve to targets
> * that have different prefix paths.
> diff --git a/fs/smb/client/inode.c b/fs/smb/client/inode.c
> index 002a2ec85db5..945a34f3d830 100644
> --- a/fs/smb/client/inode.c
> +++ b/fs/smb/client/inode.c
> @@ -1090,7 +1090,7 @@ static void cifs_set_fattr_ino(int xid, struct cifs_tcon *tcon, struct super_blo
> fattr->cf_uniqueid = CIFS_I(*inode)->uniqueid;
> else {
> fattr->cf_uniqueid = iunique(sb, ROOT_I);
> - cifs_autodisable_serverino(cifs_sb);
> + cifs_autodisable_serverino(cifs_sb, "Cannot retrieve inode number via get_srv_inum", rc);
> }
> return;
> }
> @@ -1546,7 +1546,7 @@ cifs_iget(struct super_block *sb, struct cifs_fattr *fattr)
> fattr->cf_flags &= ~CIFS_FATTR_INO_COLLISION;
>
> if (inode_has_hashed_dentries(inode)) {
> - cifs_autodisable_serverino(CIFS_SB(sb));
> + cifs_autodisable_serverino(CIFS_SB(sb), "Inode number collision detected", 0);
> iput(inode);
> fattr->cf_uniqueid = iunique(sb, ROOT_I);
> goto retry_iget5_locked;
> @@ -1612,8 +1612,9 @@ struct inode *cifs_root_iget(struct super_block *sb)
> iget_root:
> if (!rc) {
> if (fattr.cf_flags & CIFS_FATTR_JUNCTION) {
> + cifs_dbg(VFS, "Removing junction mark and disabling 'serverino' to prevent inode collisions\n");
> fattr.cf_flags &= ~CIFS_FATTR_JUNCTION;
> - cifs_autodisable_serverino(cifs_sb);
> + cifs_autodisable_serverino(cifs_sb, "Cannot retrieve attributes for junction point", rc);
> }
> inode = cifs_iget(sb, &fattr);
> }
> diff --git a/fs/smb/client/misc.c b/fs/smb/client/misc.c
> index 0c54b9b79a2c..f47874734248 100644
> --- a/fs/smb/client/misc.c
> +++ b/fs/smb/client/misc.c
> @@ -278,7 +278,7 @@ dump_smb(void *buf, int smb_buf_length)
> }
>
> void
> -cifs_autodisable_serverino(struct cifs_sb_info *cifs_sb)
> +cifs_autodisable_serverino(struct cifs_sb_info *cifs_sb, const char *reason, int rc)
> {
> unsigned int sbflags = cifs_sb_flags(cifs_sb);
>
> @@ -290,6 +290,10 @@ cifs_autodisable_serverino(struct cifs_sb_info *cifs_sb)
>
> atomic_andnot(CIFS_MOUNT_SERVER_INUM, &cifs_sb->mnt_cifs_flags);
> cifs_sb->mnt_cifs_serverino_autodisabled = true;
> + if (rc)
> + cifs_dbg(VFS, "%s: %d\n", reason, rc);
> + else
> + cifs_dbg(VFS, "%s\n", reason);
> cifs_dbg(VFS, "Autodisabling the use of server inode numbers on %s\n",
> tcon ? tcon->tree_name : "new server");
> cifs_dbg(VFS, "The server doesn't seem to support them properly or the files might be on different servers (DFS)\n");
> diff --git a/fs/smb/client/readdir.c b/fs/smb/client/readdir.c
> index a50c86bbe60f..ee5996e6d7d8 100644
> --- a/fs/smb/client/readdir.c
> +++ b/fs/smb/client/readdir.c
> @@ -415,7 +415,7 @@ _initiate_cifs_search(const unsigned int xid, struct file *file,
> if (rc == 0) {
> cifsFile->invalidHandle = false;
> } else if (rc == -EOPNOTSUPP && (sbflags & CIFS_MOUNT_SERVER_INUM)) {
> - cifs_autodisable_serverino(cifs_sb);
> + cifs_autodisable_serverino(cifs_sb, "Cannot retrieve inode number via query_dir_first", rc);
> goto ffirst_retry;
> }
> error_exit:
> @@ -1029,7 +1029,7 @@ static int cifs_filldir(char *find_entry, struct file *file,
> fattr.cf_uniqueid = de.ino;
> } else {
> fattr.cf_uniqueid = iunique(sb, ROOT_I);
> - cifs_autodisable_serverino(cifs_sb);
> + cifs_autodisable_serverino(cifs_sb, "Cannot retrieve inode number from readdir", 0);
> }
>
> if ((sbflags & CIFS_MOUNT_MF_SYMLINKS) && couldbe_mf_symlink(&fattr))
> --
> 2.20.1
>
>
--
Thanks,
Steve