33
35
struct server_id server_id,
36
static void brl_timeout_fn(struct event_context *event_ctx,
38
void brl_timeout_fn(struct event_context *event_ctx,
37
39
struct timed_event *te,
38
40
struct timeval now,
39
41
void *private_data)
41
SMB_ASSERT(brl_timeout == te);
42
TALLOC_FREE(brl_timeout);
43
struct smbd_server_connection *sconn = talloc_get_type_abort(
44
private_data, struct smbd_server_connection);
46
if (sconn->using_smb2) {
47
SMB_ASSERT(sconn->smb2.locks.brl_timeout == te);
48
TALLOC_FREE(sconn->smb2.locks.brl_timeout);
50
SMB_ASSERT(sconn->smb1.locks.brl_timeout == te);
51
TALLOC_FREE(sconn->smb1.locks.brl_timeout);
44
54
change_to_root_user(); /* TODO: Possibly run all timed events as
47
process_blocking_lock_queue();
57
process_blocking_lock_queue(sconn);
50
60
/****************************************************************************
51
61
We need a version of timeval_min that treats zero timval as infinite.
52
62
****************************************************************************/
54
static struct timeval timeval_brl_min(const struct timeval *tv1,
64
struct timeval timeval_brl_min(const struct timeval *tv1,
55
65
const struct timeval *tv2)
57
67
if (timeval_is_zero(tv1)) {
69
79
****************************************************************************/
71
static bool recalc_brl_timeout(void)
81
static bool recalc_brl_timeout(struct smbd_server_connection *sconn)
73
83
struct blocking_lock_record *blr;
74
84
struct timeval next_timeout;
75
85
int max_brl_timeout = lp_parm_int(-1, "brl", "recalctime", 5);
77
TALLOC_FREE(brl_timeout);
79
next_timeout = timeval_zero();
81
for (blr = blocking_lock_queue; blr; blr = blr->next) {
87
TALLOC_FREE(sconn->smb1.locks.brl_timeout);
89
next_timeout = timeval_zero();
91
for (blr = sconn->smb1.locks.blocking_lock_queue; blr; blr = blr->next) {
82
92
if (timeval_is_zero(&blr->expire_time)) {
84
* If we're blocked on pid 0xFFFFFFFF this is
94
* If we're blocked on pid 0xFFFFFFFFFFFFFFFFLL this is
85
95
* a POSIX lock, so calculate a timeout of
86
96
* 10 seconds into the future.
88
if (blr->blocking_pid == 0xFFFFFFFF) {
98
if (blr->blocking_smblctx == 0xFFFFFFFFFFFFFFFFLL) {
89
99
struct timeval psx_to = timeval_current_ofs(10, 0);
90
100
next_timeout = timeval_brl_min(&next_timeout, &psx_to);
118
128
if (max_brl_timeout > 0) {
119
129
struct timeval min_to = timeval_current_ofs(max_brl_timeout, 0);
120
next_timeout = timeval_min(&next_timeout, &min_to);
130
next_timeout = timeval_min(&next_timeout, &min_to);
123
133
if (DEBUGLVL(10)) {
129
139
(int)from_now.tv_sec, (int)from_now.tv_usec));
132
if (!(brl_timeout = event_add_timed(smbd_event_context(), NULL,
134
brl_timeout_fn, NULL))) {
142
sconn->smb1.locks.brl_timeout = event_add_timed(smbd_event_context(),
144
brl_timeout_fn, sconn);
145
if (sconn->smb1.locks.brl_timeout == NULL) {
148
159
files_struct *fsp,
149
160
int lock_timeout,
152
163
enum brl_type lock_type,
153
164
enum brl_flavour lock_flav,
156
uint32_t blocking_pid)
167
uint64_t blocking_smblctx)
169
struct smbd_server_connection *sconn = req->sconn;
158
170
struct blocking_lock_record *blr;
174
return push_blocking_lock_request_smb2(br_lck,
161
187
if(req_is_in_chain(req)) {
162
188
DEBUG(0,("push_blocking_lock_request: cannot queue a chained request (currently).\n"));
186
212
(lock_timeout % 1000) * 1000);
188
214
blr->lock_num = lock_num;
189
blr->lock_pid = lock_pid;
190
blr->blocking_pid = blocking_pid;
215
blr->smblctx = smblctx;
216
blr->blocking_smblctx = blocking_smblctx;
191
217
blr->lock_flav = lock_flav;
192
218
blr->lock_type = lock_type;
193
219
blr->offset = offset;
197
223
blr->blr_private = NULL;
199
225
/* Add a pending lock record for this. */
200
status = brl_lock(smbd_messaging_context(),
226
status = brl_lock(req->sconn->msg_ctx,
229
sconn_server_id(req->sconn),
206
232
lock_type == READ_LOCK ? PENDING_READ_LOCK : PENDING_WRITE_LOCK,
218
244
SMB_PERFCOUNT_DEFER_OP(&req->pcd, &req->pcd);
219
245
blr->req = talloc_move(blr, &req);
221
DLIST_ADD_END(blocking_lock_queue, blr, struct blocking_lock_record *);
222
recalc_brl_timeout();
247
DLIST_ADD_END(sconn->smb1.locks.blocking_lock_queue, blr, struct blocking_lock_record *);
248
recalc_brl_timeout(sconn);
224
250
/* Ensure we'll receive messages when this is unlocked. */
225
if (!blocking_lock_unlock_state) {
226
messaging_register(smbd_messaging_context(), NULL,
251
if (!sconn->smb1.locks.blocking_lock_unlock_state) {
252
messaging_register(sconn->msg_ctx, NULL,
227
253
MSG_SMB_UNLOCK, received_unlock_msg);
228
blocking_lock_unlock_state = true;
254
sconn->smb1.locks.blocking_lock_unlock_state = true;
231
257
DEBUG(3,("push_blocking_lock_request: lock request blocked with "
274
300
files_struct *fsp = blr->fsp;
277
fsp->last_lock_failure.context.smbpid = blr->lock_pid;
303
fsp->last_lock_failure.context.smblctx = blr->smblctx;
278
304
fsp->last_lock_failure.context.tid = fsp->conn->cnum;
279
fsp->last_lock_failure.context.pid = procid_self();
305
fsp->last_lock_failure.context.pid =
306
sconn_server_id(fsp->conn->sconn);
280
307
fsp->last_lock_failure.start = blr->offset;
281
308
fsp->last_lock_failure.size = blr->count;
282
309
fsp->last_lock_failure.fnum = fsp->fnum;
288
315
reply_nterror(blr->req, status);
289
if (!srv_send_smb(smbd_server_fd(), (char *)blr->req->outbuf,
316
if (!srv_send_smb(blr->req->sconn, (char *)blr->req->outbuf,
290
317
true, blr->req->seqnum+1,
291
318
blr->req->encrypted, NULL)) {
292
319
exit_server_cleanly("generic_blocking_lock_error: srv_send_smb failed.");
304
331
files_struct *fsp = blr->fsp;
305
332
uint16 num_ulocks = SVAL(blr->req->vwv+6, 0);
306
333
uint64_t count = (uint64_t)0, offset = (uint64_t) 0;
308
335
unsigned char locktype = CVAL(blr->req->vwv+3, 0);
309
336
bool large_file_format = (locktype & LOCKING_ANDX_LARGE_FILES);
327
354
for(i = blr->lock_num - 1; i >= 0; i--) {
330
lock_pid = get_lock_pid( data, i, large_file_format);
357
smblctx = get_lock_pid( data, i, large_file_format);
331
358
count = get_lock_count( data, i, large_file_format);
332
359
offset = get_lock_offset( data, i, large_file_format, &err);
370
397
SCVAL(blr->req->outbuf,smb_com,SMBtrans2);
372
if (!srv_send_smb(smbd_server_fd(),
399
if (!srv_send_smb(blr->req->sconn,
373
400
(char *)blr->req->outbuf,
374
401
true, blr->req->seqnum+1,
375
402
IS_CONN_ENCRYPTED(blr->fsp->conn),
397
424
uint16 num_ulocks = SVAL(blr->req->vwv+6, 0);
398
425
uint16 num_locks = SVAL(blr->req->vwv+7, 0);
399
426
uint64_t count = (uint64_t)0, offset = (uint64_t)0;
401
428
bool large_file_format = (locktype & LOCKING_ANDX_LARGE_FILES);
403
430
NTSTATUS status = NT_STATUS_OK;
414
441
struct byte_range_lock *br_lck = NULL;
417
lock_pid = get_lock_pid( data, blr->lock_num, large_file_format);
444
smblctx = get_lock_pid( data, blr->lock_num, large_file_format);
418
445
count = get_lock_count( data, blr->lock_num, large_file_format);
419
446
offset = get_lock_offset( data, blr->lock_num, large_file_format, &err);
423
450
* request would never have been queued. JRA.
426
br_lck = do_lock(smbd_messaging_context(),
453
br_lck = do_lock(fsp->conn->sconn->msg_ctx,
431
458
((locktype & LOCKING_ANDX_SHARED_LOCK) ?
432
459
READ_LOCK : WRITE_LOCK),
463
&blr->blocking_smblctx,
439
466
TALLOC_FREE(br_lck);
545
573
/****************************************************************************
546
574
Cancel entries by fnum from the blocking lock pending queue.
575
Called when a file is closed.
547
576
*****************************************************************************/
549
void cancel_pending_lock_requests_by_fid(files_struct *fsp, struct byte_range_lock *br_lck)
578
void cancel_pending_lock_requests_by_fid(files_struct *fsp,
579
struct byte_range_lock *br_lck,
580
enum file_close_type close_type)
582
struct smbd_server_connection *sconn = fsp->conn->sconn;
551
583
struct blocking_lock_record *blr, *blr_cancelled, *next = NULL;
553
for(blr = blocking_lock_queue; blr; blr = next) {
585
if (sconn->using_smb2) {
586
cancel_pending_lock_requests_by_fid_smb2(fsp,
592
for(blr = sconn->smb1.locks.blocking_lock_queue; blr; blr = next) {
554
593
unsigned char locktype = 0;
556
595
next = blr->next;
566
605
"request type %d for file %s fnum = %d\n",
567
606
blr->req->cmd, fsp_str_dbg(fsp), fsp->fnum));
569
blr_cancelled = blocking_lock_cancel(fsp,
608
blr_cancelled = blocking_lock_cancel_smb1(fsp,
593
632
/****************************************************************************
594
633
Delete entries by mid from the blocking lock pending queue. Always send reply.
634
Only called from the SMB1 cancel code.
595
635
*****************************************************************************/
597
void remove_pending_lock_requests_by_mid(int mid)
637
void remove_pending_lock_requests_by_mid_smb1(
638
struct smbd_server_connection *sconn, uint64_t mid)
599
640
struct blocking_lock_record *blr, *next = NULL;
601
for(blr = blocking_lock_queue; blr; blr = next) {
642
for(blr = sconn->smb1.locks.blocking_lock_queue; blr; blr = next) {
602
643
files_struct *fsp;
603
644
struct byte_range_lock *br_lck;
612
653
br_lck = brl_get_locks(talloc_tos(), fsp);
615
DEBUG(10, ("remove_pending_lock_requests_by_mid - "
656
DEBUG(10, ("remove_pending_lock_requests_by_mid_smb1 - "
616
657
"removing request type %d for file %s fnum "
617
658
"= %d\n", blr->req->cmd, fsp_str_dbg(fsp),
620
661
brl_lock_cancel(br_lck,
663
sconn_server_id(sconn),
630
671
blocking_lock_reply_error(blr,NT_STATUS_FILE_LOCK_CONFLICT);
631
DLIST_REMOVE(blocking_lock_queue, blr);
672
DLIST_REMOVE(sconn->smb1.locks.blocking_lock_queue, blr);
632
673
TALLOC_FREE(blr);
636
677
/****************************************************************************
637
678
Is this mid a blocking lock request on the queue ?
679
Currently only called from the SMB1 unix extensions POSIX lock code.
638
680
*****************************************************************************/
640
bool blocking_lock_was_deferred(int mid)
682
bool blocking_lock_was_deferred_smb1(
683
struct smbd_server_connection *sconn, uint64_t mid)
642
685
struct blocking_lock_record *blr, *next = NULL;
644
for(blr = blocking_lock_queue; blr; blr = next) {
687
for(blr = sconn->smb1.locks.blocking_lock_queue; blr; blr = next) {
645
688
next = blr->next;
646
689
if(blr->req->mid == mid) {
660
703
struct server_id server_id,
706
struct smbd_server_connection *sconn;
708
sconn = msg_ctx_to_sconn(msg);
710
DEBUG(1, ("could not find sconn\n"));
663
714
DEBUG(10,("received_unlock_msg\n"));
664
process_blocking_lock_queue();
715
process_blocking_lock_queue(sconn);
667
718
/****************************************************************************
668
719
Process the blocking lock queue. Note that this is only called as root.
669
720
*****************************************************************************/
671
void process_blocking_lock_queue(void)
722
void process_blocking_lock_queue(struct smbd_server_connection *sconn)
673
724
struct timeval tv_curr = timeval_current();
674
725
struct blocking_lock_record *blr, *next = NULL;
727
if (sconn->using_smb2) {
728
process_blocking_lock_queue_smb2(sconn, tv_curr);
677
733
* Go through the queue and see if we can get any of the locks.
680
for (blr = blocking_lock_queue; blr; blr = next) {
736
for (blr = sconn->smb1.locks.blocking_lock_queue; blr; blr = next) {
682
738
next = blr->next;
755
811
blocking_lock_reply_error(blr,NT_STATUS_FILE_LOCK_CONFLICT);
756
DLIST_REMOVE(blocking_lock_queue, blr);
812
DLIST_REMOVE(sconn->smb1.locks.blocking_lock_queue, blr);
757
813
TALLOC_FREE(blr);
761
recalc_brl_timeout();
817
recalc_brl_timeout(sconn);
764
820
/****************************************************************************
773
829
struct server_id server_id,
832
struct smbd_server_connection *sconn;
777
834
const char *msg = (const char *)data->data;
778
835
struct blocking_lock_record *blr;
787
844
smb_panic("process_blocking_lock_cancel_message: bad msg");
847
sconn = msg_ctx_to_sconn(ctx);
849
DEBUG(1, ("could not find sconn\n"));
790
853
memcpy(&blr, msg, sizeof(blr));
791
854
memcpy(&err, &msg[sizeof(blr)], sizeof(NTSTATUS));
794
857
nt_errstr(err) ));
796
859
blocking_lock_reply_error(blr, err);
797
DLIST_REMOVE(blocking_lock_cancelled_queue, blr);
860
DLIST_REMOVE(sconn->smb1.locks.blocking_lock_cancelled_queue, blr);
798
861
TALLOC_FREE(blr);
801
864
/****************************************************************************
802
865
Send ourselves a blocking lock cancelled message. Handled asynchronously above.
803
866
Returns the blocking_lock_record that is being cancelled.
867
Only called from the SMB1 code.
804
868
*****************************************************************************/
806
struct blocking_lock_record *blocking_lock_cancel(files_struct *fsp,
870
struct blocking_lock_record *blocking_lock_cancel_smb1(files_struct *fsp,
810
874
enum brl_flavour lock_flav,
811
875
unsigned char locktype,
878
struct smbd_server_connection *sconn = fsp->conn->sconn;
814
879
char msg[MSG_BLOCKING_LOCK_CANCEL_SIZE];
815
880
struct blocking_lock_record *blr;
817
if (!blocking_lock_cancel_state) {
882
if (!sconn->smb1.locks.blocking_lock_cancel_state) {
818
883
/* Register our message. */
819
messaging_register(smbd_messaging_context(), NULL,
884
messaging_register(sconn->msg_ctx, NULL,
820
885
MSG_SMB_BLOCKING_LOCK_CANCEL,
821
886
process_blocking_lock_cancel_message);
823
blocking_lock_cancel_state = True;
888
sconn->smb1.locks.blocking_lock_cancel_state = True;
826
for (blr = blocking_lock_queue; blr; blr = blr->next) {
891
for (blr = sconn->smb1.locks.blocking_lock_queue; blr; blr = blr->next) {
827
892
if (fsp == blr->fsp &&
828
lock_pid == blr->lock_pid &&
893
smblctx == blr->smblctx &&
829
894
offset == blr->offset &&
830
895
count == blr->count &&
831
896
lock_flav == blr->lock_flav) {
847
912
/* Move to cancelled queue. */
848
DLIST_REMOVE(blocking_lock_queue, blr);
849
DLIST_ADD(blocking_lock_cancelled_queue, blr);
913
DLIST_REMOVE(sconn->smb1.locks.blocking_lock_queue, blr);
914
DLIST_ADD(sconn->smb1.locks.blocking_lock_cancelled_queue, blr);
851
916
/* Create the message. */
852
917
memcpy(msg, &blr, sizeof(blr));
853
918
memcpy(&msg[sizeof(blr)], &err, sizeof(NTSTATUS));
855
messaging_send_buf(smbd_messaging_context(), procid_self(),
920
messaging_send_buf(sconn->msg_ctx, sconn_server_id(sconn),
856
921
MSG_SMB_BLOCKING_LOCK_CANCEL,
857
922
(uint8 *)&msg, sizeof(msg));