Remove file system sharemode before calling unlink
authorChristof Schmitt <cs@samba.org>
Wed, 10 Jan 2018 22:56:08 +0000 (15:56 -0700)
committerChristof Schmitt <cs@samba.org>
Wed, 17 Jan 2018 00:31:53 +0000 (01:31 +0100)
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().

BUG: https://bugzilla.samba.org/show_bug.cgi?id=13217

Signed-off-by: Christof Schmitt <cs@samba.org>
Reviewed-by: Jeremy Allison <jra@samba.org>
Autobuild-User(master): Christof Schmitt <cs@samba.org>
Autobuild-Date(master): Wed Jan 17 01:31:53 CET 2018 on sn-devel-144

source3/smbd/close.c

index 095feec..2f6cc4f 100644 (file)
@@ -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) {
                /*