From a6b1a8e9095efe4d739add05bea7b0f7b117e021 Mon Sep 17 00:00:00 2001 From: Michael Adam Date: Mon, 16 May 2016 01:39:09 +0200 Subject: [PATCH 1/2] s3:vfs: add 'kernel_share_modes_taken' to files_struct This will allow to track whether kernel share modes have been taken at open and correclty remove them again on close. BUG: https://bugzilla.samba.org/show_bug.cgi?id=11919 Signed-off-by: Michael Adam Reviewed-by: Christian Ambach (cherry picked from commit 356487345724ce5dffdddf9c60735b2c965f30bc) --- source3/include/vfs.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/source3/include/vfs.h b/source3/include/vfs.h index c18ea59..fb3b8aa 100644 --- a/source3/include/vfs.h +++ b/source3/include/vfs.h @@ -237,6 +237,8 @@ typedef struct files_struct { uint32_t access_mask; /* NTCreateX access bits (FILE_READ_DATA etc.) */ uint32_t share_access; /* NTCreateX share constants (FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE). */ + bool kernel_share_modes_taken; + bool update_write_time_triggered; struct tevent_timer *update_write_time_event; bool update_write_time_on_close; -- 2.5.5 From 2733878a08ef9a73bcae7b3397ed00d6f8e33985 Mon Sep 17 00:00:00 2001 From: Michael Adam Date: Sun, 15 May 2016 23:24:08 +0200 Subject: [PATCH 2/2] smbd:close: only remove kernel share modes if they had been taken at open This avoids errors due to 'not implemented' for SMB_VFS_KERNEL_FLOCK on some file systems like glusterfs (with the vfs module). The only other code path where SMB_VFS_KERNEL_FLOCK is called, is already protected. BUG: https://bugzilla.samba.org/show_bug.cgi?id=11919 Signed-off-by: Michael Adam Reviewed-by: Christian Ambach Autobuild-User(master): Christian Ambach Autobuild-Date(master): Thu May 19 02:34:36 CEST 2016 on sn-devel-144 (cherry picked from commit 6b232b2720a3d71bc0b4b5603215b3f9d3de5ca6) --- source3/smbd/close.c | 17 ++++++++++------- source3/smbd/open.c | 2 ++ 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/source3/smbd/close.c b/source3/smbd/close.c index 1cb5460..3ab04b7 100644 --- a/source3/smbd/close.c +++ b/source3/smbd/close.c @@ -246,7 +246,6 @@ static NTSTATUS close_remove_share_mode(files_struct *fsp, const struct security_token *del_nt_token = NULL; bool got_tokens = false; bool normal_close; - int ret_flock; /* Ensure any pending write time updates are done. */ if (fsp->update_write_time_event) { @@ -470,12 +469,16 @@ static NTSTATUS close_remove_share_mode(files_struct *fsp, pop_sec_ctx(); } - /* remove filesystem sharemodes */ - ret_flock = SMB_VFS_KERNEL_FLOCK(fsp, 0, 0); - if (ret_flock == -1) { - DEBUG(2, ("close_remove_share_mode: removing kernel flock for " - "%s failed: %s\n", fsp_str_dbg(fsp), - strerror(errno))); + if (fsp->kernel_share_modes_taken) { + int ret_flock; + + /* remove filesystem sharemodes */ + ret_flock = SMB_VFS_KERNEL_FLOCK(fsp, 0, 0); + if (ret_flock == -1) { + DEBUG(2, ("close_remove_share_mode: removing kernel " + "flock for %s failed: %s\n", + fsp_str_dbg(fsp), strerror(errno))); + } } if (!del_share_mode(lck, fsp)) { diff --git a/source3/smbd/open.c b/source3/smbd/open.c index 0d90c99..61b7145 100644 --- a/source3/smbd/open.c +++ b/source3/smbd/open.c @@ -3084,6 +3084,8 @@ static NTSTATUS open_file_ntcreate(connection_struct *conn, return NT_STATUS_SHARING_VIOLATION; } + + fsp->kernel_share_modes_taken = true; } /* -- 2.5.5