Re: [PATCH v3] cifs: Show reason why autodisabling serverino support
Steve French <[email protected]>
| Newsgroups | org.kernel.vger.linux-cifs,org.kernel.vger.linux-kernel |
|---|---|
| Message-ID | <CAH2r5msn6kfGt6bNcuxEjXvmTCpEu6V1MWWi1EeT9MnLLeKGCg@mail.gmail.com> |
merged into cifs-2.6.git for-next On Mon, Jul 6, 2026 at 1:31 PM Pali Rohár <[email protected]> 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 <[email protected]> > --- > 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