[PATCH] A few cleanups around share_mode_data

Volker Lendecke Volker.Lendecke at SerNet.DE
Mon Sep 10 14:10:50 UTC 2018


Hi!

Review appreciated! Overall 30 lines less... :-)

Thanks, Volker

-- 
SerNet GmbH, Bahnhofsallee 1b, 37081 Göttingen
phone: +49-551-370000-0, fax: +49-551-370000-9
AG Göttingen, HRB 2816, GF: Dr. Johannes Loxen
http://www.sernet.de, mailto:kontakt at sernet.de

Meet us at Storage Developer Conference (SDC)
Santa Clara, CA USA, September 24th-27th 2018
-------------- next part --------------
From fb0678dc0d3e3b02b831918110f189b946c3b222 Mon Sep 17 00:00:00 2001
From: Volker Lendecke <vl at samba.org>
Date: Sat, 8 Sep 2018 12:45:54 +0200
Subject: [PATCH 1/5] smbd: Remove an unneeded #include

Signed-off-by: Volker Lendecke <vl at samba.org>
---
 source3/smbd/reply.c | 1 -
 1 file changed, 1 deletion(-)

diff --git a/source3/smbd/reply.c b/source3/smbd/reply.c
index 5afe57d..4c6456c 100644
--- a/source3/smbd/reply.c
+++ b/source3/smbd/reply.c
@@ -33,7 +33,6 @@
 #include "fake_file.h"
 #include "rpc_client/rpc_client.h"
 #include "../librpc/gen_ndr/ndr_spoolss_c.h"
-#include "../librpc/gen_ndr/open_files.h"
 #include "rpc_client/cli_spoolss.h"
 #include "rpc_client/init_spoolss.h"
 #include "rpc_server/rpc_ncacn_np.h"
-- 
1.9.1


From 30332b8824516e35367bfe9bf0a2426e52661f6a Mon Sep 17 00:00:00 2001
From: Volker Lendecke <vl at samba.org>
Date: Sat, 8 Sep 2018 13:44:30 +0200
Subject: [PATCH 2/5] smbd: Simplify close_directory()

Same patch as in 8541829a9ab20c7fa8c

Signed-off-by: Volker Lendecke <vl at samba.org>
---
 source3/smbd/close.c | 36 ++++++++++++++++++++----------------
 1 file changed, 20 insertions(+), 16 deletions(-)

diff --git a/source3/smbd/close.c b/source3/smbd/close.c
index 7820fff..288415a 100644
--- a/source3/smbd/close.c
+++ b/source3/smbd/close.c
@@ -1153,23 +1153,27 @@ static NTSTATUS close_directory(struct smb_request *req, files_struct *fsp,
 		 * case, then don't delete. If all opens are POSIX delete now. */
 		for (i=0; i<lck->data->num_share_modes; i++) {
 			struct share_mode_entry *e = &lck->data->share_modes[i];
-			if (is_valid_share_mode_entry(e) &&
-					e->name_hash == fsp->name_hash) {
-				if ((fsp->posix_flags & FSP_POSIX_FLAGS_OPEN) &&
-				    (e->flags & SHARE_MODE_FLAG_POSIX_OPEN))
-				{
-					continue;
-				}
-				if (serverid_equal(&self, &e->pid) &&
-				    (e->share_file_id == fsp->fh->gen_id)) {
-					continue;
-				}
-				if (share_mode_stale_pid(lck->data, i)) {
-					continue;
-				}
-				delete_dir = False;
-				break;
+
+			if (!is_valid_share_mode_entry(e)) {
+				continue;
+			}
+			if (e->name_hash != fsp->name_hash) {
+				continue;
 			}
+			if ((fsp->posix_flags & FSP_POSIX_FLAGS_OPEN) &&
+			    (e->flags & SHARE_MODE_FLAG_POSIX_OPEN))
+			{
+				continue;
+			}
+			if (serverid_equal(&self, &e->pid) &&
+			    (e->share_file_id == fsp->fh->gen_id)) {
+				continue;
+			}
+			if (share_mode_stale_pid(lck->data, i)) {
+				continue;
+			}
+			delete_dir = False;
+			break;
 		}
 	}
 
-- 
1.9.1


From b666d6826ea3881e4aaf738dcbfdc44b6cc5649e Mon Sep 17 00:00:00 2001
From: Volker Lendecke <vl at samba.org>
Date: Sat, 8 Sep 2018 13:50:46 +0200
Subject: [PATCH 3/5] smbd: Remove an unneeded #include

ndr_open_files already includes open_files.h

Signed-off-by: Volker Lendecke <vl at samba.org>
---
 source3/smbd/oplock.c | 1 -
 1 file changed, 1 deletion(-)

diff --git a/source3/smbd/oplock.c b/source3/smbd/oplock.c
index 8073fbe..2faad78 100644
--- a/source3/smbd/oplock.c
+++ b/source3/smbd/oplock.c
@@ -25,7 +25,6 @@
 #include "smbd/smbd.h"
 #include "smbd/globals.h"
 #include "messages.h"
-#include "../librpc/gen_ndr/open_files.h"
 #include "../librpc/gen_ndr/ndr_open_files.h"
 
 /*
-- 
1.9.1


From 6bd1c8a2b5657fcd7e2ffc0f1ac68326ab7f7541 Mon Sep 17 00:00:00 2001
From: Volker Lendecke <vl at samba.org>
Date: Sat, 8 Sep 2018 16:58:36 +0200
Subject: [PATCH 4/5] smbd: Factor out "has_other_nonposix_opens"

This is exactly the same in both file and directory cases

Signed-off-by: Volker Lendecke <vl at samba.org>
---
 source3/smbd/close.c | 93 ++++++++++++++++++++--------------------------------
 source3/smbd/proto.h |  3 ++
 2 files changed, 38 insertions(+), 58 deletions(-)

diff --git a/source3/smbd/close.c b/source3/smbd/close.c
index 288415a..742b3f0 100644
--- a/source3/smbd/close.c
+++ b/source3/smbd/close.c
@@ -233,6 +233,39 @@ NTSTATUS delete_all_streams(connection_struct *conn,
 	return status;
 }
 
+bool has_other_nonposix_opens(struct share_mode_lock *lck,
+			      struct files_struct *fsp,
+			      struct server_id self)
+{
+	struct share_mode_data *data = lck->data;
+	uint32_t i;
+
+	for (i=0; i<data->num_share_modes; i++) {
+		struct share_mode_entry *e = &data->share_modes[i];
+
+		if (!is_valid_share_mode_entry(e)) {
+			continue;
+		}
+		if (e->name_hash != fsp->name_hash) {
+			continue;
+		}
+		if ((fsp->posix_flags & FSP_POSIX_FLAGS_OPEN) &&
+		    (e->flags & SHARE_MODE_FLAG_POSIX_OPEN)) {
+			continue;
+		}
+		if (serverid_equal(&self, &e->pid) &&
+		    (e->share_file_id == fsp->fh->gen_id)) {
+			continue;
+		}
+		if (share_mode_stale_pid(data, i)) {
+			continue;
+		}
+		return true;
+	}
+
+	return false;
+}
+
 /****************************************************************************
  Deal with removing a share mode on last close.
 ****************************************************************************/
@@ -320,35 +353,7 @@ static NTSTATUS close_remove_share_mode(files_struct *fsp,
 
 	delete_file = is_delete_on_close_set(lck, fsp->name_hash);
 
-	if (delete_file) {
-		int i;
-		/* See if others still have the file open via this pathname.
-		   If this is the case, then don't delete. If all opens are
-		   POSIX delete now. */
-		for (i=0; i<lck->data->num_share_modes; i++) {
-			struct share_mode_entry *e = &lck->data->share_modes[i];
-
-			if (!is_valid_share_mode_entry(e)) {
-				continue;
-			}
-			if (e->name_hash != fsp->name_hash) {
-				continue;
-			}
-			if ((fsp->posix_flags & FSP_POSIX_FLAGS_OPEN)
-			    && (e->flags & SHARE_MODE_FLAG_POSIX_OPEN)) {
-				continue;
-			}
-			if (serverid_equal(&self, &e->pid) &&
-			    (e->share_file_id == fsp->fh->gen_id)) {
-				continue;
-			}
-			if (share_mode_stale_pid(lck->data, i)) {
-				continue;
-			}
-			delete_file = False;
-			break;
-		}
-	}
+	delete_file &= !has_other_nonposix_opens(lck, fsp, self);
 
 	/*
 	 * NT can set delete_on_close of the last open
@@ -1147,35 +1152,7 @@ static NTSTATUS close_directory(struct smb_request *req, files_struct *fsp,
 	delete_dir = get_delete_on_close_token(lck, fsp->name_hash,
 					&del_nt_token, &del_token);
 
-	if (delete_dir) {
-		int i;
-		/* See if others still have the dir open. If this is the
-		 * case, then don't delete. If all opens are POSIX delete now. */
-		for (i=0; i<lck->data->num_share_modes; i++) {
-			struct share_mode_entry *e = &lck->data->share_modes[i];
-
-			if (!is_valid_share_mode_entry(e)) {
-				continue;
-			}
-			if (e->name_hash != fsp->name_hash) {
-				continue;
-			}
-			if ((fsp->posix_flags & FSP_POSIX_FLAGS_OPEN) &&
-			    (e->flags & SHARE_MODE_FLAG_POSIX_OPEN))
-			{
-				continue;
-			}
-			if (serverid_equal(&self, &e->pid) &&
-			    (e->share_file_id == fsp->fh->gen_id)) {
-				continue;
-			}
-			if (share_mode_stale_pid(lck->data, i)) {
-				continue;
-			}
-			delete_dir = False;
-			break;
-		}
-	}
+	delete_dir &= !has_other_nonposix_opens(lck, fsp, self);
 
 	if ((close_type == NORMAL_CLOSE || close_type == SHUTDOWN_CLOSE) &&
 				delete_dir) {
diff --git a/source3/smbd/proto.h b/source3/smbd/proto.h
index 2a41d9d..5399c5a 100644
--- a/source3/smbd/proto.h
+++ b/source3/smbd/proto.h
@@ -146,6 +146,9 @@ NTSTATUS delete_all_streams(connection_struct *conn,
 bool recursive_rmdir(TALLOC_CTX *ctx,
 		     connection_struct *conn,
 		     struct smb_filename *smb_dname);
+bool has_other_nonposix_opens(struct share_mode_lock *lck,
+			      struct files_struct *fsp,
+			      struct server_id self);
 
 /* The following definitions come from smbd/conn.c  */
 
-- 
1.9.1


From b0dc40b66166a2e8f0c8605171672fe7fa66b263 Mon Sep 17 00:00:00 2001
From: Volker Lendecke <vl at samba.org>
Date: Sat, 8 Sep 2018 18:05:57 +0200
Subject: [PATCH 5/5] smbd: Use has_other_nonposix_opens in smb_posix_unlink

Almost the same code as in close.c. has_other_nonposix_opens() is a bit
more general, but the purpose is the same.

Signed-off-by: Volker Lendecke <vl at samba.org>
---
 source3/smbd/trans2.c | 30 +++++++++---------------------
 1 file changed, 9 insertions(+), 21 deletions(-)

diff --git a/source3/smbd/trans2.c b/source3/smbd/trans2.c
index c0f9847..0003c36 100644
--- a/source3/smbd/trans2.c
+++ b/source3/smbd/trans2.c
@@ -32,7 +32,6 @@
 #include "../libcli/auth/libcli_auth.h"
 #include "../librpc/gen_ndr/xattr.h"
 #include "../librpc/gen_ndr/ndr_security.h"
-#include "../librpc/gen_ndr/open_files.h"
 #include "libcli/security/security.h"
 #include "trans2.h"
 #include "auth.h"
@@ -41,6 +40,7 @@
 #include "printing.h"
 #include "lib/util_ea.h"
 #include "lib/readdir_attr.h"
+#include "messages.h"
 
 #define DIR_ENTRY_SAFETY_MARGIN 4096
 
@@ -8309,14 +8309,15 @@ static NTSTATUS smb_posix_unlink(connection_struct *conn,
 				int total_data,
 				struct smb_filename *smb_fname)
 {
+	struct server_id self = messaging_server_id(conn->sconn->msg_ctx);
 	NTSTATUS status = NT_STATUS_OK;
 	files_struct *fsp = NULL;
 	uint16_t flags = 0;
 	char del = 1;
 	int info = 0;
 	int create_options = 0;
-	int i;
 	struct share_mode_lock *lck = NULL;
+	bool other_nonposix_opens;
 
 	if (total_data < 2) {
 		return NT_STATUS_INVALID_PARAMETER;
@@ -8379,25 +8380,12 @@ static NTSTATUS smb_posix_unlink(connection_struct *conn,
 		return NT_STATUS_INVALID_PARAMETER;
 	}
 
-	/*
-	 * See if others still have the file open. If this is the case, then
-	 * don't delete. If all opens are POSIX delete we can set the delete
-	 * on close disposition.
-	 */
-	for (i=0; i<lck->data->num_share_modes; i++) {
-		struct share_mode_entry *e = &lck->data->share_modes[i];
-		if (is_valid_share_mode_entry(e)) {
-			if (e->flags & SHARE_MODE_FLAG_POSIX_OPEN) {
-				continue;
-			}
-			if (share_mode_stale_pid(lck->data, i)) {
-				continue;
-			}
-			/* Fail with sharing violation. */
-			TALLOC_FREE(lck);
-			close_file(req, fsp, NORMAL_CLOSE);
-			return NT_STATUS_SHARING_VIOLATION;
-		}
+	other_nonposix_opens = has_other_nonposix_opens(lck, fsp, self);
+	if (other_nonposix_opens) {
+		/* Fail with sharing violation. */
+		TALLOC_FREE(lck);
+		close_file(req, fsp, NORMAL_CLOSE);
+		return NT_STATUS_SHARING_VIOLATION;
 	}
 
 	/*
-- 
1.9.1



More information about the samba-technical mailing list