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 rewrtten 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.
41 #define DBGC_CLASS DBGC_LOCKING
43 #define NO_LOCKING_COUNT (-1)
45 /* the locking database handle */
46 static struct db_context
*lock_db
;
48 /****************************************************************************
50 ****************************************************************************/
52 const char *lock_type_name(enum brl_type lock_type
)
59 case PENDING_READ_LOCK
:
60 return "PENDING_READ";
61 case PENDING_WRITE_LOCK
:
62 return "PENDING_WRITE";
68 const char *lock_flav_name(enum brl_flavour lock_flav
)
70 return (lock_flav
== WINDOWS_LOCK
) ? "WINDOWS_LOCK" : "POSIX_LOCK";
73 /****************************************************************************
74 Utility function called to see if a file region is locked.
75 Called in the read/write codepath.
76 ****************************************************************************/
78 bool is_locked(files_struct
*fsp
,
82 enum brl_type lock_type
)
84 int strict_locking
= lp_strict_locking(fsp
->conn
->params
);
85 enum brl_flavour lock_flav
= lp_posix_cifsu_locktype(fsp
);
92 if (!lp_locking(fsp
->conn
->params
) || !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(talloc_tos(), fsp
);
109 ret
= !brl_locktest(br_lck
,
119 struct byte_range_lock
*br_lck
= brl_get_locks_readonly(talloc_tos(), 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(fsp
->conn
->params
)) {
163 br_lck
= brl_get_locks_readonly(talloc_tos(), 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(struct messaging_context
*msg_ctx
,
189 enum brl_type lock_type
,
190 enum brl_flavour lock_flav
,
195 struct byte_range_lock
*br_lck
= NULL
;
197 if (!fsp
->can_lock
) {
198 *perr
= fsp
->is_directory
? NT_STATUS_INVALID_DEVICE_REQUEST
: NT_STATUS_INVALID_HANDLE
;
202 if (!lp_locking(fsp
->conn
->params
)) {
203 *perr
= NT_STATUS_OK
;
207 /* NOTE! 0 byte long ranges ARE allowed and should be stored */
209 DEBUG(10,("do_lock: lock flavour %s lock type %s start=%.0f len=%.0f requested for fnum %d file %s\n",
210 lock_flav_name(lock_flav
), lock_type_name(lock_type
),
211 (double)offset
, (double)count
, fsp
->fnum
, fsp
->fsp_name
));
213 br_lck
= brl_get_locks(talloc_tos(), fsp
);
215 *perr
= NT_STATUS_NO_MEMORY
;
219 *perr
= brl_lock(msg_ctx
,
230 if (lock_flav
== WINDOWS_LOCK
&&
231 fsp
->current_lock_count
!= NO_LOCKING_COUNT
) {
232 /* blocking ie. pending, locks also count here,
233 * as this is an efficiency counter to avoid checking
234 * the lock db. on close. JRA. */
236 fsp
->current_lock_count
++;
238 /* Notice that this has had a POSIX lock request.
239 * We can't count locks after this so forget them.
241 fsp
->current_lock_count
= NO_LOCKING_COUNT
;
247 /****************************************************************************
248 Utility function called by unlocking requests.
249 ****************************************************************************/
251 NTSTATUS
do_unlock(struct messaging_context
*msg_ctx
,
256 enum brl_flavour lock_flav
)
259 struct byte_range_lock
*br_lck
= NULL
;
261 if (!fsp
->can_lock
) {
262 return fsp
->is_directory
? NT_STATUS_INVALID_DEVICE_REQUEST
: NT_STATUS_INVALID_HANDLE
;
265 if (!lp_locking(fsp
->conn
->params
)) {
269 DEBUG(10,("do_unlock: unlock start=%.0f len=%.0f requested for fnum %d file %s\n",
270 (double)offset
, (double)count
, fsp
->fnum
, fsp
->fsp_name
));
272 br_lck
= brl_get_locks(talloc_tos(), fsp
);
274 return NT_STATUS_NO_MEMORY
;
277 ok
= brl_unlock(msg_ctx
,
288 DEBUG(10,("do_unlock: returning ERRlock.\n" ));
289 return NT_STATUS_RANGE_NOT_LOCKED
;
292 if (lock_flav
== WINDOWS_LOCK
&&
293 fsp
->current_lock_count
!= NO_LOCKING_COUNT
) {
294 SMB_ASSERT(fsp
->current_lock_count
> 0);
295 fsp
->current_lock_count
--;
301 /****************************************************************************
302 Cancel any pending blocked locks.
303 ****************************************************************************/
305 NTSTATUS
do_lock_cancel(files_struct
*fsp
,
309 enum brl_flavour lock_flav
)
312 struct byte_range_lock
*br_lck
= NULL
;
314 if (!fsp
->can_lock
) {
315 return fsp
->is_directory
?
316 NT_STATUS_INVALID_DEVICE_REQUEST
: NT_STATUS_INVALID_HANDLE
;
319 if (!lp_locking(fsp
->conn
->params
)) {
320 return NT_STATUS_DOS(ERRDOS
, ERRcancelviolation
);
323 DEBUG(10,("do_lock_cancel: cancel start=%.0f len=%.0f requested for fnum %d file %s\n",
324 (double)offset
, (double)count
, fsp
->fnum
, fsp
->fsp_name
));
326 br_lck
= brl_get_locks(talloc_tos(), fsp
);
328 return NT_STATUS_NO_MEMORY
;
331 ok
= brl_lock_cancel(br_lck
,
341 DEBUG(10,("do_lock_cancel: returning ERRcancelviolation.\n" ));
342 return NT_STATUS_DOS(ERRDOS
, ERRcancelviolation
);
345 if (lock_flav
== WINDOWS_LOCK
&&
346 fsp
->current_lock_count
!= NO_LOCKING_COUNT
) {
347 SMB_ASSERT(fsp
->current_lock_count
> 0);
348 fsp
->current_lock_count
--;
354 /****************************************************************************
355 Remove any locks on this fd. Called from file_close().
356 ****************************************************************************/
358 void locking_close_file(struct messaging_context
*msg_ctx
,
361 struct byte_range_lock
*br_lck
;
363 if (!lp_locking(fsp
->conn
->params
)) {
367 /* If we have not outstanding locks or pending
368 * locks then we don't need to look in the lock db.
371 if (fsp
->current_lock_count
== 0) {
375 br_lck
= brl_get_locks(talloc_tos(),fsp
);
378 cancel_pending_lock_requests_by_fid(fsp
, br_lck
);
379 brl_close_fnum(msg_ctx
, br_lck
);
384 /****************************************************************************
385 Initialise the locking functions.
386 ****************************************************************************/
388 static bool locking_init_internal(bool read_only
)
395 lock_db
= db_open(NULL
, lock_path("locking.tdb"),
396 lp_open_files_db_hash_size(),
397 TDB_DEFAULT
|TDB_VOLATILE
|TDB_CLEAR_IF_FIRST
,
398 read_only
?O_RDONLY
:O_RDWR
|O_CREAT
, 0644);
401 DEBUG(0,("ERROR: Failed to initialise locking database\n"));
405 if (!posix_locking_init(read_only
))
411 bool locking_init(void)
413 return locking_init_internal(false);
416 bool locking_init_readonly(void)
418 return locking_init_internal(true);
421 /*******************************************************************
422 Deinitialize the share_mode management.
423 ******************************************************************/
425 bool locking_end(void)
428 TALLOC_FREE(lock_db
);
432 /*******************************************************************
433 Form a static locking key for a dev/inode pair.
434 ******************************************************************/
436 static TDB_DATA
locking_key(const struct file_id
*id
, struct file_id
*tmp
)
439 return make_tdb_data((const uint8_t *)tmp
, sizeof(*tmp
));
442 /*******************************************************************
443 Print out a share mode.
444 ********************************************************************/
446 char *share_mode_str(TALLOC_CTX
*ctx
, int num
, const struct share_mode_entry
*e
)
448 return talloc_asprintf(ctx
, "share_mode_entry[%d]: %s "
449 "pid = %s, share_access = 0x%x, private_options = 0x%x, "
450 "access_mask = 0x%x, mid = 0x%x, type= 0x%x, gen_id = %lu, "
451 "uid = %u, flags = %u, file_id %s",
453 e
->op_type
== UNUSED_SHARE_MODE_ENTRY
? "UNUSED" : "",
454 procid_str_static(&e
->pid
),
455 e
->share_access
, e
->private_options
,
456 e
->access_mask
, e
->op_mid
, e
->op_type
, e
->share_file_id
,
457 (unsigned int)e
->uid
, (unsigned int)e
->flags
,
458 file_id_string_tos(&e
->id
));
461 /*******************************************************************
462 Print out a share mode table.
463 ********************************************************************/
465 static void print_share_mode_table(struct locking_data
*data
)
467 int num_share_modes
= data
->u
.s
.num_share_mode_entries
;
468 struct share_mode_entry
*shares
=
469 (struct share_mode_entry
*)(data
+ 1);
472 for (i
= 0; i
< num_share_modes
; i
++) {
473 struct share_mode_entry entry
;
477 * We need to memcpy the entry here due to alignment
478 * restrictions that are not met when directly accessing
482 memcpy(&entry
, &shares
[i
], sizeof(struct share_mode_entry
));
483 str
= share_mode_str(talloc_tos(), i
, &entry
);
485 DEBUG(10,("print_share_mode_table: %s\n", str
? str
: ""));
490 /*******************************************************************
491 Get all share mode entries for a dev/inode pair.
492 ********************************************************************/
494 static bool parse_share_modes(TDB_DATA dbuf
, struct share_mode_lock
*lck
)
496 struct locking_data data
;
499 if (dbuf
.dsize
< sizeof(struct locking_data
)) {
500 smb_panic("parse_share_modes: buffer too short");
503 memcpy(&data
, dbuf
.dptr
, sizeof(data
));
505 lck
->delete_on_close
= data
.u
.s
.delete_on_close
;
506 lck
->old_write_time
= data
.u
.s
.old_write_time
;
507 lck
->changed_write_time
= data
.u
.s
.changed_write_time
;
508 lck
->num_share_modes
= data
.u
.s
.num_share_mode_entries
;
510 DEBUG(10, ("parse_share_modes: delete_on_close: %d, owrt: %s, "
511 "cwrt: %s, tok: %u, num_share_modes: %d\n",
512 lck
->delete_on_close
,
513 timestring(debug_ctx(),
514 convert_timespec_to_time_t(lck
->old_write_time
)),
515 timestring(debug_ctx(),
516 convert_timespec_to_time_t(
517 lck
->changed_write_time
)),
518 (unsigned int)data
.u
.s
.delete_token_size
,
519 lck
->num_share_modes
));
521 if ((lck
->num_share_modes
< 0) || (lck
->num_share_modes
> 1000000)) {
522 DEBUG(0, ("invalid number of share modes: %d\n",
523 lck
->num_share_modes
));
524 smb_panic("parse_share_modes: invalid number of share modes");
527 lck
->share_modes
= NULL
;
529 if (lck
->num_share_modes
!= 0) {
531 if (dbuf
.dsize
< (sizeof(struct locking_data
) +
532 (lck
->num_share_modes
*
533 sizeof(struct share_mode_entry
)))) {
534 smb_panic("parse_share_modes: buffer too short");
537 lck
->share_modes
= (struct share_mode_entry
*)
539 dbuf
.dptr
+sizeof(struct locking_data
),
540 lck
->num_share_modes
*
541 sizeof(struct share_mode_entry
));
543 if (lck
->share_modes
== NULL
) {
544 smb_panic("parse_share_modes: talloc failed");
548 /* Get any delete token. */
549 if (data
.u
.s
.delete_token_size
) {
550 uint8
*p
= dbuf
.dptr
+ sizeof(struct locking_data
) +
551 (lck
->num_share_modes
*
552 sizeof(struct share_mode_entry
));
554 if ((data
.u
.s
.delete_token_size
< sizeof(uid_t
) + sizeof(gid_t
)) ||
555 ((data
.u
.s
.delete_token_size
- sizeof(uid_t
)) % sizeof(gid_t
)) != 0) {
556 DEBUG(0, ("parse_share_modes: invalid token size %d\n",
557 data
.u
.s
.delete_token_size
));
558 smb_panic("parse_share_modes: invalid token size");
561 lck
->delete_token
= TALLOC_P(lck
, UNIX_USER_TOKEN
);
562 if (!lck
->delete_token
) {
563 smb_panic("parse_share_modes: talloc failed");
566 /* Copy out the uid and gid. */
567 memcpy(&lck
->delete_token
->uid
, p
, sizeof(uid_t
));
569 memcpy(&lck
->delete_token
->gid
, p
, sizeof(gid_t
));
572 /* Any supplementary groups ? */
573 lck
->delete_token
->ngroups
= (data
.u
.s
.delete_token_size
> (sizeof(uid_t
) + sizeof(gid_t
))) ?
574 ((data
.u
.s
.delete_token_size
-
575 (sizeof(uid_t
) + sizeof(gid_t
)))/sizeof(gid_t
)) : 0;
577 if (lck
->delete_token
->ngroups
) {
578 /* Make this a talloc child of lck->delete_token. */
579 lck
->delete_token
->groups
= TALLOC_ARRAY(lck
->delete_token
, gid_t
,
580 lck
->delete_token
->ngroups
);
581 if (!lck
->delete_token
) {
582 smb_panic("parse_share_modes: talloc failed");
585 for (i
= 0; i
< lck
->delete_token
->ngroups
; i
++) {
586 memcpy(&lck
->delete_token
->groups
[i
], p
, sizeof(gid_t
));
592 lck
->delete_token
= NULL
;
595 /* Save off the associated service path and filename. */
596 lck
->servicepath
= (const char *)dbuf
.dptr
+ sizeof(struct locking_data
) +
597 (lck
->num_share_modes
* sizeof(struct share_mode_entry
)) +
598 data
.u
.s
.delete_token_size
;
600 lck
->filename
= (const char *)dbuf
.dptr
+ sizeof(struct locking_data
) +
601 (lck
->num_share_modes
* sizeof(struct share_mode_entry
)) +
602 data
.u
.s
.delete_token_size
+
603 strlen(lck
->servicepath
) + 1;
606 * Ensure that each entry has a real process attached.
609 for (i
= 0; i
< lck
->num_share_modes
; i
++) {
610 struct share_mode_entry
*entry_p
= &lck
->share_modes
[i
];
612 if (DEBUGLEVEL
>= 10) {
613 str
= share_mode_str(NULL
, i
, entry_p
);
615 DEBUG(10,("parse_share_modes: %s\n",
617 if (!process_exists(entry_p
->pid
)) {
618 DEBUG(10,("parse_share_modes: deleted %s\n",
620 entry_p
->op_type
= UNUSED_SHARE_MODE_ENTRY
;
621 lck
->modified
= True
;
629 static TDB_DATA
unparse_share_modes(struct share_mode_lock
*lck
)
634 struct locking_data
*data
;
637 uint32 delete_token_size
;
642 for (i
=0; i
<lck
->num_share_modes
; i
++) {
643 if (!is_unused_share_mode_entry(&lck
->share_modes
[i
])) {
648 if (num_valid
== 0) {
652 sp_len
= strlen(lck
->servicepath
);
653 delete_token_size
= (lck
->delete_token
?
654 (sizeof(uid_t
) + sizeof(gid_t
) + (lck
->delete_token
->ngroups
*sizeof(gid_t
))) : 0);
656 result
.dsize
= sizeof(*data
) +
657 lck
->num_share_modes
* sizeof(struct share_mode_entry
) +
660 strlen(lck
->filename
) + 1;
661 result
.dptr
= TALLOC_ARRAY(lck
, uint8
, result
.dsize
);
663 if (result
.dptr
== NULL
) {
664 smb_panic("talloc failed");
667 data
= (struct locking_data
*)result
.dptr
;
669 data
->u
.s
.num_share_mode_entries
= lck
->num_share_modes
;
670 data
->u
.s
.delete_on_close
= lck
->delete_on_close
;
671 data
->u
.s
.old_write_time
= lck
->old_write_time
;
672 data
->u
.s
.changed_write_time
= lck
->changed_write_time
;
673 data
->u
.s
.delete_token_size
= delete_token_size
;
675 DEBUG(10,("unparse_share_modes: del: %d, owrt: %s cwrt: %s, tok: %u, "
676 "num: %d\n", data
->u
.s
.delete_on_close
,
677 timestring(debug_ctx(),
678 convert_timespec_to_time_t(lck
->old_write_time
)),
679 timestring(debug_ctx(),
680 convert_timespec_to_time_t(
681 lck
->changed_write_time
)),
682 (unsigned int)data
->u
.s
.delete_token_size
,
683 data
->u
.s
.num_share_mode_entries
));
685 memcpy(result
.dptr
+ sizeof(*data
), lck
->share_modes
,
686 sizeof(struct share_mode_entry
)*lck
->num_share_modes
);
687 offset
= sizeof(*data
) +
688 sizeof(struct share_mode_entry
)*lck
->num_share_modes
;
690 /* Store any delete on close token. */
691 if (lck
->delete_token
) {
692 uint8
*p
= result
.dptr
+ offset
;
694 memcpy(p
, &lck
->delete_token
->uid
, sizeof(uid_t
));
697 memcpy(p
, &lck
->delete_token
->gid
, sizeof(gid_t
));
700 for (i
= 0; i
< lck
->delete_token
->ngroups
; i
++) {
701 memcpy(p
, &lck
->delete_token
->groups
[i
], sizeof(gid_t
));
704 offset
= p
- result
.dptr
;
707 safe_strcpy((char *)result
.dptr
+ offset
, lck
->servicepath
,
708 result
.dsize
- offset
- 1);
709 offset
+= sp_len
+ 1;
710 safe_strcpy((char *)result
.dptr
+ offset
, lck
->filename
,
711 result
.dsize
- offset
- 1);
713 if (DEBUGLEVEL
>= 10) {
714 print_share_mode_table(data
);
720 static int share_mode_lock_destructor(struct share_mode_lock
*lck
)
725 if (!lck
->modified
) {
729 data
= unparse_share_modes(lck
);
731 if (data
.dptr
== NULL
) {
733 /* There has been an entry before, delete it */
735 status
= lck
->record
->delete_rec(lck
->record
);
736 if (!NT_STATUS_IS_OK(status
)) {
737 DEBUG(0, ("delete_rec returned %s\n",
739 smb_panic("could not delete share entry");
745 status
= lck
->record
->store(lck
->record
, data
, TDB_REPLACE
);
746 if (!NT_STATUS_IS_OK(status
)) {
747 DEBUG(0, ("store returned %s\n", nt_errstr(status
)));
748 smb_panic("could not store share mode entry");
756 static bool fill_share_mode_lock(struct share_mode_lock
*lck
,
758 const char *servicepath
,
760 TDB_DATA share_mode_data
,
761 const struct timespec
*old_write_time
)
763 /* Ensure we set every field here as the destructor must be
764 valid even if parse_share_modes fails. */
766 lck
->servicepath
= NULL
;
767 lck
->filename
= NULL
;
769 lck
->num_share_modes
= 0;
770 lck
->share_modes
= NULL
;
771 lck
->delete_token
= NULL
;
772 lck
->delete_on_close
= False
;
773 ZERO_STRUCT(lck
->old_write_time
);
774 ZERO_STRUCT(lck
->changed_write_time
);
776 lck
->modified
= False
;
778 lck
->fresh
= (share_mode_data
.dptr
== NULL
);
781 if (fname
== NULL
|| servicepath
== NULL
782 || old_write_time
== NULL
) {
785 lck
->filename
= talloc_strdup(lck
, fname
);
786 lck
->servicepath
= talloc_strdup(lck
, servicepath
);
787 if (lck
->filename
== NULL
|| lck
->servicepath
== NULL
) {
788 DEBUG(0, ("talloc failed\n"));
791 lck
->old_write_time
= *old_write_time
;
793 if (!parse_share_modes(share_mode_data
, lck
)) {
794 DEBUG(0, ("Could not parse share modes\n"));
802 struct share_mode_lock
*get_share_mode_lock(TALLOC_CTX
*mem_ctx
,
803 const struct file_id id
,
804 const char *servicepath
,
806 const struct timespec
*old_write_time
)
808 struct share_mode_lock
*lck
;
810 TDB_DATA key
= locking_key(&id
, &tmp
);
812 if (!(lck
= TALLOC_P(mem_ctx
, struct share_mode_lock
))) {
813 DEBUG(0, ("talloc failed\n"));
817 if (!(lck
->record
= lock_db
->fetch_locked(lock_db
, lck
, key
))) {
818 DEBUG(3, ("Could not lock share entry\n"));
823 if (!fill_share_mode_lock(lck
, id
, servicepath
, fname
,
824 lck
->record
->value
, old_write_time
)) {
825 DEBUG(3, ("fill_share_mode_lock failed\n"));
830 talloc_set_destructor(lck
, share_mode_lock_destructor
);
835 struct share_mode_lock
*fetch_share_mode_unlocked(TALLOC_CTX
*mem_ctx
,
836 const struct file_id id
,
837 const char *servicepath
,
840 struct share_mode_lock
*lck
;
842 TDB_DATA key
= locking_key(&id
, &tmp
);
845 if (!(lck
= TALLOC_P(mem_ctx
, struct share_mode_lock
))) {
846 DEBUG(0, ("talloc failed\n"));
850 if (lock_db
->fetch(lock_db
, lck
, key
, &data
) == -1) {
851 DEBUG(3, ("Could not fetch share entry\n"));
856 if (!fill_share_mode_lock(lck
, id
, servicepath
, fname
, data
, NULL
)) {
857 DEBUG(3, ("fill_share_mode_lock failed\n"));
865 /*******************************************************************
866 Sets the service name and filename for rename.
867 At this point we emit "file renamed" messages to all
868 process id's that have this file open.
869 Based on an initial code idea from SATOH Fumiyasu <fumiya@samba.gr.jp>
870 ********************************************************************/
872 bool rename_share_filename(struct messaging_context
*msg_ctx
,
873 struct share_mode_lock
*lck
,
874 const char *servicepath
,
883 DEBUG(10, ("rename_share_filename: servicepath %s newname %s\n",
884 servicepath
, newname
));
887 * rename_internal_fsp() and rename_internals() add './' to
888 * head of newname if newname does not contain a '/'.
890 while (newname
[0] && newname
[1] && newname
[0] == '.' && newname
[1] == '/') {
894 lck
->servicepath
= talloc_strdup(lck
, servicepath
);
895 lck
->filename
= talloc_strdup(lck
, newname
);
896 if (lck
->filename
== NULL
|| lck
->servicepath
== NULL
) {
897 DEBUG(0, ("rename_share_filename: talloc failed\n"));
900 lck
->modified
= True
;
902 sp_len
= strlen(lck
->servicepath
);
903 fn_len
= strlen(lck
->filename
);
905 msg_len
= MSG_FILE_RENAMED_MIN_SIZE
+ sp_len
+ 1 + fn_len
+ 1;
907 /* Set up the name changed message. */
908 frm
= TALLOC_ARRAY(lck
, char, msg_len
);
913 push_file_id_16(frm
, &lck
->id
);
915 DEBUG(10,("rename_share_filename: msg_len = %u\n", (unsigned int)msg_len
));
917 safe_strcpy(&frm
[16], lck
->servicepath
, sp_len
);
918 safe_strcpy(&frm
[16 + sp_len
+ 1], lck
->filename
, fn_len
);
920 /* Send the messages. */
921 for (i
=0; i
<lck
->num_share_modes
; i
++) {
922 struct share_mode_entry
*se
= &lck
->share_modes
[i
];
923 if (!is_valid_share_mode_entry(se
)) {
926 /* But not to ourselves... */
927 if (procid_is_me(&se
->pid
)) {
931 DEBUG(10,("rename_share_filename: sending rename message to pid %s "
932 "file_id %s sharepath %s newname %s\n",
933 procid_str_static(&se
->pid
),
934 file_id_string_tos(&lck
->id
),
935 lck
->servicepath
, lck
->filename
));
937 messaging_send_buf(msg_ctx
, se
->pid
, MSG_SMB_FILE_RENAME
,
938 (uint8
*)frm
, msg_len
);
944 void get_file_infos(struct file_id id
,
945 bool *delete_on_close
,
946 struct timespec
*write_time
)
948 struct share_mode_lock
*lck
;
950 if (delete_on_close
) {
951 *delete_on_close
= false;
955 ZERO_STRUCTP(write_time
);
958 if (!(lck
= fetch_share_mode_unlocked(talloc_tos(), id
, NULL
, NULL
))) {
962 if (delete_on_close
) {
963 *delete_on_close
= lck
->delete_on_close
;
969 wt
= lck
->changed_write_time
;
970 if (null_timespec(wt
)) {
971 wt
= lck
->old_write_time
;
980 bool is_valid_share_mode_entry(const struct share_mode_entry
*e
)
984 if (e
->op_type
== UNUSED_SHARE_MODE_ENTRY
) {
985 /* cope with dead entries from the process not
986 existing. These should not be considered valid,
987 otherwise we end up doing zero timeout sharing
992 num_props
+= ((e
->op_type
== NO_OPLOCK
) ? 1 : 0);
993 num_props
+= (EXCLUSIVE_OPLOCK_TYPE(e
->op_type
) ? 1 : 0);
994 num_props
+= (LEVEL_II_OPLOCK_TYPE(e
->op_type
) ? 1 : 0);
996 SMB_ASSERT(num_props
<= 1);
997 return (num_props
!= 0);
1000 bool is_deferred_open_entry(const struct share_mode_entry
*e
)
1002 return (e
->op_type
== DEFERRED_OPEN_ENTRY
);
1005 bool is_unused_share_mode_entry(const struct share_mode_entry
*e
)
1007 return (e
->op_type
== UNUSED_SHARE_MODE_ENTRY
);
1010 /*******************************************************************
1011 Fill a share mode entry.
1012 ********************************************************************/
1014 static void fill_share_mode_entry(struct share_mode_entry
*e
,
1016 uid_t uid
, uint16 mid
, uint16 op_type
)
1019 e
->pid
= procid_self();
1020 e
->share_access
= fsp
->share_access
;
1021 e
->private_options
= fsp
->fh
->private_options
;
1022 e
->access_mask
= fsp
->access_mask
;
1024 e
->op_type
= op_type
;
1025 e
->time
.tv_sec
= fsp
->open_time
.tv_sec
;
1026 e
->time
.tv_usec
= fsp
->open_time
.tv_usec
;
1027 e
->id
= fsp
->file_id
;
1028 e
->share_file_id
= fsp
->fh
->gen_id
;
1029 e
->uid
= (uint32
)uid
;
1030 e
->flags
= fsp
->posix_open
? SHARE_MODE_FLAG_POSIX_OPEN
: 0;
1033 static void fill_deferred_open_entry(struct share_mode_entry
*e
,
1034 const struct timeval request_time
,
1035 struct file_id id
, uint16 mid
)
1038 e
->pid
= procid_self();
1040 e
->op_type
= DEFERRED_OPEN_ENTRY
;
1041 e
->time
.tv_sec
= request_time
.tv_sec
;
1042 e
->time
.tv_usec
= request_time
.tv_usec
;
1044 e
->uid
= (uint32
)-1;
1048 static void add_share_mode_entry(struct share_mode_lock
*lck
,
1049 const struct share_mode_entry
*entry
)
1053 for (i
=0; i
<lck
->num_share_modes
; i
++) {
1054 struct share_mode_entry
*e
= &lck
->share_modes
[i
];
1055 if (is_unused_share_mode_entry(e
)) {
1061 if (i
== lck
->num_share_modes
) {
1062 /* No unused entry found */
1063 ADD_TO_ARRAY(lck
, struct share_mode_entry
, *entry
,
1064 &lck
->share_modes
, &lck
->num_share_modes
);
1066 lck
->modified
= True
;
1069 void set_share_mode(struct share_mode_lock
*lck
, files_struct
*fsp
,
1070 uid_t uid
, uint16 mid
, uint16 op_type
, bool initial_delete_on_close_allowed
)
1072 struct share_mode_entry entry
;
1073 fill_share_mode_entry(&entry
, fsp
, uid
, mid
, op_type
);
1074 if (initial_delete_on_close_allowed
) {
1075 entry
.flags
|= SHARE_MODE_ALLOW_INITIAL_DELETE_ON_CLOSE
;
1077 add_share_mode_entry(lck
, &entry
);
1080 void add_deferred_open(struct share_mode_lock
*lck
, uint16 mid
,
1081 struct timeval request_time
,
1084 struct share_mode_entry entry
;
1085 fill_deferred_open_entry(&entry
, request_time
, id
, mid
);
1086 add_share_mode_entry(lck
, &entry
);
1089 /*******************************************************************
1090 Check if two share mode entries are identical, ignoring oplock
1091 and mid info and desired_access. (Removed paranoia test - it's
1092 not automatically a logic error if they are identical. JRA.)
1093 ********************************************************************/
1095 static bool share_modes_identical(struct share_mode_entry
*e1
,
1096 struct share_mode_entry
*e2
)
1098 /* We used to check for e1->share_access == e2->share_access here
1099 as well as the other fields but 2 different DOS or FCB opens
1100 sharing the same share mode entry may validly differ in
1101 fsp->share_access field. */
1103 return (procid_equal(&e1
->pid
, &e2
->pid
) &&
1104 file_id_equal(&e1
->id
, &e2
->id
) &&
1105 e1
->share_file_id
== e2
->share_file_id
);
1108 static bool deferred_open_identical(struct share_mode_entry
*e1
,
1109 struct share_mode_entry
*e2
)
1111 return (procid_equal(&e1
->pid
, &e2
->pid
) &&
1112 (e1
->op_mid
== e2
->op_mid
) &&
1113 file_id_equal(&e1
->id
, &e2
->id
));
1116 static struct share_mode_entry
*find_share_mode_entry(struct share_mode_lock
*lck
,
1117 struct share_mode_entry
*entry
)
1121 for (i
=0; i
<lck
->num_share_modes
; i
++) {
1122 struct share_mode_entry
*e
= &lck
->share_modes
[i
];
1123 if (is_valid_share_mode_entry(entry
) &&
1124 is_valid_share_mode_entry(e
) &&
1125 share_modes_identical(e
, entry
)) {
1128 if (is_deferred_open_entry(entry
) &&
1129 is_deferred_open_entry(e
) &&
1130 deferred_open_identical(e
, entry
)) {
1137 /*******************************************************************
1138 Del the share mode of a file for this process. Return the number of
1140 ********************************************************************/
1142 bool del_share_mode(struct share_mode_lock
*lck
, files_struct
*fsp
)
1144 struct share_mode_entry entry
, *e
;
1146 /* Don't care about the pid owner being correct here - just a search. */
1147 fill_share_mode_entry(&entry
, fsp
, (uid_t
)-1, 0, NO_OPLOCK
);
1149 e
= find_share_mode_entry(lck
, &entry
);
1154 e
->op_type
= UNUSED_SHARE_MODE_ENTRY
;
1155 lck
->modified
= True
;
1159 void del_deferred_open_entry(struct share_mode_lock
*lck
, uint16 mid
)
1161 struct share_mode_entry entry
, *e
;
1163 fill_deferred_open_entry(&entry
, timeval_zero(),
1166 e
= find_share_mode_entry(lck
, &entry
);
1171 e
->op_type
= UNUSED_SHARE_MODE_ENTRY
;
1172 lck
->modified
= True
;
1175 /*******************************************************************
1176 Remove an oplock mid and mode entry from a share mode.
1177 ********************************************************************/
1179 bool remove_share_oplock(struct share_mode_lock
*lck
, files_struct
*fsp
)
1181 struct share_mode_entry entry
, *e
;
1183 /* Don't care about the pid owner being correct here - just a search. */
1184 fill_share_mode_entry(&entry
, fsp
, (uid_t
)-1, 0, NO_OPLOCK
);
1186 e
= find_share_mode_entry(lck
, &entry
);
1192 e
->op_type
= NO_OPLOCK
;
1193 lck
->modified
= True
;
1197 /*******************************************************************
1198 Downgrade a oplock type from exclusive to level II.
1199 ********************************************************************/
1201 bool downgrade_share_oplock(struct share_mode_lock
*lck
, files_struct
*fsp
)
1203 struct share_mode_entry entry
, *e
;
1205 /* Don't care about the pid owner being correct here - just a search. */
1206 fill_share_mode_entry(&entry
, fsp
, (uid_t
)-1, 0, NO_OPLOCK
);
1208 e
= find_share_mode_entry(lck
, &entry
);
1213 e
->op_type
= LEVEL_II_OPLOCK
;
1214 lck
->modified
= True
;
1218 /****************************************************************************
1219 Deal with the internal needs of setting the delete on close flag. Note that
1220 as the tdb locking is recursive, it is safe to call this from within
1221 open_file_ntcreate. JRA.
1222 ****************************************************************************/
1224 NTSTATUS
can_set_delete_on_close(files_struct
*fsp
, bool delete_on_close
,
1227 if (!delete_on_close
) {
1228 return NT_STATUS_OK
;
1232 * Only allow delete on close for writable files.
1235 if ((dosmode
& aRONLY
) &&
1236 !lp_delete_readonly(SNUM(fsp
->conn
))) {
1237 DEBUG(10,("can_set_delete_on_close: file %s delete on close "
1238 "flag set but file attribute is readonly.\n",
1240 return NT_STATUS_CANNOT_DELETE
;
1244 * Only allow delete on close for writable shares.
1247 if (!CAN_WRITE(fsp
->conn
)) {
1248 DEBUG(10,("can_set_delete_on_close: file %s delete on "
1249 "close flag set but write access denied on share.\n",
1251 return NT_STATUS_ACCESS_DENIED
;
1255 * Only allow delete on close for files/directories opened with delete
1259 if (!(fsp
->access_mask
& DELETE_ACCESS
)) {
1260 DEBUG(10,("can_set_delete_on_close: file %s delete on "
1261 "close flag set but delete access denied.\n",
1263 return NT_STATUS_ACCESS_DENIED
;
1266 /* Don't allow delete on close for non-empty directories. */
1267 if (fsp
->is_directory
) {
1268 return can_delete_directory(fsp
->conn
, fsp
->fsp_name
);
1271 return NT_STATUS_OK
;
1274 /****************************************************************************
1275 Do we have an open file handle that created this entry ?
1276 ****************************************************************************/
1278 bool can_set_initial_delete_on_close(const struct share_mode_lock
*lck
)
1282 for (i
=0; i
<lck
->num_share_modes
; i
++) {
1283 if (lck
->share_modes
[i
].flags
& SHARE_MODE_ALLOW_INITIAL_DELETE_ON_CLOSE
) {
1290 /*************************************************************************
1291 Return a talloced copy of a UNIX_USER_TOKEN. NULL on fail.
1292 (Should this be in locking.c.... ?).
1293 *************************************************************************/
1295 static UNIX_USER_TOKEN
*copy_unix_token(TALLOC_CTX
*ctx
, UNIX_USER_TOKEN
*tok
)
1297 UNIX_USER_TOKEN
*cpy
;
1303 cpy
= TALLOC_P(ctx
, UNIX_USER_TOKEN
);
1308 cpy
->uid
= tok
->uid
;
1309 cpy
->gid
= tok
->gid
;
1310 cpy
->ngroups
= tok
->ngroups
;
1312 /* Make this a talloc child of cpy. */
1313 cpy
->groups
= TALLOC_ARRAY(cpy
, gid_t
, tok
->ngroups
);
1317 memcpy(cpy
->groups
, tok
->groups
, tok
->ngroups
* sizeof(gid_t
));
1322 /****************************************************************************
1323 Replace the delete on close token.
1324 ****************************************************************************/
1326 void set_delete_on_close_token(struct share_mode_lock
*lck
, UNIX_USER_TOKEN
*tok
)
1328 TALLOC_FREE(lck
->delete_token
); /* Also deletes groups... */
1330 /* Copy the new token (can be NULL). */
1331 lck
->delete_token
= copy_unix_token(lck
, tok
);
1332 lck
->modified
= True
;
1335 /****************************************************************************
1336 Sets the delete on close flag over all share modes on this file.
1337 Modify the share mode entry for all files open
1338 on this device and inode to tell other smbds we have
1339 changed the delete on close flag. This will be noticed
1340 in the close code, the last closer will delete the file
1342 This makes a copy of any UNIX_USER_TOKEN into the
1343 lck entry. This function is used when the lock is already granted.
1344 ****************************************************************************/
1346 void set_delete_on_close_lck(struct share_mode_lock
*lck
, bool delete_on_close
, UNIX_USER_TOKEN
*tok
)
1348 if (lck
->delete_on_close
!= delete_on_close
) {
1349 set_delete_on_close_token(lck
, tok
);
1350 lck
->delete_on_close
= delete_on_close
;
1351 if (delete_on_close
) {
1352 SMB_ASSERT(lck
->delete_token
!= NULL
);
1354 lck
->modified
= True
;
1358 bool set_delete_on_close(files_struct
*fsp
, bool delete_on_close
, UNIX_USER_TOKEN
*tok
)
1360 struct share_mode_lock
*lck
;
1362 DEBUG(10,("set_delete_on_close: %s delete on close flag for "
1363 "fnum = %d, file %s\n",
1364 delete_on_close
? "Adding" : "Removing", fsp
->fnum
,
1367 lck
= get_share_mode_lock(talloc_tos(), fsp
->file_id
, NULL
, NULL
,
1373 set_delete_on_close_lck(lck
, delete_on_close
, tok
);
1375 if (fsp
->is_directory
) {
1376 send_stat_cache_delete_message(fsp
->fsp_name
);
1383 /****************************************************************************
1384 Sets the allow initial delete on close flag for this share mode.
1385 ****************************************************************************/
1387 bool set_allow_initial_delete_on_close(struct share_mode_lock
*lck
, files_struct
*fsp
, bool delete_on_close
)
1389 struct share_mode_entry entry
, *e
;
1391 /* Don't care about the pid owner being correct here - just a search. */
1392 fill_share_mode_entry(&entry
, fsp
, (uid_t
)-1, 0, NO_OPLOCK
);
1394 e
= find_share_mode_entry(lck
, &entry
);
1399 if (delete_on_close
) {
1400 e
->flags
|= SHARE_MODE_ALLOW_INITIAL_DELETE_ON_CLOSE
;
1402 e
->flags
&= ~SHARE_MODE_ALLOW_INITIAL_DELETE_ON_CLOSE
;
1404 lck
->modified
= True
;
1408 bool set_sticky_write_time(struct file_id fileid
, struct timespec write_time
)
1410 struct share_mode_lock
*lck
;
1412 DEBUG(5,("set_sticky_write_time: %s id=%s\n",
1413 timestring(debug_ctx(),
1414 convert_timespec_to_time_t(write_time
)),
1415 file_id_string_tos(&fileid
)));
1417 lck
= get_share_mode_lock(NULL
, fileid
, NULL
, NULL
, NULL
);
1422 if (timespec_compare(&lck
->changed_write_time
, &write_time
) != 0) {
1423 lck
->modified
= True
;
1424 lck
->changed_write_time
= write_time
;
1431 bool set_write_time(struct file_id fileid
, struct timespec write_time
)
1433 struct share_mode_lock
*lck
;
1435 DEBUG(5,("set_write_time: %s id=%s\n",
1436 timestring(debug_ctx(),
1437 convert_timespec_to_time_t(write_time
)),
1438 file_id_string_tos(&fileid
)));
1440 lck
= get_share_mode_lock(NULL
, fileid
, NULL
, NULL
, NULL
);
1445 if (timespec_compare(&lck
->old_write_time
, &write_time
) != 0) {
1446 lck
->modified
= True
;
1447 lck
->old_write_time
= write_time
;
1455 struct forall_state
{
1456 void (*fn
)(const struct share_mode_entry
*entry
,
1457 const char *sharepath
,
1459 void *private_data
);
1463 static int traverse_fn(struct db_record
*rec
, void *_state
)
1465 struct forall_state
*state
= (struct forall_state
*)_state
;
1466 struct locking_data
*data
;
1467 struct share_mode_entry
*shares
;
1468 const char *sharepath
;
1472 /* Ensure this is a locking_key record. */
1473 if (rec
->key
.dsize
!= sizeof(struct file_id
))
1476 data
= (struct locking_data
*)rec
->value
.dptr
;
1477 shares
= (struct share_mode_entry
*)(rec
->value
.dptr
+ sizeof(*data
));
1478 sharepath
= (const char *)rec
->value
.dptr
+ sizeof(*data
) +
1479 data
->u
.s
.num_share_mode_entries
*sizeof(*shares
) +
1480 data
->u
.s
.delete_token_size
;
1481 fname
= (const char *)rec
->value
.dptr
+ sizeof(*data
) +
1482 data
->u
.s
.num_share_mode_entries
*sizeof(*shares
) +
1483 data
->u
.s
.delete_token_size
+
1484 strlen(sharepath
) + 1;
1486 for (i
=0;i
<data
->u
.s
.num_share_mode_entries
;i
++) {
1487 state
->fn(&shares
[i
], sharepath
, fname
,
1488 state
->private_data
);
1493 /*******************************************************************
1494 Call the specified function on each entry under management by the
1496 ********************************************************************/
1498 int share_mode_forall(void (*fn
)(const struct share_mode_entry
*, const char *,
1499 const char *, void *),
1502 struct forall_state state
;
1504 if (lock_db
== NULL
)
1508 state
.private_data
= private_data
;
1510 return lock_db
->traverse_read(lock_db
, traverse_fn
, (void *)&state
);