[SCM] Samba Shared Repository - branch master updated

Jeremy Allison jra at samba.org
Fri Jan 15 22:02:01 UTC 2021


The branch, master has been updated
       via  b96c2cf0199 vfs: directory enumeration is now handle based
       via  2a11c8f7134 vfs: update status of SMB_VFS_MKDIRAT()
       via  33e1f3cafeb pysmbd: use real dirfsp for SMB_VFS_MKDIRAT()
       via  5feabb64de7 vfs: update status of SMB_VFS_MKNODAT()
       via  77fc6894c1c s3: smbd: Change smb_unix_mknod() to use a real directory fsp for SMB_VFS_MKNODAT().
       via  ebcde172de0 s3: smbd: Move creation of parent_fname out of lp_inherit_permissions() clause in smb_unix_mknod().
       via  30af87f46f9 s3: VFS: glusterfs: Fix vfs_gluster_mknodat() to cope with a real dirfsp.
       via  163a6802b64 s3: VFS: glusterfs: Fix missing END_PROFILE() in mkdirat() return.
       via  30d985759d1 s3: VFS: ceph: Fix cephwrap_mknodat() to cope with real directory fsps.
       via  8291c13f820 s3: VFS: ceph: Fix cephwrap_mkdirat() to cope with real directory fsps.
      from  e84f8bdff58 samba-tool: Optionally hide disabled/expired accounts in "group listmembers"

https://git.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit b96c2cf0199495b32dbdce5c833a0b64a9c4bd5d
Author: Ralph Boehme <slow at samba.org>
Date:   Fri Jan 15 16:37:56 2021 +0100

    vfs: directory enumeration is now handle based
    
    Remove obsolete description. Also remove SMB_VFS_STATX() as I don't see a need
    for that atm.
    
    Signed-off-by: Ralph Boehme <slow at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>
    
    Autobuild-User(master): Jeremy Allison <jra at samba.org>
    Autobuild-Date(master): Fri Jan 15 22:01:55 UTC 2021 on sn-devel-184

commit 2a11c8f7134bf78bc5b46cfb9ec602465ad66d00
Author: Ralph Boehme <slow at samba.org>
Date:   Fri Jan 15 10:13:36 2021 +0100

    vfs: update status of SMB_VFS_MKDIRAT()
    
    Signed-off-by: Ralph Boehme <slow at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit 33e1f3cafebcad1e5d79360bf1fd320fe9cc09bd
Author: Ralph Boehme <slow at samba.org>
Date:   Fri Jan 15 10:12:29 2021 +0100

    pysmbd: use real dirfsp for SMB_VFS_MKDIRAT()
    
    Signed-off-by: Ralph Boehme <slow at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit 5feabb64de76b87b60847270d03f344f09bae6eb
Author: Ralph Boehme <slow at samba.org>
Date:   Fri Jan 15 09:54:15 2021 +0100

    vfs: update status of SMB_VFS_MKNODAT()
    
    Signed-off-by: Ralph Boehme <slow at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit 77fc6894c1c507d242352d0fd67f141f7f5ce102
Author: Jeremy Allison <jra at samba.org>
Date:   Thu Jan 14 12:18:50 2021 -0800

    s3: smbd: Change smb_unix_mknod() to use a real directory fsp for SMB_VFS_MKNODAT().
    
    New VFS change.
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Ralph Boehme <slow at samba.org>

commit ebcde172de0886cb41741f9a5ad6ebaf36efeea6
Author: Jeremy Allison <jra at samba.org>
Date:   Thu Jan 14 11:50:39 2021 -0800

    s3: smbd: Move creation of parent_fname out of lp_inherit_permissions() clause in smb_unix_mknod().
    
    We will need this for the upcoming openat_pathref_fsp() use.
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Ralph Boehme <slow at samba.org>

commit 30af87f46f91b3175d51908b8c77e6ee178145f3
Author: Jeremy Allison <jra at samba.org>
Date:   Thu Jan 14 12:25:24 2021 -0800

    s3: VFS: glusterfs: Fix vfs_gluster_mknodat() to cope with a real dirfsp.
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Ralph Boehme <slow at samba.org>

commit 163a6802b64888b9f810a0e2d32694dc9f1c67a0
Author: Jeremy Allison <jra at samba.org>
Date:   Thu Jan 14 12:26:48 2021 -0800

    s3: VFS: glusterfs: Fix missing END_PROFILE() in mkdirat() return.
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Ralph Boehme <slow at samba.org>

commit 30d985759d1f6bce2dde0d665de66e65abd11c43
Author: Jeremy Allison <jra at samba.org>
Date:   Thu Jan 14 12:35:29 2021 -0800

    s3: VFS: ceph: Fix cephwrap_mknodat() to cope with real directory fsps.
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Ralph Boehme <slow at samba.org>

commit 8291c13f820f008a99df77394cb75fffd6add589
Author: Jeremy Allison <jra at samba.org>
Date:   Thu Jan 14 12:31:24 2021 -0800

    s3: VFS: ceph: Fix cephwrap_mkdirat() to cope with real directory fsps.
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Ralph Boehme <slow at samba.org>

-----------------------------------------------------------------------

Summary of changes:
 source3/modules/The_New_VFS.org | 12 ++----------
 source3/modules/The_New_VFS.txt | 10 ++--------
 source3/modules/vfs_ceph.c      | 32 +++++++++++++++++++++++++------
 source3/modules/vfs_glusterfs.c | 17 +++++++++++++++--
 source3/smbd/pysmbd.c           | 28 +++++++++++++++++++++++++--
 source3/smbd/trans2.c           | 42 ++++++++++++++++++++++++++++-------------
 6 files changed, 100 insertions(+), 41 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source3/modules/The_New_VFS.org b/source3/modules/The_New_VFS.org
index aff51c4375d..d034acaa661 100644
--- a/source3/modules/The_New_VFS.org
+++ b/source3/modules/The_New_VFS.org
@@ -258,8 +258,8 @@ whenever VFS access is done in a piecemeal fashion.
 | SMB_VFS_LOCK()                    | [[fsp][fsp]]      | -      |
 | SMB_VFS_LSEEK()                   | [[fsp][fsp]]      | -      |
 | SMB_VFS_LSTAT()                   | [[Path][Path]]     | Todo   |
-| SMB_VFS_MKDIRAT()                 | [[NsC][NsC]]      | Todo   |
-| SMB_VFS_MKNODAT()                 | [[NsC][NsC]]      | Todo   |
+| SMB_VFS_MKDIRAT()                 | [[NsC][NsC]]      | -      |
+| SMB_VFS_MKNODAT()                 | [[NsC][NsC]]      | -      |
 | SMB_VFS_NTIMES()                  | [[Path][Path]]     | Todo   |
 | SMB_VFS_OFFLOAD_READ_RECV()       | [[fsp][fsp]]      | -      |
 | SMB_VFS_OFFLOAD_READ_SEND()       | [[fsp][fsp]]      | -      |
@@ -310,7 +310,6 @@ whenever VFS access is done in a piecemeal fashion.
 |---------------------------------+----------+--------|
 | SMB_VFS_SYS_ACL_DELETE_DEF_FD() | [[xpathref][xpathref]] | Todo   |
 | SMB_VFS_READDIR_ATTRAT()        | [[Enum][Enum]]     | Todo   |
-| SMB_VFS_STATX()                 | [[Enum][Enum]]     | Todo   |
 | SMB_VFS_FUTIMENS()              | [[fsp][fsp]]      | Todo   |
 |---------------------------------+----------+--------|
 
@@ -437,16 +436,9 @@ whenever VFS access is done in a piecemeal fashion.
  functions with real dirfsps.
 
 *** AT VFS functions needed for directory enumeration <<Enum>>
-
  - SMB_VFS_GET_DOS_ATTRIBUTES_SEND()
  - SMB_VFS_GETXATTRAT_SEND()
  - SMB_VFS_READDIR_ATTRAT() (NEW)
- - SMB_VFS_STATX() (NEW)
-
- We can't open file-handles on all directory children for performance
- reasons. Therefor we need *AT based VFS functions for all metadata VFS queries
- done in the directory enumeration loop.
-
 *** Handle based VFS functions not allowed on O_PATH opened handles <<xpathref>>
  - SMB_VFS_FGETXATTR()
  - SMB_VFS_FLISTXATTR()
diff --git a/source3/modules/The_New_VFS.txt b/source3/modules/The_New_VFS.txt
index 345457c5a90..6d94cfdc6a2 100644
--- a/source3/modules/The_New_VFS.txt
+++ b/source3/modules/The_New_VFS.txt
@@ -326,8 +326,8 @@ Table of Contents
    SMB_VFS_LOCK()                     [fsp]       -
    SMB_VFS_LSEEK()                    [fsp]       -
    SMB_VFS_LSTAT()                    [Path]      Todo
-   SMB_VFS_MKDIRAT()                  [NsC]       Todo
-   SMB_VFS_MKNODAT()                  [NsC]       Todo
+   SMB_VFS_MKDIRAT()                  [NsC]       -
+   SMB_VFS_MKNODAT()                  [NsC]       -
    SMB_VFS_NTIMES()                   [Path]      Todo
    SMB_VFS_OFFLOAD_READ_RECV()        [fsp]       -
    SMB_VFS_OFFLOAD_READ_SEND()        [fsp]       -
@@ -400,7 +400,6 @@ Table of Contents
   ─────────────────────────────────────────────────────
    SMB_VFS_SYS_ACL_DELETE_DEF_FD()  [xpathref]  Todo
    SMB_VFS_READDIR_ATTRAT()         [Enum]      Todo
-   SMB_VFS_STATX()                  [Enum]      Todo
    SMB_VFS_FUTIMENS()               [fsp]       Todo
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
 
@@ -558,11 +557,6 @@ Table of Contents
   • SMB_VFS_GET_DOS_ATTRIBUTES_SEND()
   • SMB_VFS_GETXATTRAT_SEND()
   • SMB_VFS_READDIR_ATTRAT() (NEW)
-  • SMB_VFS_STATX() (NEW)
-
-  We can't open file-handles on all directory children for performance
-  reasons. Therefor we need *AT based VFS functions for all metadata VFS
-  queries done in the directory enumeration loop.
 
 
 2.2.7 Handle based VFS functions not allowed on O_PATH opened handles
diff --git a/source3/modules/vfs_ceph.c b/source3/modules/vfs_ceph.c
index 6bb770005e1..b2d9ead1db5 100644
--- a/source3/modules/vfs_ceph.c
+++ b/source3/modules/vfs_ceph.c
@@ -364,14 +364,23 @@ static int cephwrap_mkdirat(struct vfs_handle_struct *handle,
 			const struct smb_filename *smb_fname,
 			mode_t mode)
 {
+	struct smb_filename *full_fname = NULL;
 	int result;
 
+	full_fname = full_path_from_dirfsp_atname(talloc_tos(),
+						dirfsp,
+						smb_fname);
+	if (full_fname == NULL) {
+		return -1;
+	}
+
 	DBG_DEBUG("[CEPH] mkdir(%p, %s)\n",
-		  handle, smb_fname_str_dbg(smb_fname));
+		  handle, smb_fname_str_dbg(full_fname));
 
-	SMB_ASSERT(dirfsp == dirfsp->conn->cwd_fsp);
+	result = ceph_mkdir(handle->data, full_fname->base_name, mode);
+
+	TALLOC_FREE(full_fname);
 
-	result = ceph_mkdir(handle->data, smb_fname->base_name, mode);
 	return WRAP_RETURN(result);
 }
 
@@ -1102,11 +1111,22 @@ static int cephwrap_mknodat(struct vfs_handle_struct *handle,
 		mode_t mode,
 		SMB_DEV_T dev)
 {
+	struct smb_filename *full_fname = NULL;
 	int result = -1;
-	DBG_DEBUG("[CEPH] mknodat(%p, %s)\n", handle, smb_fname->base_name);
-	SMB_ASSERT(dirfsp == dirfsp->conn->cwd_fsp);
-	result = ceph_mknod(handle->data, smb_fname->base_name, mode, dev);
+
+	full_fname = full_path_from_dirfsp_atname(talloc_tos(),
+						dirfsp,
+						smb_fname);
+	if (full_fname == NULL) {
+		return -1;
+	}
+
+	DBG_DEBUG("[CEPH] mknodat(%p, %s)\n", handle, full_fname->base_name);
+	result = ceph_mknod(handle->data, full_fname->base_name, mode, dev);
 	DBG_DEBUG("[CEPH] mknodat(...) = %d\n", result);
+
+	TALLOC_FREE(full_fname);
+
 	WRAP_RETURN(result);
 }
 
diff --git a/source3/modules/vfs_glusterfs.c b/source3/modules/vfs_glusterfs.c
index ddead1f269c..59b76546112 100644
--- a/source3/modules/vfs_glusterfs.c
+++ b/source3/modules/vfs_glusterfs.c
@@ -723,6 +723,7 @@ static int vfs_gluster_mkdirat(struct vfs_handle_struct *handle,
 						  dirfsp,
 						  smb_fname);
 	if (full_fname == NULL) {
+		END_PROFILE(syscall_mkdirat);
 		return -1;
 	}
 
@@ -1899,11 +1900,23 @@ static int vfs_gluster_mknodat(struct vfs_handle_struct *handle,
 				mode_t mode,
 				SMB_DEV_T dev)
 {
+	struct smb_filename *full_fname = NULL;
 	int ret;
 
 	START_PROFILE(syscall_mknodat);
-	SMB_ASSERT(dirfsp == dirfsp->conn->cwd_fsp);
-	ret = glfs_mknod(handle->data, smb_fname->base_name, mode, dev);
+
+	full_fname = full_path_from_dirfsp_atname(talloc_tos(),
+						dirfsp,
+						smb_fname);
+	if (full_fname == NULL) {
+		END_PROFILE(syscall_mknodat);
+		return -1;
+	}
+
+	ret = glfs_mknod(handle->data, full_fname->base_name, mode, dev);
+
+	TALLOC_FREE(full_fname);
+
 	END_PROFILE(syscall_mknodat);
 
 	return ret;
diff --git a/source3/smbd/pysmbd.c b/source3/smbd/pysmbd.c
index 216de7a82fd..042e31b79d6 100644
--- a/source3/smbd/pysmbd.c
+++ b/source3/smbd/pysmbd.c
@@ -1026,8 +1026,12 @@ static PyObject *py_smbd_mkdir(PyObject *self, PyObject *args, PyObject *kwargs)
 	TALLOC_CTX *frame = talloc_stackframe();
 	struct connection_struct *conn = NULL;
 	struct smb_filename *smb_fname = NULL;
+	struct smb_filename *parent_fname = NULL;
+	struct smb_filename *base_name = NULL;
+	NTSTATUS status;
 	int ret;
 	mode_t saved_umask;
+	bool ok;
 
 	if (!PyArg_ParseTupleAndKeywords(args,
 					 kwargs,
@@ -1076,13 +1080,33 @@ static PyObject *py_smbd_mkdir(PyObject *self, PyObject *args, PyObject *kwargs)
 		return NULL;
 	}
 
+	ok = parent_smb_fname(frame,
+			      smb_fname,
+			      &parent_fname,
+			      &base_name);
+	if (!ok) {
+		TALLOC_FREE(frame);
+		return NULL;
+	}
+
+	ret = vfs_stat(conn, parent_fname);
+	if (ret == -1) {
+		TALLOC_FREE(frame);
+		return NULL;
+	}
+	status = openat_pathref_fsp(conn->cwd_fsp, parent_fname);
+	if (!NT_STATUS_IS_OK(status)) {
+		TALLOC_FREE(frame);
+		return NULL;
+	}
+
 	/* we want total control over the permissions on created files,
 	   so set our umask to 0 */
 	saved_umask = umask(0);
 
 	ret = SMB_VFS_MKDIRAT(conn,
-			conn->cwd_fsp,
-			smb_fname,
+			parent_fname->fsp,
+			base_name,
 			00755);
 
 	umask(saved_umask);
diff --git a/source3/smbd/trans2.c b/source3/smbd/trans2.c
index 69b8323a29d..3c1df4ca3ac 100644
--- a/source3/smbd/trans2.c
+++ b/source3/smbd/trans2.c
@@ -8113,6 +8113,9 @@ static NTSTATUS smb_unix_mknod(connection_struct *conn,
 	NTSTATUS status;
 	mode_t unixmode;
 	int ret;
+	struct smb_filename *parent_fname = NULL;
+	struct smb_filename *base_name = NULL;
+	bool ok;
 
 	if (total_data < 100) {
 		return NT_STATUS_INVALID_PARAMETER;
@@ -8169,14 +8172,37 @@ static NTSTATUS smb_unix_mknod(connection_struct *conn,
 		  "%.0f mode 0%o for file %s\n", (double)dev,
 		  (unsigned int)unixmode, smb_fname_str_dbg(smb_fname)));
 
+	ok = parent_smb_fname(talloc_tos(),
+			      smb_fname,
+			      &parent_fname,
+			      &base_name);
+	if (!ok) {
+		return NT_STATUS_NO_MEMORY;
+	}
+
+	ret = vfs_stat(conn, parent_fname);
+	if (ret == -1) {
+		TALLOC_FREE(parent_fname);
+		return map_nt_error_from_unix(errno);
+	}
+	status = openat_pathref_fsp(conn->cwd_fsp, parent_fname);
+	if (NT_STATUS_EQUAL(status, NT_STATUS_STOPPED_ON_SYMLINK)) {
+		status = NT_STATUS_OBJECT_NAME_NOT_FOUND;
+	}
+	if (!NT_STATUS_IS_OK(status)) {
+		TALLOC_FREE(parent_fname);
+		return status;
+	}
+
 	/* Ok - do the mknod. */
 	ret = SMB_VFS_MKNODAT(conn,
-			conn->cwd_fsp,
-			smb_fname,
+			parent_fname->fsp,
+			base_name,
 			unixmode,
 			dev);
 
 	if (ret != 0) {
+		TALLOC_FREE(parent_fname);
 		return map_nt_error_from_unix(errno);
 	}
 
@@ -8185,22 +8211,12 @@ static NTSTATUS smb_unix_mknod(connection_struct *conn,
  	 */
 
 	if (lp_inherit_permissions(SNUM(conn))) {
-		struct smb_filename *parent_fname = NULL;
-		bool ok;
-
-		ok = parent_smb_fname(talloc_tos(),
-				      smb_fname,
-				      &parent_fname,
-				      NULL);
-		if (!ok) {
-			return NT_STATUS_NO_MEMORY;
-		}
 		inherit_access_posix_acl(conn,
 					 parent_fname,
 					 smb_fname,
 					 unixmode);
-		TALLOC_FREE(parent_fname);
 	}
+	TALLOC_FREE(parent_fname);
 
 	return NT_STATUS_OK;
 }


-- 
Samba Shared Repository



More information about the samba-cvs mailing list