Utility function called by locking requests.
****************************************************************************/
-struct byte_range_lock *do_lock(struct messaging_context *msg_ctx,
- files_struct *fsp,
- uint64_t smblctx,
- uint64_t count,
- uint64_t offset,
- enum brl_type lock_type,
- enum brl_flavour lock_flav,
- bool blocking_lock,
- NTSTATUS *perr,
- struct server_id *pblocker_pid,
- uint64_t *psmblctx)
+NTSTATUS do_lock(struct messaging_context *msg_ctx,
+ files_struct *fsp,
+ uint64_t smblctx,
+ uint64_t count,
+ uint64_t offset,
+ enum brl_type lock_type,
+ enum brl_flavour lock_flav,
+ bool blocking_lock,
+ struct server_id *pblocker_pid,
+ uint64_t *psmblctx)
{
struct byte_range_lock *br_lck = NULL;
struct server_id blocker_pid = { 0 };
uint64_t blocker_smblctx = 0;
+ NTSTATUS status;
/* silently return ok on print files as we don't do locking there */
if (fsp->print_file) {
- *perr = NT_STATUS_OK;
- return NULL;
+ return NT_STATUS_OK;
}
if (!fsp->can_lock) {
- *perr = fsp->is_directory ? NT_STATUS_INVALID_DEVICE_REQUEST : NT_STATUS_INVALID_HANDLE;
- return NULL;
+ if (fsp->is_directory) {
+ return NT_STATUS_INVALID_DEVICE_REQUEST;
+ }
+ return NT_STATUS_INVALID_HANDLE;
}
if (!lp_locking(fsp->conn->params)) {
- *perr = NT_STATUS_OK;
- return NULL;
+ return NT_STATUS_OK;
}
/* NOTE! 0 byte long ranges ARE allowed and should be stored */
br_lck = brl_get_locks(talloc_tos(), fsp);
if (!br_lck) {
- *perr = NT_STATUS_NO_MEMORY;
- return NULL;
+ return NT_STATUS_NO_MEMORY;
}
- *perr = brl_lock(msg_ctx,
- br_lck,
- smblctx,
- messaging_server_id(fsp->conn->sconn->msg_ctx),
- offset,
- count,
- lock_type,
- lock_flav,
- blocking_lock,
- &blocker_pid,
- &blocker_smblctx);
+ status = brl_lock(
+ msg_ctx,
+ br_lck,
+ smblctx,
+ messaging_server_id(fsp->conn->sconn->msg_ctx),
+ offset,
+ count,
+ lock_type,
+ lock_flav,
+ blocking_lock,
+ &blocker_pid,
+ &blocker_smblctx);
+
+ TALLOC_FREE(br_lck);
if (psmblctx != NULL) {
*psmblctx = blocker_smblctx;
*pblocker_pid = blocker_pid;
}
- DEBUG(10, ("do_lock: returning status=%s\n", nt_errstr(*perr)));
+ DBG_DEBUG("returning status=%s\n", nt_errstr(status));
increment_current_lock_count(fsp, lock_flav);
- return br_lck;
+
+ return status;
}
/****************************************************************************
uint64_t *poffset,
enum brl_type *plock_type,
enum brl_flavour lock_flav);
-struct byte_range_lock *do_lock(struct messaging_context *msg_ctx,
- files_struct *fsp,
- uint64_t smblctx,
- uint64_t count,
- uint64_t offset,
- enum brl_type lock_type,
- enum brl_flavour lock_flav,
- bool blocking_lock,
- NTSTATUS *perr,
- struct server_id *pblocker_pid,
- uint64_t *psmblctx);
+NTSTATUS do_lock(struct messaging_context *msg_ctx,
+ files_struct *fsp,
+ uint64_t smblctx,
+ uint64_t count,
+ uint64_t offset,
+ enum brl_type lock_type,
+ enum brl_flavour lock_flav,
+ bool blocking_lock,
+ struct server_id *pblocker_pid,
+ uint64_t *psmblctx);
NTSTATUS do_unlock(struct messaging_context *msg_ctx,
files_struct *fsp,
uint64_t smblctx,
/* Set NetAtalk locks matching our access */
if (access_mask & FILE_READ_DATA) {
- struct byte_range_lock *br_lck = NULL;
-
off = access_to_netatalk_brl(fork_type, FILE_READ_DATA);
- br_lck = do_lock(
+ status = do_lock(
handle->conn->sconn->msg_ctx,
fsp,
fsp->op->global->open_persistent_id,
READ_LOCK,
POSIX_LOCK,
false, /* blocking_lock */
- &status,
NULL,
NULL);
- TALLOC_FREE(br_lck);
-
if (!NT_STATUS_IS_OK(status)) {
return status;
}
}
if (!share_for_read) {
- struct byte_range_lock *br_lck = NULL;
-
off = denymode_to_netatalk_brl(fork_type, DENY_READ);
- br_lck = do_lock(
+ status = do_lock(
handle->conn->sconn->msg_ctx,
fsp,
fsp->op->global->open_persistent_id,
READ_LOCK,
POSIX_LOCK,
false, /* blocking_lock */
- &status,
NULL,
NULL);
- TALLOC_FREE(br_lck);
-
if (!NT_STATUS_IS_OK(status)) {
return status;
}
}
if (access_mask & FILE_WRITE_DATA) {
- struct byte_range_lock *br_lck = NULL;
-
off = access_to_netatalk_brl(fork_type, FILE_WRITE_DATA);
- br_lck = do_lock(
+ status = do_lock(
handle->conn->sconn->msg_ctx,
fsp,
fsp->op->global->open_persistent_id,
READ_LOCK,
POSIX_LOCK,
false,
- &status,
NULL,
NULL);
- TALLOC_FREE(br_lck);
-
if (!NT_STATUS_IS_OK(status)) {
return status;
}
}
if (!share_for_write) {
- struct byte_range_lock *br_lck = NULL;
-
off = denymode_to_netatalk_brl(fork_type, DENY_WRITE);
- br_lck = do_lock(
+ status = do_lock(
handle->conn->sconn->msg_ctx,
fsp,
fsp->op->global->open_persistent_id,
READ_LOCK,
POSIX_LOCK,
false,
- &status,
NULL,
NULL);
- TALLOC_FREE(br_lck);
-
if (!NT_STATUS_IS_OK(status)) {
return status;
}
for (i=0; i<num_locks; i++) {
struct smbd_lock_element *e = &locks[i];
- struct byte_range_lock *br_lck;
- br_lck = do_lock(
+ status = do_lock(
msg_ctx,
fsp,
e->smblctx,
e->brltype,
lock_flav,
false, /* blocking_lock */
- &status,
blocking_pid,
blocking_smblctx);
- if (br_lck == NULL) {
- return status;
- }
- TALLOC_FREE(br_lck);
-
if (!NT_STATUS_IS_OK(status)) {
break;
}