smbd: Fix breaking level2 on OVERWRITE create_disposition
authorVolker Lendecke <vl@samba.org>
Wed, 16 Oct 2013 19:21:56 +0000 (21:21 +0200)
committerStefan Metzmacher <metze@samba.org>
Wed, 23 Oct 2013 10:05:43 +0000 (12:05 +0200)
This is shown by the new raw.oplock.level_ii_1 test

Signed-off-by: Volker Lendecke <vl@samba.org>
Reviewed-by: Stefan Metzmacher <metze@samba.org>
selftest/knownfail
source3/smbd/open.c

index 25289d2..ab6d45f 100644 (file)
@@ -61,7 +61,6 @@
 ^samba3.raw.acls nfs4acl_xattr-special.inheritance\(s3dc\)
 ^samba3.raw.acls nfs4acl_xattr-special.inherit_creator_owner\(s3dc\)
 ^samba3.raw.acls nfs4acl_xattr-special.inherit_creator_group\(s3dc\)
-^samba3.raw.oplock.level_ii_1
 ^samba3.base.delete.deltest16a
 ^samba3.base.delete.deltest17a
 ^samba3.unix.whoami anonymous connection.whoami\(plugin_s4_dc\) # We need to resolve if we should be including SID_NT_WORLD and SID_NT_NETWORK in this token
index 4941453..c33a4cf 100644 (file)
@@ -1372,6 +1372,17 @@ static bool delay_for_oplock(files_struct *fsp,
                 */
                return false;
        }
+       if (LEVEL_II_OPLOCK_TYPE(entry->op_type) &&
+           (break_to == NO_OPLOCK)) {
+               if (share_mode_stale_pid(d, 0)) {
+                       return false;
+               }
+               DEBUG(10, ("Asynchronously breaking level2 oplock for "
+                          "create_disposition=%u\n",
+                          (unsigned)create_disposition));
+               send_break_message(fsp->conn->sconn->msg_ctx, entry, break_to);
+               return false;
+       }
        if (!EXCLUSIVE_OPLOCK_TYPE(entry->op_type)) {
                /*
                 * No break for NO_OPLOCK or LEVEL2_OPLOCK oplocks