From 6b232b2720a3d71bc0b4b5603215b3f9d3de5ca6 Mon Sep 17 00:00:00 2001 From: Michael Adam Date: Sun, 15 May 2016 23:24:08 +0200 Subject: [PATCH] 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 --- 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 0302c67ce845..9d1f1a98afef 100644 --- a/source3/smbd/close.c +++ b/source3/smbd/close.c @@ -250,7 +250,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) { @@ -474,12 +473,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 d111254b9cb8..af1c1de89e84 100644 --- a/source3/smbd/open.c +++ b/source3/smbd/open.c @@ -3102,6 +3102,8 @@ static NTSTATUS open_file_ntcreate(connection_struct *conn, return NT_STATUS_SHARING_VIOLATION; } + + fsp->kernel_share_modes_taken = true; } /* -- 2.34.1