From 969647a3d9922908d96387289fe72ba4b8ecdf5f Mon Sep 17 00:00:00 2001 From: Ralph Boehme Date: Thu, 29 Mar 2018 20:06:47 +0200 Subject: [PATCH] s3:smbd: don't use the directory cache for SMB2/3 Bug: https://bugzilla.samba.org/show_bug.cgi?id=13363 Signed-off-by: Ralph Boehme Reviewed-by: Jeremy Allison Autobuild-User(master): Jeremy Allison Autobuild-Date(master): Fri Mar 30 03:51:48 CEST 2018 on sn-devel-144 (cherry picked from commit 66052fdccd28922cf1caa2bc750e39051a6414cf) --- .../misc/directorynamecachesize.xml | 5 +-- source3/smbd/dir.c | 32 +++++++++++++++++-- 2 files changed, 32 insertions(+), 5 deletions(-) diff --git a/docs-xml/smbdotconf/misc/directorynamecachesize.xml b/docs-xml/smbdotconf/misc/directorynamecachesize.xml index 7a89bf2ed64..22999a6964e 100644 --- a/docs-xml/smbdotconf/misc/directorynamecachesize.xml +++ b/docs-xml/smbdotconf/misc/directorynamecachesize.xml @@ -4,8 +4,9 @@ xmlns:samba="http://www.samba.org/samba/DTD/samba-doc"> - This parameter specifies the size of the directory name cache. - It will be needed to turn this off for *BSD systems. + This parameter specifies the size of the directory name cache for SMB1 + connections. It is not used for SMB2. It will be needed to turn this off + for *BSD systems. diff --git a/source3/smbd/dir.c b/source3/smbd/dir.c index 6621b4ee387..801daa5caa7 100644 --- a/source3/smbd/dir.c +++ b/source3/smbd/dir.c @@ -1219,7 +1219,15 @@ bool smbd_dirptr_get_entry(TALLOC_CTX *ctx, mask, smb_fname_str_dbg(&smb_fname), dname, fname)); - DirCacheAdd(dirptr->dir_hnd, dname, cur_offset); + if (!conn->sconn->using_smb2) { + /* + * The dircache is only needed for SMB1 because SMB1 + * uses a name for the resume wheras SMB2 always + * continues from the next position (unless it's told to + * restart or close-and-reopen the listing). + */ + DirCacheAdd(dirptr->dir_hnd, dname, cur_offset); + } TALLOC_FREE(dname); @@ -1646,7 +1654,16 @@ static struct smb_Dir *OpenDir_internal(TALLOC_CTX *mem_ctx, } dirp->conn = conn; - dirp->name_cache_size = lp_directory_name_cache_size(SNUM(conn)); + + if (!conn->sconn->using_smb2) { + /* + * The dircache is only needed for SMB1 because SMB1 uses a name + * for the resume wheras SMB2 always continues from the next + * position (unless it's told to restart or close-and-reopen the + * listing). + */ + dirp->name_cache_size = lp_directory_name_cache_size(SNUM(conn)); + } if (sconn && !sconn->using_smb2) { sconn->searches.dirhandles_open++; @@ -1768,7 +1785,16 @@ static struct smb_Dir *OpenDir_fsp(TALLOC_CTX *mem_ctx, connection_struct *conn, } dirp->conn = conn; - dirp->name_cache_size = lp_directory_name_cache_size(SNUM(conn)); + + if (!conn->sconn->using_smb2) { + /* + * The dircache is only needed for SMB1 because SMB1 uses a name + * for the resume wheras SMB2 always continues from the next + * position (unless it's told to restart or close-and-reopen the + * listing). + */ + dirp->name_cache_size = lp_directory_name_cache_size(SNUM(conn)); + } dirp->dir_smb_fname = cp_smb_filename(dirp, fsp->fsp_name); if (!dirp->dir_smb_fname) { -- 2.17.0.rc1.321.gba9d0f2565-goog