diff options
-rw-r--r-- | source3/smbd/open.c | 15 | ||||
-rw-r--r-- | source3/smbd/oplock.c | 17 |
2 files changed, 15 insertions, 17 deletions
diff --git a/source3/smbd/open.c b/source3/smbd/open.c index f236243b37..0ef2b3a90d 100644 --- a/source3/smbd/open.c +++ b/source3/smbd/open.c @@ -1011,6 +1011,17 @@ static bool delay_for_exclusive_oplocks(files_struct *fsp, return false; } +static bool file_has_brlocks(files_struct *fsp) +{ + struct byte_range_lock *br_lck; + + br_lck = brl_get_locks_readonly(fsp); + if (!br_lck) + return false; + + return br_lck->num_locks > 0 ? true : false; +} + static void grant_fsp_oplock_type(files_struct *fsp, int oplock_request, bool got_level2_oplock, @@ -1029,6 +1040,10 @@ static void grant_fsp_oplock_type(files_struct *fsp, DEBUG(10,("grant_fsp_oplock_type: oplock type 0x%x on file %s\n", fsp->oplock_type, fsp_str_dbg(fsp))); return; + } else if (lp_locking(fsp->conn->params) && file_has_brlocks(fsp)) { + DEBUG(10,("grant_fsp_oplock_type: file %s has byte range locks\n", + fsp_str_dbg(fsp))); + fsp->oplock_type = NO_OPLOCK; } if (is_stat_open(fsp->access_mask)) { diff --git a/source3/smbd/oplock.c b/source3/smbd/oplock.c index c3c41d1c33..a2ba0109ae 100644 --- a/source3/smbd/oplock.c +++ b/source3/smbd/oplock.c @@ -52,17 +52,6 @@ void break_kernel_oplock(struct messaging_context *msg_ctx, files_struct *fsp) msg, MSG_SMB_KERNEL_BREAK_SIZE); } -static bool file_has_brlocks(files_struct *fsp) -{ - struct byte_range_lock *br_lck; - - br_lck = brl_get_locks_readonly(fsp); - if (!br_lck) - return false; - - return br_lck->num_locks > 0 ? true : false; -} - /**************************************************************************** Attempt to set an oplock on a file. Succeeds if kernel oplocks are disabled (just sets flags) and no byte-range locks in the file. Returns True @@ -72,12 +61,6 @@ static bool file_has_brlocks(files_struct *fsp) bool set_file_oplock(files_struct *fsp, int oplock_type) { if (fsp->oplock_type == LEVEL_II_OPLOCK) { - if (lp_locking(fsp->conn->params) && file_has_brlocks(fsp)) { - DEBUG(10, ("Refusing level2 oplock because of " - "byte-range locks on the file\n")); - return false; - } - if (koplocks && !(koplocks->flags & KOPLOCKS_LEVEL2_SUPPORTED)) { DEBUG(10, ("Refusing level2 oplock, kernel oplocks " |