[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