2 Unix SMB/CIFS implementation.
4 Copyright (C) Andrew Tridgell 1992-2000
5 Copyright (C) Jeremy Allison 1992-2006
6 Copyright (C) Volker Lendecke 2005
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3 of the License, or
11 (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program. If not, see <http://www.gnu.org/licenses/>.
23 12 aug 96: Erik.Devriendt@te6.siemens.be
24 added support for shared memory implementation of share mode locking
26 May 1997. Jeremy Allison (jallison@whistle.com). Modified share mode
27 locking to deal with multiple share modes per open file.
29 September 1997. Jeremy Allison (jallison@whistle.com). Added oplock
32 rewritten completely to use new tdb code. Tridge, Dec '99
34 Added POSIX locking support. Jeremy Allison (jeremy@valinux.com), Apr. 2000.
35 Added Unix Extensions POSIX locking support. Jeremy Allison Mar 2006.
39 #include "system/filesys.h"
40 #include "lib/util/server_id.h"
41 #include "locking/proto.h"
42 #include "smbd/globals.h"
43 #include "dbwrap/dbwrap.h"
44 #include "dbwrap/dbwrap_open.h"
45 #include "../libcli/security/security.h"
49 #include "../librpc/gen_ndr/ndr_open_files.h"
50 #include "librpc/gen_ndr/ndr_file_id.h"
51 #include "locking/leases_db.h"
54 #define DBGC_CLASS DBGC_LOCKING
56 #define NO_LOCKING_COUNT (-1)
58 /****************************************************************************
60 ****************************************************************************/
62 const char *lock_type_name(enum brl_type lock_type)
74 const char *lock_flav_name(enum brl_flavour lock_flav)
76 return (lock_flav == WINDOWS_LOCK) ? "WINDOWS_LOCK" : "POSIX_LOCK";
79 /****************************************************************************
80 Utility function called to see if a file region is locked.
81 Called in the read/write codepath.
82 ****************************************************************************/
84 void init_strict_lock_struct(files_struct *fsp,
88 enum brl_type lock_type,
89 struct lock_struct *plock)
91 SMB_ASSERT(lock_type == READ_LOCK || lock_type == WRITE_LOCK);
93 plock->context.smblctx = smblctx;
94 plock->context.tid = fsp->conn->cnum;
95 plock->context.pid = messaging_server_id(fsp->conn->sconn->msg_ctx);
98 plock->fnum = fsp->fnum;
99 plock->lock_type = lock_type;
100 plock->lock_flav = lp_posix_cifsu_locktype(fsp);
103 bool strict_lock_check_default(files_struct *fsp, struct lock_struct *plock)
105 struct byte_range_lock *br_lck;
106 int strict_locking = lp_strict_locking(fsp->conn->params);
109 if (plock->size == 0) {
113 if (!lp_locking(fsp->conn->params) || !strict_locking) {
117 if (strict_locking == Auto) {
118 uint32_t lease_type = fsp_lease_type(fsp);
120 if ((lease_type & SMB2_LEASE_READ) &&
121 (plock->lock_type == READ_LOCK))
123 DBG_DEBUG("optimisation - read lease on file %s\n",
128 if ((lease_type & SMB2_LEASE_WRITE) &&
129 (plock->lock_type == WRITE_LOCK))
131 DBG_DEBUG("optimisation - write lease on file %s\n",
137 br_lck = brl_get_locks_readonly(fsp);
141 ret = brl_locktest(br_lck, plock);
145 * We got a lock conflict. Retry with rw locks to enable
146 * autocleanup. This is the slow path anyway.
148 br_lck = brl_get_locks(talloc_tos(), fsp);
149 if (br_lck == NULL) {
152 ret = brl_locktest(br_lck, plock);
156 DEBUG(10, ("strict_lock_default: flavour = %s brl start=%ju "
157 "len=%ju %s for fnum %ju file %s\n",
158 lock_flav_name(plock->lock_flav),
159 (uintmax_t)plock->start, (uintmax_t)plock->size,
160 ret ? "unlocked" : "locked",
161 (uintmax_t)plock->fnum, fsp_str_dbg(fsp)));
166 /****************************************************************************
167 Find out if a lock could be granted - return who is blocking us if we can't.
168 ****************************************************************************/
170 NTSTATUS query_lock(files_struct *fsp,
174 enum brl_type *plock_type,
175 enum brl_flavour lock_flav)
177 struct byte_range_lock *br_lck = NULL;
179 if (!fsp->can_lock) {
180 return fsp->is_directory ? NT_STATUS_INVALID_DEVICE_REQUEST : NT_STATUS_INVALID_HANDLE;
183 if (!lp_locking(fsp->conn->params)) {
187 br_lck = brl_get_locks_readonly(fsp);
189 return NT_STATUS_NO_MEMORY;
192 return brl_lockquery(br_lck,
194 messaging_server_id(fsp->conn->sconn->msg_ctx),
201 static void increment_current_lock_count(files_struct *fsp,
202 enum brl_flavour lock_flav)
204 if (lock_flav == WINDOWS_LOCK &&
205 fsp->current_lock_count != NO_LOCKING_COUNT) {
206 /* blocking ie. pending, locks also count here,
207 * as this is an efficiency counter to avoid checking
208 * the lock db. on close. JRA. */
210 fsp->current_lock_count++;
212 /* Notice that this has had a POSIX lock request.
213 * We can't count locks after this so forget them.
215 fsp->current_lock_count = NO_LOCKING_COUNT;
219 static void decrement_current_lock_count(files_struct *fsp,
220 enum brl_flavour lock_flav)
222 if (lock_flav == WINDOWS_LOCK &&
223 fsp->current_lock_count != NO_LOCKING_COUNT) {
224 SMB_ASSERT(fsp->current_lock_count > 0);
225 fsp->current_lock_count--;
229 /****************************************************************************
230 Utility function called by locking requests.
231 ****************************************************************************/
233 struct byte_range_lock *do_lock(struct messaging_context *msg_ctx,
238 enum brl_type lock_type,
239 enum brl_flavour lock_flav,
242 struct server_id *pblocker_pid,
245 struct byte_range_lock *br_lck = NULL;
246 struct server_id blocker_pid = { 0 };
247 uint64_t blocker_smblctx = 0;
249 /* silently return ok on print files as we don't do locking there */
250 if (fsp->print_file) {
251 *perr = NT_STATUS_OK;
255 if (!fsp->can_lock) {
256 *perr = fsp->is_directory ? NT_STATUS_INVALID_DEVICE_REQUEST : NT_STATUS_INVALID_HANDLE;
260 if (!lp_locking(fsp->conn->params)) {
261 *perr = NT_STATUS_OK;
265 /* NOTE! 0 byte long ranges ARE allowed and should be stored */
267 DBG_DEBUG("lock flavour %s lock type %s start=%"PRIu64" len=%"PRIu64" "
268 "blocking_lock=%s requested for %s file %s\n",
269 lock_flav_name(lock_flav),
270 lock_type_name(lock_type),
273 blocking_lock ? "true" : "false",
277 br_lck = brl_get_locks(talloc_tos(), fsp);
279 *perr = NT_STATUS_NO_MEMORY;
283 *perr = brl_lock(msg_ctx,
286 messaging_server_id(fsp->conn->sconn->msg_ctx),
295 if (psmblctx != NULL) {
296 *psmblctx = blocker_smblctx;
298 if (pblocker_pid != NULL) {
299 *pblocker_pid = blocker_pid;
302 DEBUG(10, ("do_lock: returning status=%s\n", nt_errstr(*perr)));
304 increment_current_lock_count(fsp, lock_flav);
308 /****************************************************************************
309 Utility function called by unlocking requests.
310 ****************************************************************************/
312 NTSTATUS do_unlock(struct messaging_context *msg_ctx,
317 enum brl_flavour lock_flav)
320 struct byte_range_lock *br_lck = NULL;
322 if (!fsp->can_lock) {
323 return fsp->is_directory ? NT_STATUS_INVALID_DEVICE_REQUEST : NT_STATUS_INVALID_HANDLE;
326 if (!lp_locking(fsp->conn->params)) {
330 DBG_DEBUG("unlock start=%"PRIu64" len=%"PRIu64" requested for %s file "
337 br_lck = brl_get_locks(talloc_tos(), fsp);
339 return NT_STATUS_NO_MEMORY;
342 ok = brl_unlock(msg_ctx,
345 messaging_server_id(fsp->conn->sconn->msg_ctx),
353 DEBUG(10,("do_unlock: returning ERRlock.\n" ));
354 return NT_STATUS_RANGE_NOT_LOCKED;
357 decrement_current_lock_count(fsp, lock_flav);
361 /****************************************************************************
362 Remove any locks on this fd. Called from file_close().
363 ****************************************************************************/
365 void locking_close_file(struct messaging_context *msg_ctx,
367 enum file_close_type close_type)
369 struct byte_range_lock *br_lck;
371 if (!lp_locking(fsp->conn->params)) {
375 /* If we have no outstanding locks or pending
376 * locks then we don't need to look in the lock db.
379 if (fsp->current_lock_count == 0) {
383 br_lck = brl_get_locks(talloc_tos(),fsp);
387 * Unlocks must trigger dbwrap_watch watchers,
388 * normally in smbd_do_unlocking. Here it's done
389 * implictly, we're closing the file and thus remove a
390 * share mode. This will wake the waiters.
392 brl_close_fnum(msg_ctx, br_lck);
397 /*******************************************************************
398 Print out a share mode.
399 ********************************************************************/
401 char *share_mode_str(TALLOC_CTX *ctx, int num,
402 const struct file_id *id,
403 const struct share_mode_entry *e)
405 struct server_id_buf tmp;
407 return talloc_asprintf(ctx, "share_mode_entry[%d]: "
408 "pid = %s, share_access = 0x%x, private_options = 0x%x, "
409 "access_mask = 0x%x, mid = 0x%llx, type= 0x%x, gen_id = %llu, "
410 "uid = %u, flags = %u, file_id %s, name_hash = 0x%x",
412 server_id_str_buf(e->pid, &tmp),
413 e->share_access, e->private_options,
414 e->access_mask, (unsigned long long)e->op_mid,
415 e->op_type, (unsigned long long)e->share_file_id,
416 (unsigned int)e->uid, (unsigned int)e->flags,
417 file_id_string_tos(id),
418 (unsigned int)e->name_hash);
421 /*******************************************************************
422 Fetch a share mode where we know one MUST exist. This call reference
423 counts it internally to allow for nested lock fetches.
424 ********************************************************************/
426 struct share_mode_lock *get_existing_share_mode_lock(TALLOC_CTX *mem_ctx,
427 const struct file_id id)
429 return get_share_mode_lock(mem_ctx, id, NULL, NULL, NULL);
432 static bool rename_lease_fn(struct share_mode_lock *lck,
433 struct share_mode_entry *e,
436 struct share_mode_data *d = lck->data;
439 status = leases_db_rename(&e->client_guid,
446 if (!NT_STATUS_IS_OK(status)) {
447 /* Any error recovery possible here ? */
448 DBG_WARNING("Failed to rename lease key for "
449 "renamed file %s:%s. %s\n",
458 /*******************************************************************
459 Sets the service name and filename for rename.
460 At this point we emit "file renamed" messages to all
461 process id's that have this file open.
462 Based on an initial code idea from SATOH Fumiyasu <fumiya@samba.gr.jp>
463 ********************************************************************/
465 bool rename_share_filename(struct messaging_context *msg_ctx,
466 struct share_mode_lock *lck,
468 const char *servicepath,
469 uint32_t orig_name_hash,
470 uint32_t new_name_hash,
471 const struct smb_filename *smb_fname_dst)
473 struct share_mode_data *d = lck->data;
474 struct file_rename_message msg = {
476 .servicepath = servicepath,
477 .base_name = smb_fname_dst->base_name,
478 .stream_name = smb_fname_dst->stream_name,
481 struct server_id self_pid = messaging_server_id(msg_ctx);
484 DEBUG(10, ("rename_share_filename: servicepath %s newname %s\n",
485 servicepath, smb_fname_dst->base_name));
488 * rename_internal_fsp() and rename_internals() add './' to
489 * head of newname if newname does not contain a '/'.
492 if (strncmp(msg.base_name, "./", 2) == 0) {
496 d->servicepath = talloc_strdup(d, msg.servicepath);
497 d->base_name = talloc_strdup(d, msg.base_name);
498 d->stream_name = talloc_strdup(d, msg.stream_name);
499 if ((d->servicepath == NULL) ||
500 (d->base_name == NULL) ||
501 ((msg.stream_name != NULL) && (d->stream_name == NULL))) {
502 DBG_WARNING("talloc failed\n");
507 /* Send the messages. */
508 for (i=0; i<d->num_share_modes; i++) {
509 struct share_mode_entry *se = &d->share_modes[i];
511 enum ndr_err_code ndr_err;
513 if (!is_valid_share_mode_entry(se)) {
517 /* If this is a hardlink to the inode
518 with a different name, skip this. */
519 if (se->name_hash != orig_name_hash) {
523 se->name_hash = new_name_hash;
525 /* But not to ourselves... */
526 if (serverid_equal(&se->pid, &self_pid)) {
530 if (share_mode_stale_pid(d, i)) {
534 msg.share_file_id = se->share_file_id;
536 ndr_err = ndr_push_struct_blob(
540 (ndr_push_flags_fn_t)ndr_push_file_rename_message);
541 if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
542 DBG_DEBUG("ndr_push_file_rename_message failed: %s\n",
543 ndr_errstr(ndr_err));
546 if (DEBUGLEVEL >= 10) {
547 struct server_id_buf tmp;
548 DBG_DEBUG("sending rename message to %s\n",
549 server_id_str_buf(se->pid, &tmp));
550 NDR_PRINT_DEBUG(file_rename_message, &msg);
553 messaging_send(msg_ctx, se->pid, MSG_SMB_FILE_RENAME, &blob);
555 TALLOC_FREE(blob.data);
558 ok = share_mode_forall_leases(lck, rename_lease_fn, NULL);
561 * Ignore error here. Not sure what to do..
563 DBG_WARNING("share_mode_forall_leases failed\n");
569 void get_file_infos(struct file_id id,
571 bool *delete_on_close,
572 struct timespec *write_time)
574 struct share_mode_lock *lck;
576 if (delete_on_close) {
577 *delete_on_close = false;
581 ZERO_STRUCTP(write_time);
584 if (!(lck = fetch_share_mode_unlocked(talloc_tos(), id))) {
588 if (delete_on_close) {
589 *delete_on_close = is_delete_on_close_set(lck, name_hash);
593 *write_time = get_share_mode_write_time(lck);
599 bool is_valid_share_mode_entry(const struct share_mode_entry *e)
607 num_props += ((e->op_type == NO_OPLOCK) ? 1 : 0);
608 num_props += (EXCLUSIVE_OPLOCK_TYPE(e->op_type) ? 1 : 0);
609 num_props += (LEVEL_II_OPLOCK_TYPE(e->op_type) ? 1 : 0);
610 num_props += (e->op_type == LEASE_OPLOCK);
612 if ((num_props > 1) && serverid_exists(&e->pid)) {
613 smb_panic("Invalid share mode entry");
615 return (num_props != 0);
619 * See if we need to remove a lease being referred to by a
620 * share mode that is being marked stale or deleted.
623 static void remove_share_mode_lease(struct share_mode_data *d,
624 struct share_mode_entry *e)
629 op_type = e->op_type;
630 e->op_type = NO_OPLOCK;
634 if (op_type != LEASE_OPLOCK) {
639 * This used to reference a lease. If there's no other one referencing
643 for (i=0; i<d->num_share_modes; i++) {
644 struct share_mode_entry *e2 = &d->share_modes[i];
653 if (smb2_lease_equal(&e->client_guid,
660 if (i < d->num_share_modes) {
670 status = leases_db_del(&e->client_guid,
674 DEBUG(10, ("%s: leases_db_del returned %s\n", __func__,
680 * In case d->share_modes[i] conflicts with something or otherwise is
681 * being used, we need to make sure the corresponding process still
684 bool share_mode_stale_pid(struct share_mode_data *d, uint32_t idx)
686 struct server_id_buf tmp;
687 struct share_mode_entry *e;
689 if (idx > d->num_share_modes) {
690 DBG_WARNING("Asking for index %"PRIu32", "
691 "only %"PRIu32" around\n",
696 e = &d->share_modes[idx];
703 if (serverid_exists(&e->pid)) {
704 DBG_DEBUG("PID %s (index %"PRIu32" out of %"PRIu32") "
706 server_id_str_buf(e->pid, &tmp),
711 DBG_DEBUG("PID %s (index %"PRIu32" out of %"PRIu32") "
712 "does not exist anymore\n",
713 server_id_str_buf(e->pid, &tmp),
719 if (d->num_delete_tokens != 0) {
722 for (i=0; i<d->num_share_modes; i++) {
723 bool valid = !d->share_modes[i].stale;
729 if (i == d->num_share_modes) {
731 * No valid (non-stale) share mode found, all
732 * who might have set the delete token are
735 TALLOC_FREE(d->delete_tokens);
736 d->num_delete_tokens = 0;
740 remove_share_mode_lease(d, e);
746 void remove_stale_share_mode_entries(struct share_mode_data *d)
751 while (i < d->num_share_modes) {
752 if (d->share_modes[i].stale) {
753 struct share_mode_entry *m = d->share_modes;
754 m[i] = m[d->num_share_modes-1];
755 d->num_share_modes -= 1;
762 bool set_share_mode(struct share_mode_lock *lck,
763 struct files_struct *fsp,
767 const struct GUID *client_guid,
768 const struct smb2_lease_key *lease_key)
770 struct share_mode_data *d = lck->data;
771 struct share_mode_entry *tmp, *e;
773 tmp = talloc_realloc(d, d->share_modes, struct share_mode_entry,
774 d->num_share_modes+1);
778 d->share_modes = tmp;
779 e = &d->share_modes[d->num_share_modes];
780 d->num_share_modes += 1;
784 e->pid = messaging_server_id(fsp->conn->sconn->msg_ctx);
785 e->share_access = fsp->share_access;
786 e->private_options = fsp->fh->private_options;
787 e->access_mask = fsp->access_mask;
789 e->op_type = op_type;
791 if (op_type == LEASE_OPLOCK) {
792 e->client_guid = *client_guid;
793 e->lease_key = *lease_key;
796 e->time.tv_sec = fsp->open_time.tv_sec;
797 e->time.tv_usec = fsp->open_time.tv_usec;
798 e->share_file_id = fsp->fh->gen_id;
799 e->uid = (uint32_t)uid;
800 e->flags = (fsp->posix_flags & FSP_POSIX_FLAGS_OPEN) ?
801 SHARE_MODE_FLAG_POSIX_OPEN : 0;
802 e->name_hash = fsp->name_hash;
807 struct share_mode_entry *find_share_mode_entry(
808 struct share_mode_lock *lck, files_struct *fsp)
810 struct share_mode_data *d = lck->data;
811 struct server_id pid;
814 pid = messaging_server_id(fsp->conn->sconn->msg_ctx);
816 for (i=0; i<d->num_share_modes; i++) {
817 struct share_mode_entry *e = &d->share_modes[i];
819 if (!is_valid_share_mode_entry(e)) {
822 if (!serverid_equal(&pid, &e->pid)) {
825 if (fsp->fh->gen_id != e->share_file_id) {
833 /*******************************************************************
834 Del the share mode of a file for this process.
835 ********************************************************************/
837 bool del_share_mode(struct share_mode_lock *lck, files_struct *fsp)
839 struct share_mode_entry *e;
841 e = find_share_mode_entry(lck, fsp);
845 remove_share_mode_lease(lck->data, e);
846 *e = lck->data->share_modes[lck->data->num_share_modes-1];
847 lck->data->num_share_modes -= 1;
848 lck->data->modified = True;
852 bool mark_share_mode_disconnected(struct share_mode_lock *lck,
853 struct files_struct *fsp)
855 struct share_mode_entry *e;
857 if (lck->data->num_share_modes != 1) {
861 if (fsp->op == NULL) {
864 if (!fsp->op->global->durable) {
868 e = find_share_mode_entry(lck, fsp);
873 DEBUG(10, ("Marking share mode entry disconnected for durable handle\n"));
875 server_id_set_disconnected(&e->pid);
878 * On reopen the caller needs to check that
879 * the client comes with the correct handle.
881 e->share_file_id = fsp->op->global->open_persistent_id;
883 lck->data->modified = true;
887 /*******************************************************************
888 Remove an oplock mid and mode entry from a share mode.
889 ********************************************************************/
891 bool remove_share_oplock(struct share_mode_lock *lck, files_struct *fsp)
893 struct share_mode_data *d = lck->data;
894 struct share_mode_entry *e;
896 e = find_share_mode_entry(lck, fsp);
901 remove_share_mode_lease(d, e);
906 /*******************************************************************
907 Downgrade a oplock type from exclusive to level II.
908 ********************************************************************/
910 bool downgrade_share_oplock(struct share_mode_lock *lck, files_struct *fsp)
912 struct share_mode_entry *e;
914 e = find_share_mode_entry(lck, fsp);
919 e->op_type = LEVEL_II_OPLOCK;
920 lck->data->modified = True;
924 /****************************************************************************
925 Adds a delete on close token.
926 ****************************************************************************/
928 static bool add_delete_on_close_token(struct share_mode_data *d,
930 const struct security_token *nt_tok,
931 const struct security_unix_token *tok)
933 struct delete_token *tmp, *dtl;
935 tmp = talloc_realloc(d, d->delete_tokens, struct delete_token,
936 d->num_delete_tokens+1);
940 d->delete_tokens = tmp;
941 dtl = &d->delete_tokens[d->num_delete_tokens];
943 dtl->name_hash = name_hash;
944 dtl->delete_nt_token = dup_nt_token(d->delete_tokens, nt_tok);
945 if (dtl->delete_nt_token == NULL) {
948 dtl->delete_token = copy_unix_token(d->delete_tokens, tok);
949 if (dtl->delete_token == NULL) {
952 d->num_delete_tokens += 1;
957 void reset_delete_on_close_lck(files_struct *fsp,
958 struct share_mode_lock *lck)
960 struct share_mode_data *d = lck->data;
963 for (i=0; i<d->num_delete_tokens; i++) {
964 struct delete_token *dt = &d->delete_tokens[i];
966 if (dt->name_hash == fsp->name_hash) {
969 /* Delete this entry. */
970 TALLOC_FREE(dt->delete_nt_token);
971 TALLOC_FREE(dt->delete_token);
972 *dt = d->delete_tokens[d->num_delete_tokens-1];
973 d->num_delete_tokens -= 1;
978 /****************************************************************************
979 Sets the delete on close flag over all share modes on this file.
980 Modify the share mode entry for all files open
981 on this device and inode to tell other smbds we have
982 changed the delete on close flag. This will be noticed
983 in the close code, the last closer will delete the file
985 This makes a copy of any struct security_unix_token into the
986 lck entry. This function is used when the lock is already granted.
987 ****************************************************************************/
989 void set_delete_on_close_lck(files_struct *fsp,
990 struct share_mode_lock *lck,
991 const struct security_token *nt_tok,
992 const struct security_unix_token *tok)
994 struct messaging_context *msg_ctx = fsp->conn->sconn->msg_ctx;
995 struct share_mode_data *d = lck->data;
998 DATA_BLOB fid_blob = {};
999 enum ndr_err_code ndr_err;
1001 SMB_ASSERT(nt_tok != NULL);
1002 SMB_ASSERT(tok != NULL);
1004 for (i=0; i<d->num_delete_tokens; i++) {
1005 struct delete_token *dt = &d->delete_tokens[i];
1006 if (dt->name_hash == fsp->name_hash) {
1009 /* Replace this token with the given tok. */
1010 TALLOC_FREE(dt->delete_nt_token);
1011 dt->delete_nt_token = dup_nt_token(dt, nt_tok);
1012 SMB_ASSERT(dt->delete_nt_token != NULL);
1013 TALLOC_FREE(dt->delete_token);
1014 dt->delete_token = copy_unix_token(dt, tok);
1015 SMB_ASSERT(dt->delete_token != NULL);
1021 ret = add_delete_on_close_token(lck->data, fsp->name_hash, nt_tok, tok);
1024 ndr_err = ndr_push_struct_blob(&fid_blob, talloc_tos(), &fsp->file_id,
1025 (ndr_push_flags_fn_t)ndr_push_file_id);
1026 if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
1027 DEBUG(10, ("ndr_push_file_id failed: %s\n",
1028 ndr_errstr(ndr_err)));
1031 for (i=0; i<d->num_share_modes; i++) {
1032 struct share_mode_entry *e = &d->share_modes[i];
1035 status = messaging_send(
1036 msg_ctx, e->pid, MSG_SMB_NOTIFY_CANCEL_DELETED,
1039 if (!NT_STATUS_IS_OK(status)) {
1040 struct server_id_buf tmp;
1041 DEBUG(10, ("%s: messaging_send to %s returned %s\n",
1042 __func__, server_id_str_buf(e->pid, &tmp),
1043 nt_errstr(status)));
1047 TALLOC_FREE(fid_blob.data);
1050 bool set_delete_on_close(files_struct *fsp, bool delete_on_close,
1051 const struct security_token *nt_tok,
1052 const struct security_unix_token *tok)
1054 struct share_mode_lock *lck;
1056 DEBUG(10,("set_delete_on_close: %s delete on close flag for "
1058 delete_on_close ? "Adding" : "Removing", fsp_fnum_dbg(fsp),
1061 lck = get_existing_share_mode_lock(talloc_tos(), fsp->file_id);
1066 if (delete_on_close) {
1067 set_delete_on_close_lck(fsp, lck, nt_tok, tok);
1069 reset_delete_on_close_lck(fsp, lck);
1072 if (fsp->is_directory) {
1073 SMB_ASSERT(!is_ntfs_stream_smb_fname(fsp->fsp_name));
1074 send_stat_cache_delete_message(fsp->conn->sconn->msg_ctx,
1075 fsp->fsp_name->base_name);
1080 fsp->delete_on_close = delete_on_close;
1085 static struct delete_token *find_delete_on_close_token(
1086 struct share_mode_data *d, uint32_t name_hash)
1090 DEBUG(10, ("find_delete_on_close_token: name_hash = 0x%x\n",
1091 (unsigned int)name_hash));
1093 for (i=0; i<d->num_delete_tokens; i++) {
1094 struct delete_token *dt = &d->delete_tokens[i];
1096 DEBUG(10, ("find__delete_on_close_token: dt->name_hash = 0x%x\n",
1097 (unsigned int)dt->name_hash ));
1098 if (dt->name_hash == name_hash) {
1105 /****************************************************************************
1106 Return the NT token and UNIX token if there's a match. Return true if
1107 found, false if not.
1108 ****************************************************************************/
1110 bool get_delete_on_close_token(struct share_mode_lock *lck,
1112 const struct security_token **pp_nt_tok,
1113 const struct security_unix_token **pp_tok)
1115 struct delete_token *dt;
1117 dt = find_delete_on_close_token(lck->data, name_hash);
1121 *pp_nt_tok = dt->delete_nt_token;
1122 *pp_tok = dt->delete_token;
1126 bool is_delete_on_close_set(struct share_mode_lock *lck, uint32_t name_hash)
1128 return find_delete_on_close_token(lck->data, name_hash) != NULL;
1131 bool set_sticky_write_time(struct file_id fileid, struct timespec write_time)
1133 struct share_mode_lock *lck;
1135 DEBUG(5,("set_sticky_write_time: %s id=%s\n",
1136 timestring(talloc_tos(),
1137 convert_timespec_to_time_t(write_time)),
1138 file_id_string_tos(&fileid)));
1140 lck = get_existing_share_mode_lock(talloc_tos(), fileid);
1145 if (timespec_compare(&lck->data->changed_write_time, &write_time) != 0) {
1146 lck->data->modified = True;
1147 lck->data->changed_write_time = write_time;
1154 bool set_write_time(struct file_id fileid, struct timespec write_time)
1156 struct share_mode_lock *lck;
1158 DEBUG(5,("set_write_time: %s id=%s\n",
1159 timestring(talloc_tos(),
1160 convert_timespec_to_time_t(write_time)),
1161 file_id_string_tos(&fileid)));
1163 lck = get_existing_share_mode_lock(talloc_tos(), fileid);
1168 if (timespec_compare(&lck->data->old_write_time, &write_time) != 0) {
1169 lck->data->modified = True;
1170 lck->data->old_write_time = write_time;
1177 struct timespec get_share_mode_write_time(struct share_mode_lock *lck)
1179 struct share_mode_data *d = lck->data;
1181 if (!null_timespec(d->changed_write_time)) {
1182 return d->changed_write_time;
1184 return d->old_write_time;
1187 bool file_has_open_streams(files_struct *fsp)
1189 struct share_mode_lock *lock = NULL;
1190 struct share_mode_data *d = NULL;
1193 lock = get_existing_share_mode_lock(talloc_tos(), fsp->file_id);
1199 for (i = 0; i < d->num_share_modes; i++) {
1200 struct share_mode_entry *e = &d->share_modes[i];
1202 if (share_mode_stale_pid(d, i)) {
1206 if (e->private_options &
1207 NTCREATEX_OPTIONS_PRIVATE_STREAM_BASEOPEN)
1219 * Walk share mode entries, looking at every lease only once
1222 bool share_mode_forall_leases(
1223 struct share_mode_lock *lck,
1224 bool (*fn)(struct share_mode_lock *lck,
1225 struct share_mode_entry *e,
1226 void *private_data),
1229 struct share_mode_data *d = lck->data;
1230 uint32_t *leases = NULL;
1231 uint32_t num_leases = 0;
1234 leases = talloc_array(talloc_tos(), uint32_t, d->num_share_modes);
1235 if (leases == NULL) {
1239 for (i=0; i<d->num_share_modes; i++) {
1240 struct share_mode_entry *e = &d->share_modes[i];
1244 ok = is_valid_share_mode_entry(e);
1249 if (e->op_type != LEASE_OPLOCK) {
1254 * See if we have already seen "e"'s lease. This is
1255 * O(n^2). If we sort "leases", we can get this down
1259 for (j=0; j<num_leases; j++) {
1260 uint32_t idx = leases[j];
1261 struct share_mode_entry *l = &d->share_modes[idx];
1263 if (smb2_lease_equal(&e->client_guid,
1270 if (j < num_leases) {
1272 * Don't look at "e"'s lease, we've already
1278 stop = fn(lck, e, private_data);
1280 TALLOC_FREE(leases);
1284 leases[num_leases] = i;
1288 TALLOC_FREE(leases);