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 2 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, write to the Free Software
20 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
24 12 aug 96: Erik.Devriendt@te6.siemens.be
25 added support for shared memory implementation of share mode locking
27 May 1997. Jeremy Allison (jallison@whistle.com). Modified share mode
28 locking to deal with multiple share modes per open file.
30 September 1997. Jeremy Allison (jallison@whistle.com). Added oplock
33 rewrtten completely to use new tdb code. Tridge, Dec '99
35 Added POSIX locking support. Jeremy Allison (jeremy@valinux.com), Apr. 2000.
36 Added Unix Extensions POSIX locking support. Jeremy Allison Mar 2006.
42 #define DBGC_CLASS DBGC_LOCKING
44 /* the locking database handle */
45 static TDB_CONTEXT *tdb;
47 /****************************************************************************
49 ****************************************************************************/
51 const char *lock_type_name(enum brl_type lock_type)
58 case PENDING_READ_LOCK:
59 return "PENDING_READ";
60 case PENDING_WRITE_LOCK:
61 return "PENDING_WRITE";
67 const char *lock_flav_name(enum brl_flavour lock_flav)
69 return (lock_flav == WINDOWS_LOCK) ? "WINDOWS_LOCK" : "POSIX_LOCK";
72 /****************************************************************************
73 Utility function called to see if a file region is locked.
74 Called in the read/write codepath.
75 ****************************************************************************/
77 BOOL is_locked(files_struct *fsp,
81 enum brl_type lock_type)
83 int snum = SNUM(fsp->conn);
84 int strict_locking = lp_strict_locking(snum);
85 enum brl_flavour lock_flav = lp_posix_cifsu_locktype();
92 if (!lp_locking(snum) || !strict_locking) {
96 if (strict_locking == Auto) {
97 if (EXCLUSIVE_OPLOCK_TYPE(fsp->oplock_type) && (lock_type == READ_LOCK || lock_type == WRITE_LOCK)) {
98 DEBUG(10,("is_locked: optimisation - exclusive oplock on file %s\n", fsp->fsp_name ));
100 } else if ((fsp->oplock_type == LEVEL_II_OPLOCK) &&
101 (lock_type == READ_LOCK)) {
102 DEBUG(10,("is_locked: optimisation - level II oplock on file %s\n", fsp->fsp_name ));
105 struct byte_range_lock *br_lck = brl_get_locks_readonly(NULL, fsp);
109 ret = !brl_locktest(br_lck,
119 struct byte_range_lock *br_lck = brl_get_locks_readonly(NULL, fsp);
123 ret = !brl_locktest(br_lck,
133 DEBUG(10,("is_locked: flavour = %s brl start=%.0f len=%.0f %s for fnum %d file %s\n",
134 lock_flav_name(lock_flav),
135 (double)offset, (double)count, ret ? "locked" : "unlocked",
136 fsp->fnum, fsp->fsp_name ));
141 /****************************************************************************
142 Find out if a lock could be granted - return who is blocking us if we can't.
143 ****************************************************************************/
145 NTSTATUS query_lock(files_struct *fsp,
147 SMB_BIG_UINT *pcount,
148 SMB_BIG_UINT *poffset,
149 enum brl_type *plock_type,
150 enum brl_flavour lock_flav)
152 struct byte_range_lock *br_lck = NULL;
153 NTSTATUS status = NT_STATUS_LOCK_NOT_GRANTED;
155 if (!fsp->can_lock) {
156 return fsp->is_directory ? NT_STATUS_INVALID_DEVICE_REQUEST : NT_STATUS_INVALID_HANDLE;
159 if (!lp_locking(SNUM(fsp->conn))) {
163 br_lck = brl_get_locks_readonly(NULL, fsp);
165 return NT_STATUS_NO_MEMORY;
168 status = brl_lockquery(br_lck,
180 /****************************************************************************
181 Utility function called by locking requests.
182 ****************************************************************************/
184 struct byte_range_lock *do_lock(files_struct *fsp,
188 enum brl_type lock_type,
189 enum brl_flavour lock_flav,
193 struct byte_range_lock *br_lck = NULL;
195 if (!fsp->can_lock) {
196 *perr = fsp->is_directory ? NT_STATUS_INVALID_DEVICE_REQUEST : NT_STATUS_INVALID_HANDLE;
200 if (!lp_locking(SNUM(fsp->conn))) {
201 *perr = NT_STATUS_OK;
205 /* NOTE! 0 byte long ranges ARE allowed and should be stored */
207 DEBUG(10,("do_lock: lock flavour %s lock type %s start=%.0f len=%.0f requested for fnum %d file %s\n",
208 lock_flav_name(lock_flav), lock_type_name(lock_type),
209 (double)offset, (double)count, fsp->fnum, fsp->fsp_name ));
211 br_lck = brl_get_locks(NULL, fsp);
213 *perr = NT_STATUS_NO_MEMORY;
217 *perr = brl_lock(br_lck,
229 /****************************************************************************
230 Utility function called by unlocking requests.
231 ****************************************************************************/
233 NTSTATUS do_unlock(files_struct *fsp,
237 enum brl_flavour lock_flav)
240 struct byte_range_lock *br_lck = NULL;
242 if (!fsp->can_lock) {
243 return fsp->is_directory ? NT_STATUS_INVALID_DEVICE_REQUEST : NT_STATUS_INVALID_HANDLE;
246 if (!lp_locking(SNUM(fsp->conn))) {
250 DEBUG(10,("do_unlock: unlock start=%.0f len=%.0f requested for fnum %d file %s\n",
251 (double)offset, (double)count, fsp->fnum, fsp->fsp_name ));
253 br_lck = brl_get_locks(NULL, fsp);
255 return NT_STATUS_NO_MEMORY;
258 ok = brl_unlock(br_lck,
268 DEBUG(10,("do_unlock: returning ERRlock.\n" ));
269 return NT_STATUS_RANGE_NOT_LOCKED;
275 /****************************************************************************
276 Cancel any pending blocked locks.
277 ****************************************************************************/
279 NTSTATUS do_lock_cancel(files_struct *fsp,
283 enum brl_flavour lock_flav)
286 struct byte_range_lock *br_lck = NULL;
288 if (!fsp->can_lock) {
289 return fsp->is_directory ?
290 NT_STATUS_INVALID_DEVICE_REQUEST : NT_STATUS_INVALID_HANDLE;
293 if (!lp_locking(SNUM(fsp->conn))) {
294 return NT_STATUS_DOS(ERRDOS, ERRcancelviolation);
297 DEBUG(10,("do_lock_cancel: cancel start=%.0f len=%.0f requested for fnum %d file %s\n",
298 (double)offset, (double)count, fsp->fnum, fsp->fsp_name ));
300 br_lck = brl_get_locks(NULL, fsp);
302 return NT_STATUS_NO_MEMORY;
305 ok = brl_lock_cancel(br_lck,
315 DEBUG(10,("do_lock_cancel: returning ERRcancelviolation.\n" ));
316 return NT_STATUS_DOS(ERRDOS, ERRcancelviolation);
322 /****************************************************************************
323 Remove any locks on this fd. Called from file_close().
324 ****************************************************************************/
326 void locking_close_file(files_struct *fsp)
328 struct byte_range_lock *br_lck;
330 if (!lp_locking(SNUM(fsp->conn))) {
334 br_lck = brl_get_locks(NULL,fsp);
337 cancel_pending_lock_requests_by_fid(fsp, br_lck);
338 brl_close_fnum(br_lck);
343 /****************************************************************************
344 Initialise the locking functions.
345 ****************************************************************************/
347 static int open_read_only;
349 BOOL locking_init(int read_only)
356 tdb = tdb_open_log(lock_path("locking.tdb"),
357 lp_open_files_db_hash_size(),
358 TDB_DEFAULT|(read_only?0x0:TDB_CLEAR_IF_FIRST),
359 read_only?O_RDONLY:O_RDWR|O_CREAT,
363 DEBUG(0,("ERROR: Failed to initialise locking database\n"));
367 if (!posix_locking_init(read_only))
370 open_read_only = read_only;
375 /*******************************************************************
376 Deinitialize the share_mode management.
377 ******************************************************************/
379 BOOL locking_end(void)
383 brl_shutdown(open_read_only);
385 if (tdb_close(tdb) != 0)
392 /*******************************************************************
393 Form a static locking key for a dev/inode pair.
394 ******************************************************************/
396 /* key and data records in the tdb locking database */
402 /*******************************************************************
403 Form a static locking key for a dev/inode pair.
404 ******************************************************************/
406 static TDB_DATA locking_key(SMB_DEV_T dev, SMB_INO_T inode)
408 static struct locking_key key;
411 memset(&key, '\0', sizeof(key));
414 kbuf.dptr = (char *)&key;
415 kbuf.dsize = sizeof(key);
419 /*******************************************************************
420 Print out a share mode.
421 ********************************************************************/
423 char *share_mode_str(int num, struct share_mode_entry *e)
425 static pstring share_str;
427 slprintf(share_str, sizeof(share_str)-1, "share_mode_entry[%d]: %s "
428 "pid = %s, share_access = 0x%x, private_options = 0x%x, "
429 "access_mask = 0x%x, mid = 0x%x, type= 0x%x, file_id = %lu, "
430 "uid = %u, dev = 0x%x, inode = %.0f",
432 e->op_type == UNUSED_SHARE_MODE_ENTRY ? "UNUSED" : "",
433 procid_str_static(&e->pid),
434 e->share_access, e->private_options,
435 e->access_mask, e->op_mid, e->op_type, e->share_file_id,
436 (unsigned int)e->uid, (unsigned int)e->dev, (double)e->inode );
441 /*******************************************************************
442 Print out a share mode table.
443 ********************************************************************/
445 static void print_share_mode_table(struct locking_data *data)
447 int num_share_modes = data->u.s.num_share_mode_entries;
448 struct share_mode_entry *shares =
449 (struct share_mode_entry *)(data + 1);
452 for (i = 0; i < num_share_modes; i++) {
453 struct share_mode_entry entry;
455 memcpy(&entry, &shares[i], sizeof(struct share_mode_entry));
456 DEBUG(10,("print_share_mode_table: %s\n",
457 share_mode_str(i, &entry)));
461 /*******************************************************************
462 Get all share mode entries for a dev/inode pair.
463 ********************************************************************/
465 static BOOL parse_share_modes(TDB_DATA dbuf, struct share_mode_lock *lck)
467 struct locking_data *data;
470 if (dbuf.dsize < sizeof(struct locking_data)) {
471 smb_panic("PANIC: parse_share_modes: buffer too short.\n");
474 data = (struct locking_data *)dbuf.dptr;
476 lck->delete_on_close = data->u.s.delete_on_close;
477 lck->initial_delete_on_close = data->u.s.initial_delete_on_close;
478 lck->num_share_modes = data->u.s.num_share_mode_entries;
480 DEBUG(10, ("parse_share_modes: delete_on_close: %d, "
481 "initial_delete_on_close: %d, "
482 "num_share_modes: %d\n",
483 lck->delete_on_close,
484 lck->initial_delete_on_close,
485 lck->num_share_modes));
487 if ((lck->num_share_modes < 0) || (lck->num_share_modes > 1000000)) {
488 DEBUG(0, ("invalid number of share modes: %d\n",
489 lck->num_share_modes));
490 smb_panic("PANIC: invalid number of share modes");
493 lck->share_modes = NULL;
495 if (lck->num_share_modes != 0) {
497 if (dbuf.dsize < (sizeof(struct locking_data) +
498 (lck->num_share_modes *
499 sizeof(struct share_mode_entry)))) {
500 smb_panic("PANIC: parse_share_modes: buffer too short.\n");
503 lck->share_modes = (struct share_mode_entry *)
504 talloc_memdup(lck, dbuf.dptr+sizeof(*data),
505 lck->num_share_modes *
506 sizeof(struct share_mode_entry));
508 if (lck->share_modes == NULL) {
509 smb_panic("talloc failed\n");
513 /* Get any delete token. */
514 if (data->u.s.delete_token_size) {
515 char *p = dbuf.dptr + sizeof(*data) +
516 (lck->num_share_modes *
517 sizeof(struct share_mode_entry));
519 if ((data->u.s.delete_token_size < sizeof(uid_t) + sizeof(gid_t)) ||
520 ((data->u.s.delete_token_size - sizeof(uid_t)) % sizeof(gid_t)) != 0) {
521 DEBUG(0, ("parse_share_modes: invalid token size %d\n",
522 data->u.s.delete_token_size));
523 smb_panic("parse_share_modes: invalid token size\n");
526 lck->delete_token = TALLOC_P(lck, UNIX_USER_TOKEN);
527 if (!lck->delete_token) {
528 smb_panic("talloc failed\n");
531 /* Copy out the uid and gid. */
532 memcpy(&lck->delete_token->uid, p, sizeof(uid_t));
534 memcpy(&lck->delete_token->gid, p, sizeof(gid_t));
537 /* Any supplementary groups ? */
538 lck->delete_token->ngroups = (data->u.s.delete_token_size > (sizeof(uid_t) + sizeof(gid_t))) ?
539 ((data->u.s.delete_token_size -
540 (sizeof(uid_t) + sizeof(gid_t)))/sizeof(gid_t)) : 0;
542 if (lck->delete_token->ngroups) {
543 /* Make this a talloc child of lck->delete_token. */
544 lck->delete_token->groups = TALLOC_ARRAY(lck->delete_token, gid_t,
545 lck->delete_token->ngroups);
546 if (!lck->delete_token) {
547 smb_panic("talloc failed\n");
550 for (i = 0; i < lck->delete_token->ngroups; i++) {
551 memcpy(&lck->delete_token->groups[i], p, sizeof(gid_t));
557 lck->delete_token = NULL;
560 /* Save off the associated service path and filename. */
561 lck->servicepath = talloc_strdup(lck, dbuf.dptr + sizeof(*data) +
562 (lck->num_share_modes *
563 sizeof(struct share_mode_entry)) +
564 data->u.s.delete_token_size );
566 lck->filename = talloc_strdup(lck, dbuf.dptr + sizeof(*data) +
567 (lck->num_share_modes *
568 sizeof(struct share_mode_entry)) +
569 data->u.s.delete_token_size +
570 strlen(lck->servicepath) + 1 );
573 * Ensure that each entry has a real process attached.
576 for (i = 0; i < lck->num_share_modes; i++) {
577 struct share_mode_entry *entry_p = &lck->share_modes[i];
578 DEBUG(10,("parse_share_modes: %s\n",
579 share_mode_str(i, entry_p) ));
580 if (!process_exists(entry_p->pid)) {
581 DEBUG(10,("parse_share_modes: deleted %s\n",
582 share_mode_str(i, entry_p) ));
583 entry_p->op_type = UNUSED_SHARE_MODE_ENTRY;
584 lck->modified = True;
591 static TDB_DATA unparse_share_modes(struct share_mode_lock *lck)
596 struct locking_data *data;
599 uint32 delete_token_size;
604 for (i=0; i<lck->num_share_modes; i++) {
605 if (!is_unused_share_mode_entry(&lck->share_modes[i])) {
610 if (num_valid == 0) {
614 sp_len = strlen(lck->servicepath);
615 delete_token_size = (lck->delete_token ?
616 (sizeof(uid_t) + sizeof(gid_t) + (lck->delete_token->ngroups*sizeof(gid_t))) : 0);
618 result.dsize = sizeof(*data) +
619 lck->num_share_modes * sizeof(struct share_mode_entry) +
622 strlen(lck->filename) + 1;
623 result.dptr = TALLOC_ARRAY(lck, char, result.dsize);
625 if (result.dptr == NULL) {
626 smb_panic("talloc failed\n");
629 data = (struct locking_data *)result.dptr;
631 data->u.s.num_share_mode_entries = lck->num_share_modes;
632 data->u.s.delete_on_close = lck->delete_on_close;
633 data->u.s.initial_delete_on_close = lck->initial_delete_on_close;
634 data->u.s.delete_token_size = delete_token_size;
635 DEBUG(10, ("unparse_share_modes: del: %d, initial del %d, tok = %u, num: %d\n",
636 data->u.s.delete_on_close,
637 data->u.s.initial_delete_on_close,
638 (unsigned int)data->u.s.delete_token_size,
639 data->u.s.num_share_mode_entries));
640 memcpy(result.dptr + sizeof(*data), lck->share_modes,
641 sizeof(struct share_mode_entry)*lck->num_share_modes);
642 offset = sizeof(*data) +
643 sizeof(struct share_mode_entry)*lck->num_share_modes;
645 /* Store any delete on close token. */
646 if (lck->delete_token) {
647 char *p = result.dptr + offset;
649 memcpy(p, &lck->delete_token->uid, sizeof(uid_t));
652 memcpy(p, &lck->delete_token->gid, sizeof(gid_t));
655 for (i = 0; i < lck->delete_token->ngroups; i++) {
656 memcpy(p, &lck->delete_token->groups[i], sizeof(gid_t));
659 offset = p - result.dptr;
662 safe_strcpy(result.dptr + offset, lck->servicepath,
663 result.dsize - offset - 1);
664 offset += sp_len + 1;
665 safe_strcpy(result.dptr + offset, lck->filename,
666 result.dsize - offset - 1);
668 if (DEBUGLEVEL >= 10) {
669 print_share_mode_table(data);
675 static int share_mode_lock_destructor(void *p)
677 struct share_mode_lock *lck =
678 talloc_get_type_abort(p, struct share_mode_lock);
679 TDB_DATA key = locking_key(lck->dev, lck->ino);
682 if (!lck->modified) {
686 data = unparse_share_modes(lck);
688 if (data.dptr == NULL) {
690 /* There has been an entry before, delete it */
691 if (tdb_delete(tdb, key) == -1) {
692 smb_panic("Could not delete share entry\n");
698 if (tdb_store(tdb, key, data, TDB_REPLACE) == -1) {
699 smb_panic("Could not store share mode entry\n");
703 tdb_chainunlock(tdb, key);
708 struct share_mode_lock *get_share_mode_lock(TALLOC_CTX *mem_ctx,
709 SMB_DEV_T dev, SMB_INO_T ino,
710 const char *servicepath,
713 struct share_mode_lock *lck;
714 TDB_DATA key = locking_key(dev, ino);
717 lck = TALLOC_P(mem_ctx, struct share_mode_lock);
719 DEBUG(0, ("talloc failed\n"));
723 /* Ensure we set every field here as the destructor must be
724 valid even if parse_share_modes fails. */
726 lck->servicepath = NULL;
727 lck->filename = NULL;
730 lck->num_share_modes = 0;
731 lck->share_modes = NULL;
732 lck->delete_token = NULL;
733 lck->delete_on_close = False;
734 lck->initial_delete_on_close = False;
736 lck->modified = False;
738 if (tdb_chainlock(tdb, key) != 0) {
739 DEBUG(3, ("Could not lock share entry\n"));
744 /* We must set the destructor immediately after the chainlock
745 ensure the lock is cleaned up on any of the error return
748 talloc_set_destructor(lck, share_mode_lock_destructor);
750 data = tdb_fetch(tdb, key);
751 lck->fresh = (data.dptr == NULL);
755 if (fname == NULL || servicepath == NULL) {
759 lck->filename = talloc_strdup(lck, fname);
760 lck->servicepath = talloc_strdup(lck, servicepath);
761 if (lck->filename == NULL || lck->servicepath == NULL) {
762 DEBUG(0, ("talloc failed\n"));
767 if (!parse_share_modes(data, lck)) {
768 DEBUG(0, ("Could not parse share modes\n"));
770 SAFE_FREE(data.dptr);
775 SAFE_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 share_mode_lock *lck,
788 const char *servicepath,
801 DEBUG(10, ("rename_share_filename: servicepath %s newname %s\n",
802 servicepath, newname));
805 * rename_internal_fsp() and rename_internals() add './' to
806 * head of newname if newname does not contain a '/'.
808 while (newname[0] && newname[1] && newname[0] == '.' && newname[1] == '/') {
812 lck->servicepath = talloc_strdup(lck, servicepath);
813 lck->filename = talloc_strdup(lck, newname);
814 if (lck->filename == NULL || lck->servicepath == NULL) {
815 DEBUG(0, ("rename_share_filename: talloc failed\n"));
818 lck->modified = True;
820 sp_len = strlen(lck->servicepath);
821 fn_len = strlen(lck->filename);
823 msg_len = MSG_FILE_RENAMED_MIN_SIZE + sp_len + 1 + fn_len + 1;
825 /* Set up the name changed message. */
826 frm = TALLOC_ARRAY(lck, char, msg_len);
831 SDEV_T_VAL(frm,0,lck->dev);
832 SINO_T_VAL(frm,8,lck->ino);
834 DEBUG(10,("rename_share_filename: msg_len = %u\n", (unsigned int)msg_len ));
836 safe_strcpy(&frm[16], lck->servicepath, sp_len);
837 safe_strcpy(&frm[16 + sp_len + 1], lck->filename, fn_len);
839 /* Send the messages. */
840 for (i=0; i<lck->num_share_modes; i++) {
841 struct share_mode_entry *se = &lck->share_modes[i];
842 if (!is_valid_share_mode_entry(se)) {
845 /* But not to ourselves... */
846 if (procid_is_me(&se->pid)) {
850 DEBUG(10,("rename_share_filename: sending rename message to pid %s "
851 "dev %x, inode %.0f sharepath %s newname %s\n",
852 procid_str_static(&se->pid),
853 (unsigned int)lck->dev, (double)lck->ino,
854 lck->servicepath, lck->filename ));
856 message_send_pid(se->pid, MSG_SMB_FILE_RENAME,
863 BOOL get_delete_on_close_flag(SMB_DEV_T dev, SMB_INO_T inode)
866 struct share_mode_lock *lck = get_share_mode_lock(NULL, dev, inode, NULL, NULL);
870 result = lck->delete_on_close;
875 BOOL is_valid_share_mode_entry(const struct share_mode_entry *e)
879 num_props += ((e->op_type == NO_OPLOCK) ? 1 : 0);
880 num_props += (EXCLUSIVE_OPLOCK_TYPE(e->op_type) ? 1 : 0);
881 num_props += (LEVEL_II_OPLOCK_TYPE(e->op_type) ? 1 : 0);
883 SMB_ASSERT(num_props <= 1);
884 return (num_props != 0);
887 BOOL is_deferred_open_entry(const struct share_mode_entry *e)
889 return (e->op_type == DEFERRED_OPEN_ENTRY);
892 BOOL is_unused_share_mode_entry(const struct share_mode_entry *e)
894 return (e->op_type == UNUSED_SHARE_MODE_ENTRY);
897 /*******************************************************************
898 Fill a share mode entry.
899 ********************************************************************/
901 static void fill_share_mode_entry(struct share_mode_entry *e,
903 uid_t uid, uint16 mid, uint16 op_type)
906 e->pid = procid_self();
907 e->share_access = fsp->share_access;
908 e->private_options = fsp->fh->private_options;
909 e->access_mask = fsp->access_mask;
911 e->op_type = op_type;
912 e->time.tv_sec = fsp->open_time.tv_sec;
913 e->time.tv_usec = fsp->open_time.tv_usec;
915 e->inode = fsp->inode;
916 e->share_file_id = fsp->fh->file_id;
917 e->uid = (uint32)uid;
920 static void fill_deferred_open_entry(struct share_mode_entry *e,
921 const struct timeval request_time,
922 SMB_DEV_T dev, SMB_INO_T ino, uint16 mid)
925 e->pid = procid_self();
927 e->op_type = DEFERRED_OPEN_ENTRY;
928 e->time.tv_sec = request_time.tv_sec;
929 e->time.tv_usec = request_time.tv_usec;
935 static void add_share_mode_entry(struct share_mode_lock *lck,
936 const struct share_mode_entry *entry)
940 for (i=0; i<lck->num_share_modes; i++) {
941 struct share_mode_entry *e = &lck->share_modes[i];
942 if (is_unused_share_mode_entry(e)) {
948 if (i == lck->num_share_modes) {
949 /* No unused entry found */
950 ADD_TO_ARRAY(lck, struct share_mode_entry, *entry,
951 &lck->share_modes, &lck->num_share_modes);
953 lck->modified = True;
956 void set_share_mode(struct share_mode_lock *lck, files_struct *fsp,
957 uid_t uid, uint16 mid, uint16 op_type)
959 struct share_mode_entry entry;
960 fill_share_mode_entry(&entry, fsp, uid, mid, op_type);
961 add_share_mode_entry(lck, &entry);
964 void add_deferred_open(struct share_mode_lock *lck, uint16 mid,
965 struct timeval request_time,
966 SMB_DEV_T dev, SMB_INO_T ino)
968 struct share_mode_entry entry;
969 fill_deferred_open_entry(&entry, request_time, dev, ino, mid);
970 add_share_mode_entry(lck, &entry);
973 /*******************************************************************
974 Check if two share mode entries are identical, ignoring oplock
975 and mid info and desired_access. (Removed paranoia test - it's
976 not automatically a logic error if they are identical. JRA.)
977 ********************************************************************/
979 static BOOL share_modes_identical(struct share_mode_entry *e1,
980 struct share_mode_entry *e2)
982 /* We used to check for e1->share_access == e2->share_access here
983 as well as the other fields but 2 different DOS or FCB opens
984 sharing the same share mode entry may validly differ in
985 fsp->share_access field. */
987 return (procid_equal(&e1->pid, &e2->pid) &&
988 e1->dev == e2->dev &&
989 e1->inode == e2->inode &&
990 e1->share_file_id == e2->share_file_id );
993 static BOOL deferred_open_identical(struct share_mode_entry *e1,
994 struct share_mode_entry *e2)
996 return (procid_equal(&e1->pid, &e2->pid) &&
997 (e1->op_mid == e2->op_mid) &&
998 (e1->dev == e2->dev) &&
999 (e1->inode == e2->inode));
1002 static struct share_mode_entry *find_share_mode_entry(struct share_mode_lock *lck,
1003 struct share_mode_entry *entry)
1007 for (i=0; i<lck->num_share_modes; i++) {
1008 struct share_mode_entry *e = &lck->share_modes[i];
1009 if (is_valid_share_mode_entry(entry) &&
1010 is_valid_share_mode_entry(e) &&
1011 share_modes_identical(e, entry)) {
1014 if (is_deferred_open_entry(entry) &&
1015 is_deferred_open_entry(e) &&
1016 deferred_open_identical(e, entry)) {
1023 /*******************************************************************
1024 Del the share mode of a file for this process. Return the number of
1026 ********************************************************************/
1028 BOOL del_share_mode(struct share_mode_lock *lck, files_struct *fsp)
1030 struct share_mode_entry entry, *e;
1032 /* Don't care about the pid owner being correct here - just a search. */
1033 fill_share_mode_entry(&entry, fsp, (uid_t)-1, 0, NO_OPLOCK);
1035 e = find_share_mode_entry(lck, &entry);
1040 e->op_type = UNUSED_SHARE_MODE_ENTRY;
1041 lck->modified = True;
1045 void del_deferred_open_entry(struct share_mode_lock *lck, uint16 mid)
1047 struct share_mode_entry entry, *e;
1049 fill_deferred_open_entry(&entry, timeval_zero(),
1050 lck->dev, lck->ino, mid);
1052 e = find_share_mode_entry(lck, &entry);
1057 e->op_type = UNUSED_SHARE_MODE_ENTRY;
1058 lck->modified = True;
1061 /*******************************************************************
1062 Remove an oplock mid and mode entry from a share mode.
1063 ********************************************************************/
1065 BOOL remove_share_oplock(struct share_mode_lock *lck, files_struct *fsp)
1067 struct share_mode_entry entry, *e;
1069 /* Don't care about the pid owner being correct here - just a search. */
1070 fill_share_mode_entry(&entry, fsp, (uid_t)-1, 0, NO_OPLOCK);
1072 e = find_share_mode_entry(lck, &entry);
1078 e->op_type = NO_OPLOCK;
1079 lck->modified = True;
1083 /*******************************************************************
1084 Downgrade a oplock type from exclusive to level II.
1085 ********************************************************************/
1087 BOOL downgrade_share_oplock(struct share_mode_lock *lck, files_struct *fsp)
1089 struct share_mode_entry entry, *e;
1091 /* Don't care about the pid owner being correct here - just a search. */
1092 fill_share_mode_entry(&entry, fsp, (uid_t)-1, 0, NO_OPLOCK);
1094 e = find_share_mode_entry(lck, &entry);
1099 e->op_type = LEVEL_II_OPLOCK;
1100 lck->modified = True;
1104 /****************************************************************************
1105 Deal with the internal needs of setting the delete on close flag. Note that
1106 as the tdb locking is recursive, it is safe to call this from within
1107 open_file_ntcreate. JRA.
1108 ****************************************************************************/
1110 NTSTATUS can_set_delete_on_close(files_struct *fsp, BOOL delete_on_close,
1113 if (!delete_on_close) {
1114 return NT_STATUS_OK;
1118 * Only allow delete on close for writable files.
1121 if ((dosmode & aRONLY) &&
1122 !lp_delete_readonly(SNUM(fsp->conn))) {
1123 DEBUG(10,("can_set_delete_on_close: file %s delete on close "
1124 "flag set but file attribute is readonly.\n",
1126 return NT_STATUS_CANNOT_DELETE;
1130 * Only allow delete on close for writable shares.
1133 if (!CAN_WRITE(fsp->conn)) {
1134 DEBUG(10,("can_set_delete_on_close: file %s delete on "
1135 "close flag set but write access denied on share.\n",
1137 return NT_STATUS_ACCESS_DENIED;
1141 * Only allow delete on close for files/directories opened with delete
1145 if (!(fsp->access_mask & DELETE_ACCESS)) {
1146 DEBUG(10,("can_set_delete_on_close: file %s delete on "
1147 "close flag set but delete access denied.\n",
1149 return NT_STATUS_ACCESS_DENIED;
1152 return NT_STATUS_OK;
1155 /*************************************************************************
1156 Return a talloced copy of a UNIX_USER_TOKEN. NULL on fail.
1157 (Should this be in locking.c.... ?).
1158 *************************************************************************/
1160 static UNIX_USER_TOKEN *copy_unix_token(TALLOC_CTX *ctx, UNIX_USER_TOKEN *tok)
1162 UNIX_USER_TOKEN *cpy;
1168 cpy = TALLOC_P(ctx, UNIX_USER_TOKEN);
1173 cpy->uid = tok->uid;
1174 cpy->gid = tok->gid;
1175 cpy->ngroups = tok->ngroups;
1177 /* Make this a talloc child of cpy. */
1178 cpy->groups = TALLOC_ARRAY(cpy, gid_t, tok->ngroups);
1182 memcpy(cpy->groups, tok->groups, tok->ngroups * sizeof(gid_t));
1187 /****************************************************************************
1188 Replace the delete on close token.
1189 ****************************************************************************/
1191 void set_delete_on_close_token(struct share_mode_lock *lck, UNIX_USER_TOKEN *tok)
1193 /* Ensure there's no token. */
1194 if (lck->delete_token) {
1195 TALLOC_FREE(lck->delete_token); /* Also deletes groups... */
1196 lck->delete_token = NULL;
1199 /* Copy the new token (can be NULL). */
1200 lck->delete_token = copy_unix_token(lck, tok);
1201 lck->modified = True;
1204 /****************************************************************************
1205 Sets the delete on close flag over all share modes on this file.
1206 Modify the share mode entry for all files open
1207 on this device and inode to tell other smbds we have
1208 changed the delete on close flag. This will be noticed
1209 in the close code, the last closer will delete the file
1211 Note that setting this to any value clears the initial_delete_on_close flag.
1212 If delete_on_close is True this makes a copy of any UNIX_USER_TOKEN into the
1214 ****************************************************************************/
1216 BOOL set_delete_on_close(files_struct *fsp, BOOL delete_on_close, UNIX_USER_TOKEN *tok)
1218 struct share_mode_lock *lck;
1220 DEBUG(10,("set_delete_on_close: %s delete on close flag for "
1221 "fnum = %d, file %s\n",
1222 delete_on_close ? "Adding" : "Removing", fsp->fnum,
1229 lck = get_share_mode_lock(NULL, fsp->dev, fsp->inode, NULL, NULL);
1234 if (lck->delete_on_close != delete_on_close) {
1235 set_delete_on_close_token(lck, tok);
1236 lck->delete_on_close = delete_on_close;
1237 if (delete_on_close) {
1238 SMB_ASSERT(lck->delete_token != NULL);
1240 lck->modified = True;
1243 if (lck->initial_delete_on_close) {
1244 lck->initial_delete_on_close = False;
1245 lck->modified = True;
1252 struct forall_state {
1253 void (*fn)(const struct share_mode_entry *entry,
1254 const char *sharepath,
1256 void *private_data);
1260 static int traverse_fn(TDB_CONTEXT *the_tdb, TDB_DATA kbuf, TDB_DATA dbuf,
1263 struct forall_state *state = (struct forall_state *)_state;
1264 struct locking_data *data;
1265 struct share_mode_entry *shares;
1266 const char *sharepath;
1270 /* Ensure this is a locking_key record. */
1271 if (kbuf.dsize != sizeof(struct locking_key))
1274 data = (struct locking_data *)dbuf.dptr;
1275 shares = (struct share_mode_entry *)(dbuf.dptr + sizeof(*data));
1276 sharepath = dbuf.dptr + sizeof(*data) +
1277 data->u.s.num_share_mode_entries*sizeof(*shares) +
1278 data->u.s.delete_token_size;
1279 fname = dbuf.dptr + sizeof(*data) +
1280 data->u.s.num_share_mode_entries*sizeof(*shares) +
1281 data->u.s.delete_token_size +
1282 strlen(sharepath) + 1;
1284 for (i=0;i<data->u.s.num_share_mode_entries;i++) {
1285 state->fn(&shares[i], sharepath, fname,
1286 state->private_data);
1291 /*******************************************************************
1292 Call the specified function on each entry under management by the
1294 ********************************************************************/
1296 int share_mode_forall(void (*fn)(const struct share_mode_entry *, const char *,
1297 const char *, void *),
1300 struct forall_state state;
1306 state.private_data = private_data;
1308 return tdb_traverse(tdb, traverse_fn, (void *)&state);