NTSTATUS query_lock(files_struct *fsp, uint64_t *psmblctx, uint64_t *pcount, uint64_t *poffset, enum brl_type *plock_type, enum brl_flavour lock_flav) { struct byte_range_lock *br_lck = NULL; if (!fsp->can_lock) { return fsp->is_directory ? NT_STATUS_INVALID_DEVICE_REQUEST : NT_STATUS_INVALID_HANDLE; } if (!lp_locking(fsp->conn->params)) { return NT_STATUS_OK; } br_lck = brl_get_locks_readonly(fsp); if (!br_lck) { return NT_STATUS_NO_MEMORY; } return brl_lockquery(br_lck, psmblctx, messaging_server_id(fsp->conn->sconn->msg_ctx), poffset, pcount, plock_type, lock_flav); }
NTSTATUS query_lock(files_struct *fsp, uint32 *psmbpid, SMB_BIG_UINT *pcount, SMB_BIG_UINT *poffset, enum brl_type *plock_type, enum brl_flavour lock_flav) { struct byte_range_lock *br_lck = NULL; NTSTATUS status = NT_STATUS_LOCK_NOT_GRANTED; if (!fsp->can_lock) { return fsp->is_directory ? NT_STATUS_INVALID_DEVICE_REQUEST : NT_STATUS_INVALID_HANDLE; } if (!lp_locking(fsp->conn->params)) { return NT_STATUS_OK; } br_lck = brl_get_locks_readonly(NULL, fsp); if (!br_lck) { return NT_STATUS_NO_MEMORY; } status = brl_lockquery(br_lck, psmbpid, procid_self(), poffset, pcount, plock_type, lock_flav); TALLOC_FREE(br_lck); return status; }
bool update_num_read_oplocks(files_struct *fsp, struct share_mode_lock *lck) { struct share_mode_data *d = lck->data; struct byte_range_lock *br_lck; uint32_t num_read_oplocks = 0; uint32_t i; if (EXCLUSIVE_OPLOCK_TYPE(fsp->oplock_type)) { /* * If we're the only one, we don't need a brlock entry */ remove_stale_share_mode_entries(d); SMB_ASSERT(d->num_share_modes == 1); SMB_ASSERT(EXCLUSIVE_OPLOCK_TYPE(d->share_modes[0].op_type)); return true; } for (i=0; i<d->num_share_modes; i++) { struct share_mode_entry *e = &d->share_modes[i]; uint32_t e_lease_type = get_lease_type(d, e); if (e_lease_type & SMB2_LEASE_READ) { num_read_oplocks += 1; } } br_lck = brl_get_locks_readonly(fsp); if (br_lck == NULL) { return false; } if (brl_num_read_oplocks(br_lck) == num_read_oplocks) { return true; } br_lck = brl_get_locks(talloc_tos(), fsp); if (br_lck == NULL) { return false; } brl_set_num_read_oplocks(br_lck, num_read_oplocks); TALLOC_FREE(br_lck); return true; }
bool strict_lock_default(files_struct *fsp, struct lock_struct *plock) { int strict_locking = lp_strict_locking(fsp->conn->params); bool ret = False; if (plock->size == 0) { return True; } if (!lp_locking(fsp->conn->params) || !strict_locking) { return True; } if (strict_locking == Auto) { if (EXCLUSIVE_OPLOCK_TYPE(fsp->oplock_type) && (plock->lock_type == READ_LOCK || plock->lock_type == WRITE_LOCK)) { DEBUG(10,("is_locked: optimisation - exclusive oplock on file %s\n", fsp_str_dbg(fsp))); ret = True; } else if ((fsp->oplock_type == LEVEL_II_OPLOCK) && (plock->lock_type == READ_LOCK)) { DEBUG(10,("is_locked: optimisation - level II oplock on file %s\n", fsp_str_dbg(fsp))); ret = True; } else { struct byte_range_lock *br_lck; br_lck = brl_get_locks_readonly(fsp); if (!br_lck) { return True; } ret = brl_locktest(br_lck, plock->context.smblctx, plock->context.pid, plock->start, plock->size, plock->lock_type, plock->lock_flav); } } else { struct byte_range_lock *br_lck; br_lck = brl_get_locks_readonly(fsp); if (!br_lck) { return True; } ret = brl_locktest(br_lck, plock->context.smblctx, plock->context.pid, plock->start, plock->size, plock->lock_type, plock->lock_flav); } DEBUG(10,("strict_lock_default: flavour = %s brl start=%.0f " "len=%.0f %s for fnum %llu file %s\n", lock_flav_name(plock->lock_flav), (double)plock->start, (double)plock->size, ret ? "unlocked" : "locked", (unsigned long long)plock->fnum, fsp_str_dbg(fsp))); return ret; }
BOOL is_locked(files_struct *fsp, uint32 smbpid, SMB_BIG_UINT count, SMB_BIG_UINT offset, enum brl_type lock_type) { int strict_locking = lp_strict_locking(fsp->conn->params); enum brl_flavour lock_flav = lp_posix_cifsu_locktype(fsp); BOOL ret = True; if (count == 0) { return False; } if (!lp_locking(fsp->conn->params) || !strict_locking) { return False; } if (strict_locking == Auto) { if (EXCLUSIVE_OPLOCK_TYPE(fsp->oplock_type) && (lock_type == READ_LOCK || lock_type == WRITE_LOCK)) { DEBUG(10,("is_locked: optimisation - exclusive oplock on file %s\n", fsp->fsp_name )); ret = False; } else if ((fsp->oplock_type == LEVEL_II_OPLOCK) && (lock_type == READ_LOCK)) { DEBUG(10,("is_locked: optimisation - level II oplock on file %s\n", fsp->fsp_name )); ret = False; } else { struct byte_range_lock *br_lck = brl_get_locks_readonly(NULL, fsp); if (!br_lck) { return False; } ret = !brl_locktest(br_lck, smbpid, procid_self(), offset, count, lock_type, lock_flav); TALLOC_FREE(br_lck); } } else { struct byte_range_lock *br_lck = brl_get_locks_readonly(NULL, fsp); if (!br_lck) { return False; } ret = !brl_locktest(br_lck, smbpid, procid_self(), offset, count, lock_type, lock_flav); TALLOC_FREE(br_lck); } DEBUG(10,("is_locked: flavour = %s brl start=%.0f len=%.0f %s for fnum %d file %s\n", lock_flav_name(lock_flav), (double)offset, (double)count, ret ? "locked" : "unlocked", fsp->fnum, fsp->fsp_name )); return ret; }