[PATCH] Remove file system sharemode before calling unlink

Christof Schmitt cs at samba.org
Wed Jan 10 23:38:29 UTC 2018


From 05c37256483d961a4448239292022ec38d8ff188 Mon Sep 17 00:00:00 2001
From: Christof Schmitt <cs at samba.org>
Date: Wed, 10 Jan 2018 15:56:08 -0700
Subject: [PATCH] Remove file system sharemode before calling unlink

GPFS implements the DENY_DELETE sharemode, which prevents unlink() from
deleting the file.. This causes the problem that deleting a file through
"delete on close" fails, as the code in close.c first calls unlink() and
only later removes the file system sharemode.

Fix this by removing the file system sharemode before calling unlink().

Signed-off-by: Christof Schmitt <cs at samba.org>
---
 source3/smbd/close.c | 16 ++++++++++++++++
 1 file changed, 16 insertions(+)

diff --git a/source3/smbd/close.c b/source3/smbd/close.c
index 095feec..2f6cc4f 100644
--- a/source3/smbd/close.c
+++ b/source3/smbd/close.c
@@ -446,6 +446,22 @@ static NTSTATUS close_remove_share_mode(files_struct *fsp,
 		}
 	}
 
+	if (fsp->kernel_share_modes_taken) {
+		int ret_flock;
+
+		/*
+		 * A file system sharemode could block the unlink;
+		 * remove filesystem sharemodes first.
+		 */
+		ret_flock = SMB_VFS_KERNEL_FLOCK(fsp, 0, 0);
+		if (ret_flock == -1) {
+			DBG_INFO("removing kernel flock for %s failed: %s\n",
+				  fsp_str_dbg(fsp), strerror(errno));
+		}
+
+		fsp->kernel_share_modes_taken = false;
+	}
+
 
 	if (SMB_VFS_UNLINK(conn, fsp->fsp_name) != 0) {
 		/*
-- 
1.8.3.1



More information about the samba-technical mailing list