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 "locking/proto.h"
41 #include "smbd/globals.h"
42 #include "dbwrap/dbwrap.h"
43 #include "dbwrap/dbwrap_open.h"
44 #include "../libcli/security/security.h"
48 #include "../librpc/gen_ndr/ndr_open_files.h"
51 #define DBGC_CLASS DBGC_LOCKING
53 #define NO_LOCKING_COUNT (-1)
55 /* the locking database handle */
56 static struct db_context *lock_db;
58 /****************************************************************************
60 ****************************************************************************/
62 const char *lock_type_name(enum brl_type lock_type)
69 case PENDING_READ_LOCK:
70 return "PENDING_READ";
71 case PENDING_WRITE_LOCK:
72 return "PENDING_WRITE";
78 const char *lock_flav_name(enum brl_flavour lock_flav)
80 return (lock_flav == WINDOWS_LOCK) ? "WINDOWS_LOCK" : "POSIX_LOCK";
83 /****************************************************************************
84 Utility function called to see if a file region is locked.
85 Called in the read/write codepath.
86 ****************************************************************************/
88 void init_strict_lock_struct(files_struct *fsp,
92 enum brl_type lock_type,
93 struct lock_struct *plock)
95 SMB_ASSERT(lock_type == READ_LOCK || lock_type == WRITE_LOCK);
97 plock->context.smblctx = smblctx;
98 plock->context.tid = fsp->conn->cnum;
99 plock->context.pid = messaging_server_id(fsp->conn->sconn->msg_ctx);
100 plock->start = start;
102 plock->fnum = fsp->fnum;
103 plock->lock_type = lock_type;
104 plock->lock_flav = lp_posix_cifsu_locktype(fsp);
107 bool strict_lock_default(files_struct *fsp, struct lock_struct *plock)
109 int strict_locking = lp_strict_locking(fsp->conn->params);
112 if (plock->size == 0) {
116 if (!lp_locking(fsp->conn->params) || !strict_locking) {
120 if (strict_locking == Auto) {
121 if (EXCLUSIVE_OPLOCK_TYPE(fsp->oplock_type) && (plock->lock_type == READ_LOCK || plock->lock_type == WRITE_LOCK)) {
122 DEBUG(10,("is_locked: optimisation - exclusive oplock on file %s\n", fsp_str_dbg(fsp)));
124 } else if ((fsp->oplock_type == LEVEL_II_OPLOCK) &&
125 (plock->lock_type == READ_LOCK)) {
126 DEBUG(10,("is_locked: optimisation - level II oplock on file %s\n", fsp_str_dbg(fsp)));
129 struct byte_range_lock *br_lck;
131 br_lck = brl_get_locks_readonly(fsp);
135 ret = brl_locktest(br_lck,
136 plock->context.smblctx,
144 struct byte_range_lock *br_lck;
146 br_lck = brl_get_locks_readonly(fsp);
150 ret = brl_locktest(br_lck,
151 plock->context.smblctx,
159 DEBUG(10,("strict_lock_default: flavour = %s brl start=%.0f "
160 "len=%.0f %s for fnum %d file %s\n",
161 lock_flav_name(plock->lock_flav),
162 (double)plock->start, (double)plock->size,
163 ret ? "unlocked" : "locked",
164 plock->fnum, fsp_str_dbg(fsp)));
169 void strict_unlock_default(files_struct *fsp, struct lock_struct *plock)
173 /****************************************************************************
174 Find out if a lock could be granted - return who is blocking us if we can't.
175 ****************************************************************************/
177 NTSTATUS query_lock(files_struct *fsp,
181 enum brl_type *plock_type,
182 enum brl_flavour lock_flav)
184 struct byte_range_lock *br_lck = NULL;
186 if (!fsp->can_lock) {
187 return fsp->is_directory ? NT_STATUS_INVALID_DEVICE_REQUEST : NT_STATUS_INVALID_HANDLE;
190 if (!lp_locking(fsp->conn->params)) {
194 br_lck = brl_get_locks_readonly(fsp);
196 return NT_STATUS_NO_MEMORY;
199 return brl_lockquery(br_lck,
201 messaging_server_id(fsp->conn->sconn->msg_ctx),
208 static void increment_current_lock_count(files_struct *fsp,
209 enum brl_flavour lock_flav)
211 if (lock_flav == WINDOWS_LOCK &&
212 fsp->current_lock_count != NO_LOCKING_COUNT) {
213 /* blocking ie. pending, locks also count here,
214 * as this is an efficiency counter to avoid checking
215 * the lock db. on close. JRA. */
217 fsp->current_lock_count++;
219 /* Notice that this has had a POSIX lock request.
220 * We can't count locks after this so forget them.
222 fsp->current_lock_count = NO_LOCKING_COUNT;
226 static void decrement_current_lock_count(files_struct *fsp,
227 enum brl_flavour lock_flav)
229 if (lock_flav == WINDOWS_LOCK &&
230 fsp->current_lock_count != NO_LOCKING_COUNT) {
231 SMB_ASSERT(fsp->current_lock_count > 0);
232 fsp->current_lock_count--;
236 /****************************************************************************
237 Utility function called by locking requests.
238 ****************************************************************************/
240 struct byte_range_lock *do_lock(struct messaging_context *msg_ctx,
245 enum brl_type lock_type,
246 enum brl_flavour lock_flav,
250 struct blocking_lock_record *blr)
252 struct byte_range_lock *br_lck = NULL;
254 /* silently return ok on print files as we don't do locking there */
255 if (fsp->print_file) {
256 *perr = NT_STATUS_OK;
260 if (!fsp->can_lock) {
261 *perr = fsp->is_directory ? NT_STATUS_INVALID_DEVICE_REQUEST : NT_STATUS_INVALID_HANDLE;
265 if (!lp_locking(fsp->conn->params)) {
266 *perr = NT_STATUS_OK;
270 /* NOTE! 0 byte long ranges ARE allowed and should be stored */
272 DEBUG(10,("do_lock: lock flavour %s lock type %s start=%.0f len=%.0f "
273 "blocking_lock=%s requested for fnum %d file %s\n",
274 lock_flav_name(lock_flav), lock_type_name(lock_type),
275 (double)offset, (double)count, blocking_lock ? "true" :
276 "false", fsp->fnum, fsp_str_dbg(fsp)));
278 br_lck = brl_get_locks(talloc_tos(), fsp);
280 *perr = NT_STATUS_NO_MEMORY;
284 *perr = brl_lock(msg_ctx,
287 messaging_server_id(fsp->conn->sconn->msg_ctx),
296 DEBUG(10, ("do_lock: returning status=%s\n", nt_errstr(*perr)));
298 increment_current_lock_count(fsp, lock_flav);
302 /****************************************************************************
303 Utility function called by unlocking requests.
304 ****************************************************************************/
306 NTSTATUS do_unlock(struct messaging_context *msg_ctx,
311 enum brl_flavour lock_flav)
314 struct byte_range_lock *br_lck = NULL;
316 if (!fsp->can_lock) {
317 return fsp->is_directory ? NT_STATUS_INVALID_DEVICE_REQUEST : NT_STATUS_INVALID_HANDLE;
320 if (!lp_locking(fsp->conn->params)) {
324 DEBUG(10,("do_unlock: unlock start=%.0f len=%.0f requested for fnum %d file %s\n",
325 (double)offset, (double)count, fsp->fnum,
328 br_lck = brl_get_locks(talloc_tos(), fsp);
330 return NT_STATUS_NO_MEMORY;
333 ok = brl_unlock(msg_ctx,
336 messaging_server_id(fsp->conn->sconn->msg_ctx),
344 DEBUG(10,("do_unlock: returning ERRlock.\n" ));
345 return NT_STATUS_RANGE_NOT_LOCKED;
348 decrement_current_lock_count(fsp, lock_flav);
352 /****************************************************************************
353 Cancel any pending blocked locks.
354 ****************************************************************************/
356 NTSTATUS do_lock_cancel(files_struct *fsp,
360 enum brl_flavour lock_flav,
361 struct blocking_lock_record *blr)
364 struct byte_range_lock *br_lck = NULL;
366 if (!fsp->can_lock) {
367 return fsp->is_directory ?
368 NT_STATUS_INVALID_DEVICE_REQUEST : NT_STATUS_INVALID_HANDLE;
371 if (!lp_locking(fsp->conn->params)) {
372 return NT_STATUS_DOS(ERRDOS, ERRcancelviolation);
375 DEBUG(10,("do_lock_cancel: cancel start=%.0f len=%.0f requested for fnum %d file %s\n",
376 (double)offset, (double)count, fsp->fnum,
379 br_lck = brl_get_locks(talloc_tos(), fsp);
381 return NT_STATUS_NO_MEMORY;
384 ok = brl_lock_cancel(br_lck,
386 messaging_server_id(fsp->conn->sconn->msg_ctx),
395 DEBUG(10,("do_lock_cancel: returning ERRcancelviolation.\n" ));
396 return NT_STATUS_DOS(ERRDOS, ERRcancelviolation);
399 decrement_current_lock_count(fsp, lock_flav);
403 /****************************************************************************
404 Remove any locks on this fd. Called from file_close().
405 ****************************************************************************/
407 void locking_close_file(struct messaging_context *msg_ctx,
409 enum file_close_type close_type)
411 struct byte_range_lock *br_lck;
413 if (!lp_locking(fsp->conn->params)) {
417 /* If we have not outstanding locks or pending
418 * locks then we don't need to look in the lock db.
421 if (fsp->current_lock_count == 0) {
425 br_lck = brl_get_locks(talloc_tos(),fsp);
428 cancel_pending_lock_requests_by_fid(fsp, br_lck, close_type);
429 brl_close_fnum(msg_ctx, br_lck);
434 /****************************************************************************
435 Initialise the locking functions.
436 ****************************************************************************/
438 static bool locking_init_internal(bool read_only)
445 lock_db = db_open(NULL, lock_path("locking.tdb"),
446 lp_open_files_db_hash_size(),
447 TDB_DEFAULT|TDB_VOLATILE|TDB_CLEAR_IF_FIRST|TDB_INCOMPATIBLE_HASH,
448 read_only?O_RDONLY:O_RDWR|O_CREAT, 0644);
451 DEBUG(0,("ERROR: Failed to initialise locking database\n"));
455 if (!posix_locking_init(read_only))
461 bool locking_init(void)
463 return locking_init_internal(false);
466 bool locking_init_readonly(void)
468 return locking_init_internal(true);
471 /*******************************************************************
472 Deinitialize the share_mode management.
473 ******************************************************************/
475 bool locking_end(void)
478 TALLOC_FREE(lock_db);
482 /*******************************************************************
483 Form a static locking key for a dev/inode pair.
484 ******************************************************************/
486 static TDB_DATA locking_key(const struct file_id *id, struct file_id *tmp)
489 return make_tdb_data((const uint8_t *)tmp, sizeof(*tmp));
492 /*******************************************************************
493 Print out a share mode.
494 ********************************************************************/
496 char *share_mode_str(TALLOC_CTX *ctx, int num, const struct share_mode_entry *e)
498 return talloc_asprintf(ctx, "share_mode_entry[%d]: "
499 "pid = %s, share_access = 0x%x, private_options = 0x%x, "
500 "access_mask = 0x%x, mid = 0x%llx, type= 0x%x, gen_id = %llu, "
501 "uid = %u, flags = %u, file_id %s, name_hash = 0x%x",
503 procid_str_static(&e->pid),
504 e->share_access, e->private_options,
505 e->access_mask, (unsigned long long)e->op_mid,
506 e->op_type, (unsigned long long)e->share_file_id,
507 (unsigned int)e->uid, (unsigned int)e->flags,
508 file_id_string_tos(&e->id),
509 (unsigned int)e->name_hash);
512 /*******************************************************************
513 Get all share mode entries for a dev/inode pair.
514 ********************************************************************/
516 static struct share_mode_lock *parse_share_modes(TALLOC_CTX *mem_ctx,
519 struct share_mode_lock *lck;
521 struct server_id *pids;
523 enum ndr_err_code ndr_err;
526 lck = talloc_zero(mem_ctx, struct share_mode_lock);
528 DEBUG(0, ("talloc failed\n"));
532 blob.data = dbuf.dptr;
533 blob.length = dbuf.dsize;
535 ndr_err = ndr_pull_struct_blob(
537 (ndr_pull_flags_fn_t)ndr_pull_share_mode_lock);
538 if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
539 DEBUG(1, ("ndr_pull_share_mode_lock failed\n"));
543 lck->modified = false;
546 if (DEBUGLEVEL >= 10) {
547 DEBUG(10, ("parse_share_modes:\n"));
548 NDR_PRINT_DEBUG(share_mode_lock, lck);
552 * Ensure that each entry has a real process attached.
555 pids = talloc_array(talloc_tos(), struct server_id,
556 lck->num_share_modes);
558 DEBUG(0, ("talloc failed\n"));
561 pid_exists = talloc_array(talloc_tos(), bool, lck->num_share_modes);
562 if (pid_exists == NULL) {
563 DEBUG(0, ("talloc failed\n"));
567 for (i=0; i<lck->num_share_modes; i++) {
568 pids[i] = lck->share_modes[i].pid;
570 if (!serverids_exist(pids, lck->num_share_modes, pid_exists)) {
571 DEBUG(0, ("serverid_exists failed\n"));
576 while (i < lck->num_share_modes) {
577 struct share_mode_entry *e = &lck->share_modes[i];
578 if (!pid_exists[i]) {
579 *e = lck->share_modes[lck->num_share_modes-1];
580 lck->num_share_modes -= 1;
581 lck->modified = True;
586 TALLOC_FREE(pid_exists);
594 static TDB_DATA unparse_share_modes(struct share_mode_lock *lck)
597 enum ndr_err_code ndr_err;
599 if (DEBUGLEVEL >= 10) {
600 DEBUG(10, ("unparse_share_modes:\n"));
601 NDR_PRINT_DEBUG(share_mode_lock, lck);
604 if (lck->num_share_modes == 0) {
605 DEBUG(10, ("No used share mode found\n"));
606 return make_tdb_data(NULL, 0);
609 ndr_err = ndr_push_struct_blob(
611 (ndr_push_flags_fn_t)ndr_push_share_mode_lock);
612 if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
613 smb_panic("ndr_push_share_mode_lock failed");
616 return make_tdb_data(blob.data, blob.length);
619 static int share_mode_lock_destructor(struct share_mode_lock *lck)
624 if (!lck->modified) {
628 data = unparse_share_modes(lck);
630 if (data.dptr == NULL) {
632 /* There has been an entry before, delete it */
634 status = dbwrap_record_delete(lck->record);
635 if (!NT_STATUS_IS_OK(status)) {
638 DEBUG(0, ("delete_rec returned %s\n",
641 if (asprintf(&errmsg, "could not delete share "
643 nt_errstr(status)) == -1) {
644 smb_panic("could not delete share"
653 status = dbwrap_record_store(lck->record, data, TDB_REPLACE);
654 if (!NT_STATUS_IS_OK(status)) {
657 DEBUG(0, ("store returned %s\n", nt_errstr(status)));
659 if (asprintf(&errmsg, "could not store share mode entry: %s",
660 nt_errstr(status)) == -1) {
661 smb_panic("could not store share mode entry");
671 static struct share_mode_lock *fresh_share_mode_lock(
672 TALLOC_CTX *mem_ctx, const char *servicepath,
673 const struct smb_filename *smb_fname,
674 const struct timespec *old_write_time)
676 struct share_mode_lock *lck;
678 if ((servicepath == NULL) || (smb_fname == NULL) ||
679 (old_write_time == NULL)) {
683 lck = talloc_zero(mem_ctx, struct share_mode_lock);
687 lck->base_name = talloc_strdup(lck, smb_fname->base_name);
688 if (lck->base_name == NULL) {
691 if (smb_fname->stream_name != NULL) {
692 lck->stream_name = talloc_strdup(lck, smb_fname->stream_name);
693 if (lck->stream_name == NULL) {
697 lck->servicepath = talloc_strdup(lck, servicepath);
698 if (lck->servicepath == NULL) {
701 lck->old_write_time = *old_write_time;
702 lck->modified = false;
706 DEBUG(0, ("talloc failed\n"));
711 struct share_mode_lock *get_share_mode_lock_fresh(TALLOC_CTX *mem_ctx,
712 const struct file_id id,
713 const char *servicepath,
714 const struct smb_filename *smb_fname,
715 const struct timespec *old_write_time)
717 struct share_mode_lock *lck;
719 struct db_record *rec;
720 TDB_DATA key = locking_key(&id, &tmp);
723 rec = dbwrap_fetch_locked(lock_db, mem_ctx, key);
725 DEBUG(3, ("Could not lock share entry\n"));
729 value = dbwrap_record_get_value(rec);
731 if (value.dptr == NULL) {
732 lck = fresh_share_mode_lock(mem_ctx, servicepath, smb_fname,
735 lck = parse_share_modes(mem_ctx, value);
739 DEBUG(1, ("Could not get share mode lock\n"));
744 lck->record = talloc_move(lck, &rec);
745 talloc_set_destructor(lck, share_mode_lock_destructor);
749 struct share_mode_lock *get_share_mode_lock(TALLOC_CTX *mem_ctx,
750 const struct file_id id)
752 return get_share_mode_lock_fresh(mem_ctx, id, NULL, NULL, NULL);
755 struct share_mode_lock *fetch_share_mode_unlocked(TALLOC_CTX *mem_ctx,
756 const struct file_id id)
758 struct share_mode_lock *lck;
760 TDB_DATA key = locking_key(&id, &tmp);
764 status = dbwrap_fetch(lock_db, talloc_tos(), key, &data);
765 if (!NT_STATUS_IS_OK(status)) {
766 DEBUG(3, ("Could not fetch share entry\n"));
769 if (data.dptr == NULL) {
772 lck = parse_share_modes(mem_ctx, data);
776 TALLOC_FREE(data.dptr);
780 /*******************************************************************
781 Sets the service name and filename for rename.
782 At this point we emit "file renamed" messages to all
783 process id's that have this file open.
784 Based on an initial code idea from SATOH Fumiyasu <fumiya@samba.gr.jp>
785 ********************************************************************/
787 bool rename_share_filename(struct messaging_context *msg_ctx,
788 struct share_mode_lock *lck,
789 const char *servicepath,
790 uint32_t orig_name_hash,
791 uint32_t new_name_hash,
792 const struct smb_filename *smb_fname_dst)
800 bool strip_two_chars = false;
801 bool has_stream = smb_fname_dst->stream_name != NULL;
803 DEBUG(10, ("rename_share_filename: servicepath %s newname %s\n",
804 servicepath, smb_fname_dst->base_name));
807 * rename_internal_fsp() and rename_internals() add './' to
808 * head of newname if newname does not contain a '/'.
810 if (smb_fname_dst->base_name[0] &&
811 smb_fname_dst->base_name[1] &&
812 smb_fname_dst->base_name[0] == '.' &&
813 smb_fname_dst->base_name[1] == '/') {
814 strip_two_chars = true;
817 lck->servicepath = talloc_strdup(lck, servicepath);
818 lck->base_name = talloc_strdup(lck, smb_fname_dst->base_name +
819 (strip_two_chars ? 2 : 0));
820 lck->stream_name = talloc_strdup(lck, smb_fname_dst->stream_name);
821 if (lck->base_name == NULL ||
822 (has_stream && lck->stream_name == NULL) ||
823 lck->servicepath == NULL) {
824 DEBUG(0, ("rename_share_filename: talloc failed\n"));
827 lck->modified = True;
829 sp_len = strlen(lck->servicepath);
830 bn_len = strlen(lck->base_name);
831 sn_len = has_stream ? strlen(lck->stream_name) : 0;
833 msg_len = MSG_FILE_RENAMED_MIN_SIZE + sp_len + 1 + bn_len + 1 +
836 /* Set up the name changed message. */
837 frm = talloc_array(lck, char, msg_len);
842 push_file_id_24(frm, &lck->id);
844 DEBUG(10,("rename_share_filename: msg_len = %u\n", (unsigned int)msg_len ));
847 lck->servicepath ? lck->servicepath : "",
849 strlcpy(&frm[24 + sp_len + 1],
850 lck->base_name ? lck->base_name : "",
852 strlcpy(&frm[24 + sp_len + 1 + bn_len + 1],
853 lck->stream_name ? lck->stream_name : "",
856 /* Send the messages. */
857 for (i=0; i<lck->num_share_modes; i++) {
858 struct share_mode_entry *se = &lck->share_modes[i];
859 if (!is_valid_share_mode_entry(se)) {
863 /* If this is a hardlink to the inode
864 with a different name, skip this. */
865 if (se->name_hash != orig_name_hash) {
869 se->name_hash = new_name_hash;
871 /* But not to ourselves... */
872 if (procid_is_me(&se->pid)) {
876 DEBUG(10,("rename_share_filename: sending rename message to "
877 "pid %s file_id %s sharepath %s base_name %s "
879 procid_str_static(&se->pid),
880 file_id_string_tos(&lck->id),
881 lck->servicepath, lck->base_name,
882 has_stream ? lck->stream_name : ""));
884 messaging_send_buf(msg_ctx, se->pid, MSG_SMB_FILE_RENAME,
885 (uint8 *)frm, msg_len);
891 void get_file_infos(struct file_id id,
893 bool *delete_on_close,
894 struct timespec *write_time)
896 struct share_mode_lock *lck;
898 if (delete_on_close) {
899 *delete_on_close = false;
903 ZERO_STRUCTP(write_time);
906 if (!(lck = fetch_share_mode_unlocked(talloc_tos(), id))) {
910 if (delete_on_close) {
911 *delete_on_close = is_delete_on_close_set(lck, name_hash);
917 wt = lck->changed_write_time;
918 if (null_timespec(wt)) {
919 wt = lck->old_write_time;
928 bool is_valid_share_mode_entry(const struct share_mode_entry *e)
932 num_props += ((e->op_type == NO_OPLOCK) ? 1 : 0);
933 num_props += (EXCLUSIVE_OPLOCK_TYPE(e->op_type) ? 1 : 0);
934 num_props += (LEVEL_II_OPLOCK_TYPE(e->op_type) ? 1 : 0);
936 SMB_ASSERT(num_props <= 1);
937 return (num_props != 0);
940 bool is_deferred_open_entry(const struct share_mode_entry *e)
942 return (e->op_type == DEFERRED_OPEN_ENTRY);
945 /*******************************************************************
946 Fill a share mode entry.
947 ********************************************************************/
949 static void fill_share_mode_entry(struct share_mode_entry *e,
951 uid_t uid, uint64_t mid, uint16 op_type)
954 e->pid = messaging_server_id(fsp->conn->sconn->msg_ctx);
955 e->share_access = fsp->share_access;
956 e->private_options = fsp->fh->private_options;
957 e->access_mask = fsp->access_mask;
959 e->op_type = op_type;
960 e->time.tv_sec = fsp->open_time.tv_sec;
961 e->time.tv_usec = fsp->open_time.tv_usec;
962 e->id = fsp->file_id;
963 e->share_file_id = fsp->fh->gen_id;
964 e->uid = (uint32)uid;
965 e->flags = fsp->posix_open ? SHARE_MODE_FLAG_POSIX_OPEN : 0;
966 e->name_hash = fsp->name_hash;
969 static void fill_deferred_open_entry(struct share_mode_entry *e,
970 const struct timeval request_time,
972 struct server_id pid,
978 e->op_type = DEFERRED_OPEN_ENTRY;
979 e->time.tv_sec = request_time.tv_sec;
980 e->time.tv_usec = request_time.tv_usec;
986 static void add_share_mode_entry(struct share_mode_lock *lck,
987 const struct share_mode_entry *entry)
989 ADD_TO_ARRAY(lck, struct share_mode_entry, *entry,
990 &lck->share_modes, &lck->num_share_modes);
991 lck->modified = True;
994 void set_share_mode(struct share_mode_lock *lck, files_struct *fsp,
995 uid_t uid, uint64_t mid, uint16 op_type)
997 struct share_mode_entry entry;
998 fill_share_mode_entry(&entry, fsp, uid, mid, op_type);
999 add_share_mode_entry(lck, &entry);
1002 void add_deferred_open(struct share_mode_lock *lck, uint64_t mid,
1003 struct timeval request_time,
1004 struct server_id pid, struct file_id id)
1006 struct share_mode_entry entry;
1007 fill_deferred_open_entry(&entry, request_time, id, pid, mid);
1008 add_share_mode_entry(lck, &entry);
1011 /*******************************************************************
1012 Check if two share mode entries are identical, ignoring oplock
1013 and mid info and desired_access. (Removed paranoia test - it's
1014 not automatically a logic error if they are identical. JRA.)
1015 ********************************************************************/
1017 static bool share_modes_identical(struct share_mode_entry *e1,
1018 struct share_mode_entry *e2)
1020 /* We used to check for e1->share_access == e2->share_access here
1021 as well as the other fields but 2 different DOS or FCB opens
1022 sharing the same share mode entry may validly differ in
1023 fsp->share_access field. */
1025 return (procid_equal(&e1->pid, &e2->pid) &&
1026 file_id_equal(&e1->id, &e2->id) &&
1027 e1->share_file_id == e2->share_file_id );
1030 static bool deferred_open_identical(struct share_mode_entry *e1,
1031 struct share_mode_entry *e2)
1033 return (procid_equal(&e1->pid, &e2->pid) &&
1034 (e1->op_mid == e2->op_mid) &&
1035 file_id_equal(&e1->id, &e2->id));
1038 static struct share_mode_entry *find_share_mode_entry(struct share_mode_lock *lck,
1039 struct share_mode_entry *entry)
1043 for (i=0; i<lck->num_share_modes; i++) {
1044 struct share_mode_entry *e = &lck->share_modes[i];
1045 if (is_valid_share_mode_entry(entry) &&
1046 is_valid_share_mode_entry(e) &&
1047 share_modes_identical(e, entry)) {
1050 if (is_deferred_open_entry(entry) &&
1051 is_deferred_open_entry(e) &&
1052 deferred_open_identical(e, entry)) {
1059 /*******************************************************************
1060 Del the share mode of a file for this process. Return the number of
1062 ********************************************************************/
1064 bool del_share_mode(struct share_mode_lock *lck, files_struct *fsp)
1066 struct share_mode_entry entry, *e;
1068 /* Don't care about the pid owner being correct here - just a search. */
1069 fill_share_mode_entry(&entry, fsp, (uid_t)-1, 0, NO_OPLOCK);
1071 e = find_share_mode_entry(lck, &entry);
1075 *e = lck->share_modes[lck->num_share_modes-1];
1076 lck->num_share_modes -= 1;
1077 lck->modified = True;
1081 void del_deferred_open_entry(struct share_mode_lock *lck, uint64_t mid,
1082 struct server_id pid)
1084 struct share_mode_entry entry, *e;
1086 fill_deferred_open_entry(&entry, timeval_zero(),
1089 e = find_share_mode_entry(lck, &entry);
1093 *e = lck->share_modes[lck->num_share_modes-1];
1094 lck->num_share_modes -= 1;
1095 lck->modified = True;
1098 /*******************************************************************
1099 Remove an oplock mid and mode entry from a share mode.
1100 ********************************************************************/
1102 bool remove_share_oplock(struct share_mode_lock *lck, files_struct *fsp)
1104 struct share_mode_entry entry, *e;
1106 /* Don't care about the pid owner being correct here - just a search. */
1107 fill_share_mode_entry(&entry, fsp, (uid_t)-1, 0, NO_OPLOCK);
1109 e = find_share_mode_entry(lck, &entry);
1114 if (EXCLUSIVE_OPLOCK_TYPE(e->op_type)) {
1116 * Going from exclusive or batch,
1117 * we always go through FAKE_LEVEL_II
1120 if (!EXCLUSIVE_OPLOCK_TYPE(fsp->oplock_type)) {
1121 smb_panic("remove_share_oplock: logic error");
1123 e->op_type = FAKE_LEVEL_II_OPLOCK;
1125 e->op_type = NO_OPLOCK;
1127 lck->modified = True;
1131 /*******************************************************************
1132 Downgrade a oplock type from exclusive to level II.
1133 ********************************************************************/
1135 bool downgrade_share_oplock(struct share_mode_lock *lck, files_struct *fsp)
1137 struct share_mode_entry entry, *e;
1139 /* Don't care about the pid owner being correct here - just a search. */
1140 fill_share_mode_entry(&entry, fsp, (uid_t)-1, 0, NO_OPLOCK);
1142 e = find_share_mode_entry(lck, &entry);
1147 e->op_type = LEVEL_II_OPLOCK;
1148 lck->modified = True;
1152 /*************************************************************************
1153 Return a talloced copy of a struct security_unix_token. NULL on fail.
1154 (Should this be in locking.c.... ?).
1155 *************************************************************************/
1157 static struct security_unix_token *copy_unix_token(TALLOC_CTX *ctx, const struct security_unix_token *tok)
1159 struct security_unix_token *cpy;
1161 cpy = talloc(ctx, struct security_unix_token);
1166 cpy->uid = tok->uid;
1167 cpy->gid = tok->gid;
1168 cpy->ngroups = tok->ngroups;
1170 /* Make this a talloc child of cpy. */
1171 cpy->groups = (gid_t *)talloc_memdup(
1172 cpy, tok->groups, tok->ngroups * sizeof(gid_t));
1181 /****************************************************************************
1182 Adds a delete on close token.
1183 ****************************************************************************/
1185 static bool add_delete_on_close_token(struct share_mode_lock *lck,
1187 const struct security_unix_token *tok)
1189 struct delete_token *tmp, *dtl;
1191 tmp = talloc_realloc(lck, lck->delete_tokens, struct delete_token,
1192 lck->num_delete_tokens+1);
1196 lck->delete_tokens = tmp;
1197 dtl = &lck->delete_tokens[lck->num_delete_tokens];
1199 dtl->name_hash = name_hash;
1200 dtl->delete_token = copy_unix_token(lck->delete_tokens, tok);
1201 if (dtl->delete_token == NULL) {
1204 lck->num_delete_tokens += 1;
1205 lck->modified = true;
1209 /****************************************************************************
1210 Sets the delete on close flag over all share modes on this file.
1211 Modify the share mode entry for all files open
1212 on this device and inode to tell other smbds we have
1213 changed the delete on close flag. This will be noticed
1214 in the close code, the last closer will delete the file
1216 This makes a copy of any struct security_unix_token into the
1217 lck entry. This function is used when the lock is already granted.
1218 ****************************************************************************/
1220 void set_delete_on_close_lck(files_struct *fsp,
1221 struct share_mode_lock *lck,
1222 bool delete_on_close,
1223 const struct security_unix_token *tok)
1228 if (delete_on_close) {
1229 SMB_ASSERT(tok != NULL);
1231 SMB_ASSERT(tok == NULL);
1234 for (i=0; i<lck->num_delete_tokens; i++) {
1235 struct delete_token *dt = &lck->delete_tokens[i];
1236 if (dt->name_hash == fsp->name_hash) {
1237 lck->modified = true;
1238 if (delete_on_close == false) {
1239 /* Delete this entry. */
1240 TALLOC_FREE(dt->delete_token);
1241 *dt = lck->delete_tokens[
1242 lck->num_delete_tokens-1];
1243 lck->num_delete_tokens -= 1;
1246 /* Replace this token with the
1248 TALLOC_FREE(dt->delete_token);
1249 dt->delete_token = copy_unix_token(dt, tok);
1250 SMB_ASSERT(dt->delete_token != NULL);
1254 if (!delete_on_close) {
1255 /* Nothing to delete - not found. */
1259 ret = add_delete_on_close_token(lck, fsp->name_hash, tok);
1263 bool set_delete_on_close(files_struct *fsp, bool delete_on_close, const struct security_unix_token *tok)
1265 struct share_mode_lock *lck;
1267 DEBUG(10,("set_delete_on_close: %s delete on close flag for "
1268 "fnum = %d, file %s\n",
1269 delete_on_close ? "Adding" : "Removing", fsp->fnum,
1272 lck = get_share_mode_lock(talloc_tos(), fsp->file_id);
1277 set_delete_on_close_lck(fsp, lck, delete_on_close,
1278 delete_on_close ? tok : NULL);
1280 if (fsp->is_directory) {
1281 SMB_ASSERT(!is_ntfs_stream_smb_fname(fsp->fsp_name));
1282 send_stat_cache_delete_message(fsp->conn->sconn->msg_ctx,
1283 fsp->fsp_name->base_name);
1288 fsp->delete_on_close = delete_on_close;
1293 const struct security_unix_token *get_delete_on_close_token(struct share_mode_lock *lck, uint32_t name_hash)
1297 DEBUG(10,("get_delete_on_close_token: name_hash = 0x%x\n",
1298 (unsigned int)name_hash ));
1300 for (i=0; i<lck->num_delete_tokens; i++) {
1301 struct delete_token *dt = &lck->delete_tokens[i];
1302 DEBUG(10,("get_delete_on_close_token: dtl->name_hash = 0x%x\n",
1303 (unsigned int)dt->name_hash ));
1304 if (dt->name_hash == name_hash) {
1305 return dt->delete_token;
1311 bool is_delete_on_close_set(struct share_mode_lock *lck, uint32_t name_hash)
1313 return (get_delete_on_close_token(lck, name_hash) != NULL);
1316 bool set_sticky_write_time(struct file_id fileid, struct timespec write_time)
1318 struct share_mode_lock *lck;
1320 DEBUG(5,("set_sticky_write_time: %s id=%s\n",
1321 timestring(talloc_tos(),
1322 convert_timespec_to_time_t(write_time)),
1323 file_id_string_tos(&fileid)));
1325 lck = get_share_mode_lock(talloc_tos(), fileid);
1330 if (timespec_compare(&lck->changed_write_time, &write_time) != 0) {
1331 lck->modified = True;
1332 lck->changed_write_time = write_time;
1339 bool set_write_time(struct file_id fileid, struct timespec write_time)
1341 struct share_mode_lock *lck;
1343 DEBUG(5,("set_write_time: %s id=%s\n",
1344 timestring(talloc_tos(),
1345 convert_timespec_to_time_t(write_time)),
1346 file_id_string_tos(&fileid)));
1348 lck = get_share_mode_lock(talloc_tos(), fileid);
1353 if (timespec_compare(&lck->old_write_time, &write_time) != 0) {
1354 lck->modified = True;
1355 lck->old_write_time = write_time;
1363 struct forall_state {
1364 void (*fn)(const struct share_mode_entry *entry,
1365 const char *sharepath,
1367 void *private_data);
1371 static int traverse_fn(struct db_record *rec, void *_state)
1373 struct forall_state *state = (struct forall_state *)_state;
1378 enum ndr_err_code ndr_err;
1379 struct share_mode_lock *lck;
1381 key = dbwrap_record_get_key(rec);
1382 value = dbwrap_record_get_value(rec);
1384 /* Ensure this is a locking_key record. */
1385 if (key.dsize != sizeof(struct file_id))
1388 lck = talloc(talloc_tos(), struct share_mode_lock);
1393 blob.data = value.dptr;
1394 blob.length = value.dsize;
1396 ndr_err = ndr_pull_struct_blob(
1398 (ndr_pull_flags_fn_t)ndr_pull_share_mode_lock);
1399 if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
1400 DEBUG(1, ("ndr_pull_share_mode_lock failed\n"));
1403 for (i=0; i<lck->num_share_modes; i++) {
1404 state->fn(&lck->share_modes[i],
1405 lck->servicepath, lck->base_name,
1406 state->private_data);
1413 /*******************************************************************
1414 Call the specified function on each entry under management by the
1416 ********************************************************************/
1418 int share_mode_forall(void (*fn)(const struct share_mode_entry *, const char *,
1419 const char *, void *),
1422 struct forall_state state;
1426 if (lock_db == NULL)
1430 state.private_data = private_data;
1432 status = dbwrap_traverse_read(lock_db, traverse_fn, (void *)&state,
1435 if (!NT_STATUS_IS_OK(status)) {