smbd: oplock: Factor out internals of remove_oplock() into new remove_oplock_under_lo...
authorJeremy Allison <jra@samba.org>
Wed, 10 Aug 2016 21:39:52 +0000 (14:39 -0700)
committerJeremy Allison <jra@samba.org>
Thu, 11 Aug 2016 17:55:11 +0000 (19:55 +0200)
Allows this to be called elsewhere.

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

Signed-off-by: Jeremy Allison <jra@samba.org>
Reviewed-by: Volker Lendecke <vl@samba.org>
source3/smbd/oplock.c
source3/smbd/proto.h

index 423ebbab3ff839998ac8fb25fa9e909df1f588f1..ff87d9ea4498327be2cfc921a8bda596b0cfeed3 100644 (file)
@@ -222,6 +222,34 @@ bool update_num_read_oplocks(files_struct *fsp, struct share_mode_lock *lck)
        return true;
 }
 
+/****************************************************************************
+ Remove a file oplock with lock already held. Copes with level II and exclusive.
+****************************************************************************/
+
+bool remove_oplock_under_lock(files_struct *fsp, struct share_mode_lock *lck)
+{
+       bool ret;
+
+       ret = remove_share_oplock(lck, fsp);
+       if (!ret) {
+               DBG_ERR("failed to remove share oplock for "
+                       "file %s, %s, %s\n",
+                       fsp_str_dbg(fsp), fsp_fnum_dbg(fsp),
+                       file_id_string_tos(&fsp->file_id));
+       }
+       release_file_oplock(fsp);
+
+       ret = update_num_read_oplocks(fsp, lck);
+       if (!ret) {
+               DBG_ERR("update_num_read_oplocks failed for "
+                       "file %s, %s, %s\n",
+                       fsp_str_dbg(fsp), fsp_fnum_dbg(fsp),
+                       file_id_string_tos(&fsp->file_id));
+       }
+
+       return ret;
+}
+
 /****************************************************************************
  Remove a file oplock. Copes with level II and exclusive.
  Locks then unlocks the share mode lock. Client can decide to go directly
@@ -243,22 +271,7 @@ bool remove_oplock(files_struct *fsp)
                return false;
        }
 
-       ret = remove_share_oplock(lck, fsp);
-       if (!ret) {
-               DBG_ERR("failed to remove share oplock for "
-                        "file %s, %s, %s\n",
-                        fsp_str_dbg(fsp), fsp_fnum_dbg(fsp),
-                        file_id_string_tos(&fsp->file_id));
-       }
-       release_file_oplock(fsp);
-
-       ret = update_num_read_oplocks(fsp, lck);
-       if (!ret) {
-               DBG_ERR("update_num_read_oplocks failed for "
-                        "file %s, %s, %s\n",
-                        fsp_str_dbg(fsp), fsp_fnum_dbg(fsp),
-                        file_id_string_tos(&fsp->file_id));
-       }
+       ret = remove_oplock_under_lock(fsp, lck);
 
        TALLOC_FREE(lck);
        return ret;
index 26fec95dc544b04bd67a09fd91550803bfcef1b1..97fe577516f0d8f7608fd9511f00ea9f3eaf8797 100644 (file)
@@ -708,6 +708,7 @@ bool update_num_read_oplocks(files_struct *fsp, struct share_mode_lock *lck);
 
 void break_kernel_oplock(struct messaging_context *msg_ctx, files_struct *fsp);
 NTSTATUS set_file_oplock(files_struct *fsp);
+bool remove_oplock_under_lock(files_struct *fsp, struct share_mode_lock *lck);
 bool remove_oplock(files_struct *fsp);
 bool downgrade_oplock(files_struct *fsp);
 bool fsp_lease_update(struct share_mode_lock *lck,