r6234: Fix for possible root squash nfs bugs from psz@maths.usyd.edu.au
[ira/wip.git] / source3 / smbd / oplock.c
1 /* 
2    Unix SMB/CIFS implementation.
3    oplock processing
4    Copyright (C) Andrew Tridgell 1992-1998
5    Copyright (C) Jeremy Allison 1998 - 2001
6    
7    This program is free software; you can redistribute it and/or modify
8    it under the terms of the GNU General Public License as published by
9    the Free Software Foundation; either version 2 of the License, or
10    (at your option) any later version.
11    
12    This program is distributed in the hope that it will be useful,
13    but WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15    GNU General Public License for more details.
16    
17    You should have received a copy of the GNU General Public License
18    along with this program; if not, write to the Free Software
19    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20 */
21
22 #include "includes.h"
23
24 /* Oplock ipc UDP socket. */
25 static int oplock_sock = -1;
26 uint16 global_oplock_port = 0;
27
28 /* Current number of oplocks we have outstanding. */
29 static int32 exclusive_oplocks_open = 0;
30 static int32 level_II_oplocks_open = 0;
31 BOOL global_client_failed_oplock_break = False;
32 BOOL global_oplock_break = False;
33
34 extern struct timeval smb_last_time;
35 extern uint32 global_client_caps;
36 extern struct current_user current_user;
37 extern int smb_read_error;
38
39 static struct kernel_oplocks *koplocks;
40
41 static BOOL oplock_break(SMB_DEV_T dev, SMB_INO_T inode, unsigned long file_id, BOOL local);
42
43 /****************************************************************************
44  Get the number of current exclusive oplocks.
45 ****************************************************************************/
46
47 int32 get_number_of_exclusive_open_oplocks(void)
48 {
49   return exclusive_oplocks_open;
50 }
51
52 /****************************************************************************
53  Return True if an oplock message is pending.
54 ****************************************************************************/
55
56 BOOL oplock_message_waiting(fd_set *fds)
57 {
58         if (koplocks && koplocks->msg_waiting(fds))
59                 return True;
60
61         if (FD_ISSET(oplock_sock, fds))
62                 return True;
63
64         return False;
65 }
66
67 /****************************************************************************
68  Read an oplock break message from either the oplock UDP fd or the
69  kernel (if kernel oplocks are supported).
70
71  If timeout is zero then *fds contains the file descriptors that
72  are ready to be read and acted upon. If timeout is non-zero then
73  *fds contains the file descriptors to be selected on for read.
74  The timeout is in milliseconds
75
76 ****************************************************************************/
77
78 BOOL receive_local_message( char *buffer, int buffer_len, int timeout)
79 {
80         struct sockaddr_in from;
81         socklen_t fromlen = sizeof(from);
82         int32 msg_len = 0;
83         fd_set fds;
84         int selrtn = -1;
85
86         FD_ZERO(&fds);
87         smb_read_error = 0;
88
89         /*
90          * We need to check for kernel oplocks before going into the select
91          * here, as the EINTR generated by the linux kernel oplock may have
92          * already been eaten. JRA.
93          */
94
95         if (koplocks && koplocks->msg_waiting(&fds)) {
96                 return koplocks->receive_message(&fds, buffer, buffer_len);
97         }
98
99         while (timeout > 0 && selrtn == -1) {
100                 struct timeval to;
101                 int maxfd = oplock_sock;
102                 time_t starttime = time(NULL);
103
104                 FD_ZERO(&fds);
105                 maxfd = setup_oplock_select_set(&fds);
106
107                 to.tv_sec = timeout / 1000;
108                 to.tv_usec = (timeout % 1000) * 1000;
109
110                 DEBUG(5,("receive_local_message: doing select with timeout of %d ms\n", timeout));
111
112                 selrtn = sys_select(maxfd+1,&fds,NULL,NULL,&to);
113
114                 if (selrtn == -1 && errno == EINTR) {
115
116                         /* could be a kernel oplock interrupt */
117                         if (koplocks && koplocks->msg_waiting(&fds)) {
118                                 return koplocks->receive_message(&fds, buffer, buffer_len);
119                         }
120
121                         /*
122                          * Linux 2.0.x seems to have a bug in that
123                          * it can return -1, EINTR with a timeout of zero.
124                          * Make sure we bail out here with a read timeout
125                          * if we got EINTR on a timeout of 1 or less.
126                          */
127
128                         if (timeout <= 1) {
129                                 smb_read_error = READ_TIMEOUT;
130                                 return False;
131                         }
132
133                         /* Not a kernel interrupt - could be a SIGUSR1 message. We must restart. */
134                         /* We need to decrement the timeout here. */
135                         timeout -= ((time(NULL) - starttime)*1000);
136                         if (timeout < 0)
137                                 timeout = 1;
138
139                         DEBUG(5,("receive_local_message: EINTR : new timeout %d ms\n", timeout));
140                         continue;
141                 }
142
143                 /* Check if error */
144                 if(selrtn == -1) {
145                         /* something is wrong. Maybe the socket is dead? */
146                         smb_read_error = READ_ERROR;
147                         return False;
148                 }
149
150                 /* Did we timeout ? */
151                 if (selrtn == 0) {
152                         smb_read_error = READ_TIMEOUT;
153                         return False;
154                 }
155         }
156
157         if (koplocks && koplocks->msg_waiting(&fds)) {
158                 return koplocks->receive_message(&fds, buffer, buffer_len);
159         }
160
161         if (!FD_ISSET(oplock_sock, &fds))
162                 return False;
163
164         /*
165          * From here down we deal with the smbd <--> smbd
166          * oplock break protocol only.
167          */
168
169         /*
170          * Read a loopback udp message.
171          */
172         msg_len = sys_recvfrom(oplock_sock, &buffer[OPBRK_CMD_HEADER_LEN],
173                                                 buffer_len - OPBRK_CMD_HEADER_LEN, 0, (struct sockaddr *)&from, &fromlen);
174
175         if(msg_len < 0) {
176                 DEBUG(0,("receive_local_message. Error in recvfrom. (%s).\n",strerror(errno)));
177                 return False;
178         }
179
180         /* Validate message length. */
181         if(msg_len > (buffer_len - OPBRK_CMD_HEADER_LEN)) {
182                 DEBUG(0,("receive_local_message: invalid msg_len (%d) max can be %d\n", msg_len,
183                         buffer_len  - OPBRK_CMD_HEADER_LEN));
184                 return False;
185         }
186
187         /* Validate message from address (must be localhost). */
188         if(from.sin_addr.s_addr != htonl(INADDR_LOOPBACK)) {
189                 DEBUG(0,("receive_local_message: invalid 'from' address \
190 (was %lx should be 127.0.0.1)\n", (long)from.sin_addr.s_addr));
191                 return False;
192         }
193
194         /* Setup the message header */
195         SIVAL(buffer,OPBRK_CMD_LEN_OFFSET,msg_len);
196         SSVAL(buffer,OPBRK_CMD_PORT_OFFSET,ntohs(from.sin_port));
197
198         return True;
199 }
200
201 /****************************************************************************
202  Attempt to set an oplock on a file. Always succeeds if kernel oplocks are
203  disabled (just sets flags). Returns True if oplock set.
204 ****************************************************************************/
205
206 BOOL set_file_oplock(files_struct *fsp, int oplock_type)
207 {
208         if (koplocks && !koplocks->set_oplock(fsp, oplock_type))
209                 return False;
210
211         fsp->oplock_type = oplock_type;
212         fsp->sent_oplock_break = NO_BREAK_SENT;
213         if (oplock_type == LEVEL_II_OPLOCK)
214                 level_II_oplocks_open++;
215         else
216                 exclusive_oplocks_open++;
217
218         DEBUG(5,("set_file_oplock: granted oplock on file %s, dev = %x, inode = %.0f, file_id = %lu, \
219 tv_sec = %x, tv_usec = %x\n",
220                  fsp->fsp_name, (unsigned int)fsp->dev, (double)fsp->inode, fsp->file_id,
221                  (int)fsp->open_time.tv_sec, (int)fsp->open_time.tv_usec ));
222
223         return True;
224 }
225
226 /****************************************************************************
227  Attempt to release an oplock on a file. Decrements oplock count.
228 ****************************************************************************/
229
230 void release_file_oplock(files_struct *fsp)
231 {
232         if ((fsp->oplock_type != NO_OPLOCK) && koplocks)
233                 koplocks->release_oplock(fsp);
234
235         if (fsp->oplock_type == LEVEL_II_OPLOCK)
236                 level_II_oplocks_open--;
237         else if (fsp->oplock_type)
238                 exclusive_oplocks_open--;
239         
240         fsp->oplock_type = NO_OPLOCK;
241         fsp->sent_oplock_break = NO_BREAK_SENT;
242         
243         flush_write_cache(fsp, OPLOCK_RELEASE_FLUSH);
244 }
245
246 /****************************************************************************
247  Attempt to downgrade an oplock on a file. Doesn't decrement oplock count.
248 ****************************************************************************/
249
250 static void downgrade_file_oplock(files_struct *fsp)
251 {
252         if (koplocks)
253                 koplocks->release_oplock(fsp);
254         fsp->oplock_type = LEVEL_II_OPLOCK;
255         exclusive_oplocks_open--;
256         level_II_oplocks_open++;
257         fsp->sent_oplock_break = NO_BREAK_SENT;
258 }
259
260 /****************************************************************************
261  Remove a file oplock. Copes with level II and exclusive.
262  Locks then unlocks the share mode lock. Client can decide to go directly
263  to none even if a "break-to-level II" was sent.
264 ****************************************************************************/
265
266 BOOL remove_oplock(files_struct *fsp, BOOL break_to_none)
267 {
268         SMB_DEV_T dev = fsp->dev;
269         SMB_INO_T inode = fsp->inode;
270         BOOL ret = True;
271
272         /* Remove the oplock flag from the sharemode. */
273         if (lock_share_entry_fsp(fsp) == False) {
274                 DEBUG(0,("remove_oplock: failed to lock share entry for file %s\n",
275                          fsp->fsp_name ));
276                 return False;
277         }
278
279         if (fsp->sent_oplock_break == EXCLUSIVE_BREAK_SENT || break_to_none) {
280                 /*
281                  * Deal with a reply when a break-to-none was sent.
282                  */
283
284                 if(remove_share_oplock(fsp)==False) {
285                         DEBUG(0,("remove_oplock: failed to remove share oplock for file %s fnum %d, \
286 dev = %x, inode = %.0f\n", fsp->fsp_name, fsp->fnum, (unsigned int)dev, (double)inode));
287                         ret = False;
288                 }
289
290                 release_file_oplock(fsp);
291         } else {
292                 /*
293                  * Deal with a reply when a break-to-level II was sent.
294                  */
295                 if(downgrade_share_oplock(fsp)==False) {
296                         DEBUG(0,("remove_oplock: failed to downgrade share oplock for file %s fnum %d, \
297 dev = %x, inode = %.0f\n", fsp->fsp_name, fsp->fnum, (unsigned int)dev, (double)inode));
298                         ret = False;
299                 }
300                 
301                 downgrade_file_oplock(fsp);
302         }
303
304         unlock_share_entry_fsp(fsp);
305         return ret;
306 }
307
308 /****************************************************************************
309  Setup the listening set of file descriptors for an oplock break
310  message either from the UDP socket or from the kernel. Returns the maximum
311  fd used.
312 ****************************************************************************/
313
314 int setup_oplock_select_set( fd_set *fds)
315 {
316         int maxfd = oplock_sock;
317
318         if(oplock_sock == -1)
319                 return 0;
320
321         FD_SET(oplock_sock,fds);
322
323         if (koplocks && koplocks->notification_fd != -1) {
324                 FD_SET(koplocks->notification_fd, fds);
325                 maxfd = MAX(maxfd, koplocks->notification_fd);
326         }
327
328         return maxfd;
329 }
330
331 /****************************************************************************
332  Process an oplock break message - whether it came from the UDP socket
333  or from the kernel.
334 ****************************************************************************/
335
336 BOOL process_local_message(char *buffer, int buf_size)
337 {
338         int32 msg_len;
339         uint16 from_port;
340         char *msg_start;
341         pid_t remotepid;
342         SMB_DEV_T dev;
343         SMB_INO_T inode;
344         unsigned long file_id;
345         uint16 break_cmd_type;
346
347         msg_len = IVAL(buffer,OPBRK_CMD_LEN_OFFSET);
348         from_port = SVAL(buffer,OPBRK_CMD_PORT_OFFSET);
349
350         msg_start = &buffer[OPBRK_CMD_HEADER_LEN];
351
352         DEBUG(5,("process_local_message: Got a message of length %d from port (%d)\n", 
353                 msg_len, from_port));
354
355         /* 
356          * Pull the info out of the requesting packet.
357          */
358
359         break_cmd_type = SVAL(msg_start,OPBRK_MESSAGE_CMD_OFFSET);
360
361         switch(break_cmd_type) {
362                 case KERNEL_OPLOCK_BREAK_CMD:
363                         if (!koplocks) {
364                                 DEBUG(0,("unexpected kernel oplock break!\n"));
365                                 break;
366                         } 
367                         if (!koplocks->parse_message(msg_start, msg_len, &inode, &dev, &file_id)) {
368                                 DEBUG(0,("kernel oplock break parse failure!\n"));
369                         }
370                         break;
371
372                 case OPLOCK_BREAK_CMD:
373                 case LEVEL_II_OPLOCK_BREAK_CMD:
374                 case ASYNC_LEVEL_II_OPLOCK_BREAK_CMD:
375
376                         /* Ensure that the msg length is correct. */
377                         if(msg_len != OPLOCK_BREAK_MSG_LEN) {
378                                 DEBUG(0,("process_local_message: incorrect length for OPLOCK_BREAK_CMD (was %d, should be %d).\n",
379                                         (int)msg_len, (int)OPLOCK_BREAK_MSG_LEN));
380                                 return False;
381                         }
382
383                         memcpy((char *)&remotepid, msg_start+OPLOCK_BREAK_PID_OFFSET,sizeof(remotepid));
384                         memcpy((char *)&inode, msg_start+OPLOCK_BREAK_INODE_OFFSET,sizeof(inode));
385                         memcpy((char *)&dev, msg_start+OPLOCK_BREAK_DEV_OFFSET,sizeof(dev));
386                         memcpy((char *)&file_id, msg_start+OPLOCK_BREAK_FILEID_OFFSET,sizeof(file_id));
387
388                         DEBUG(5,("process_local_message: (%s) oplock break request from \
389 pid %d, port %d, dev = %x, inode = %.0f, file_id = %lu\n",
390                                 (break_cmd_type == OPLOCK_BREAK_CMD) ? "exclusive" : "level II",
391                                 (int)remotepid, from_port, (unsigned int)dev, (double)inode, file_id));
392                         break;
393
394                 case RETRY_DEFERRED_OPEN_CMD:
395
396                         /* Request to retry and open that would return SHARING_VIOLATION. */
397                         if (msg_len != DEFERRED_OPEN_MSG_LEN) {
398                                 DEBUG(0,("process_local_message: incorrect length for RETRY_DEFERRED_OPEN_CMD (was %d, should be %d).\n",
399                                         (int)msg_len, (int)DEFERRED_OPEN_MSG_LEN));
400                                 return False;
401                         }
402                         {
403                                 uint16 mid;
404
405                                 memcpy((char *)&remotepid, msg_start+DEFERRED_OPEN_PID_OFFSET,sizeof(remotepid));
406                                 memcpy((char *)&inode, msg_start+DEFERRED_OPEN_INODE_OFFSET,sizeof(inode));
407                                 memcpy((char *)&dev, msg_start+DEFERRED_OPEN_DEV_OFFSET,sizeof(dev));
408                                 memcpy((char *)&mid, msg_start+DEFERRED_OPEN_MID_OFFSET,sizeof(mid));
409
410                                 DEBUG(5,("process_local_message: RETRY_DEFERRED_OPEN from \
411 pid %d, port %d, dev = %x, inode = %.0f, mid = %u\n",
412                                         (int)remotepid, from_port, (unsigned int)dev, (double)inode, (unsigned int)mid));
413
414                                 schedule_sharing_violation_open_smb_message(mid);
415                         }
416                         return True;
417
418                 /* 
419                  * Keep this as a debug case - eventually we can remove it.
420                  */
421                 case 0x8001:
422                         DEBUG(0,("process_local_message: Received unsolicited break \
423 reply - dumping info.\n"));
424
425                         if(msg_len != OPLOCK_BREAK_MSG_LEN) {
426                                 DEBUG(0,("process_local_message: ubr: incorrect length for reply \
427 (was %d, should be %d).\n", (int)msg_len, (int)OPLOCK_BREAK_MSG_LEN));
428                                 return False;
429                         }
430
431                         memcpy((char *)&inode, msg_start+OPLOCK_BREAK_INODE_OFFSET,sizeof(inode));
432                         memcpy((char *)&remotepid, msg_start+OPLOCK_BREAK_PID_OFFSET,sizeof(remotepid));
433                         memcpy((char *)&dev, msg_start+OPLOCK_BREAK_DEV_OFFSET,sizeof(dev));
434                         memcpy((char *)&file_id, msg_start+OPLOCK_BREAK_FILEID_OFFSET,sizeof(file_id));
435
436                         DEBUG(0,("process_local_message: unsolicited oplock break reply from \
437 pid %d, port %d, dev = %x, inode = %.0f, file_id = %lu\n",
438                                 (int)remotepid, from_port, (unsigned int)dev, (double)inode, file_id));
439
440                         return False;
441
442                 default:
443                         DEBUG(0,("process_local_message: unknown UDP message command code (%x) - ignoring.\n",
444                                 (unsigned int)SVAL(msg_start,0)));
445                         return False;
446         }
447
448         /*
449          * Now actually process the break request.
450          */
451
452         if((exclusive_oplocks_open + level_II_oplocks_open) != 0) {
453                 if (oplock_break(dev, inode, file_id, False) == False) {
454                         DEBUG(0,("process_local_message: oplock break failed.\n"));
455                         return False;
456                 }
457         } else {
458                 /*
459                  * If we have no record of any currently open oplocks,
460                  * it's not an error, as a close command may have
461                  * just been issued on the file that was oplocked.
462                  * Just log a message and return success in this case.
463                  */
464                 DEBUG(3,("process_local_message: oplock break requested with no outstanding \
465 oplocks. Returning success.\n"));
466         }
467
468         /* 
469          * Do the appropriate reply - none in the kernel or async level II case.
470          */
471
472         if(break_cmd_type == OPLOCK_BREAK_CMD || break_cmd_type == LEVEL_II_OPLOCK_BREAK_CMD) {
473                 struct sockaddr_in toaddr;
474
475                 /* Send the message back after OR'ing in the 'REPLY' bit. */
476                 SSVAL(msg_start,OPBRK_MESSAGE_CMD_OFFSET,break_cmd_type | CMD_REPLY);
477
478                 memset((char *)&toaddr,'\0',sizeof(toaddr));
479                 toaddr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
480                 toaddr.sin_port = htons(from_port);
481                 toaddr.sin_family = AF_INET;
482
483                 if(sys_sendto( oplock_sock, msg_start, OPLOCK_BREAK_MSG_LEN, 0,
484                                 (struct sockaddr *)&toaddr, sizeof(toaddr)) < 0) {
485                         DEBUG(0,("process_local_message: sendto process %d failed. Errno was %s\n",
486                                 (int)remotepid, strerror(errno)));
487                         return False;
488                 }
489
490                 DEBUG(5,("process_local_message: oplock break reply sent to \
491 pid %d, port %d, for file dev = %x, inode = %.0f, file_id = %lu\n",
492                         (int)remotepid, from_port, (unsigned int)dev, (double)inode, file_id));
493         }
494
495         return True;
496 }
497
498 /****************************************************************************
499  Set up an oplock break message.
500 ****************************************************************************/
501
502 static void prepare_break_message(char *outbuf, files_struct *fsp, BOOL level2)
503 {
504         memset(outbuf,'\0',smb_size);
505         set_message(outbuf,8,0,True);
506
507         SCVAL(outbuf,smb_com,SMBlockingX);
508         SSVAL(outbuf,smb_tid,fsp->conn->cnum);
509         SSVAL(outbuf,smb_pid,0xFFFF);
510         SSVAL(outbuf,smb_uid,0);
511         SSVAL(outbuf,smb_mid,0xFFFF);
512         SCVAL(outbuf,smb_vwv0,0xFF);
513         SSVAL(outbuf,smb_vwv2,fsp->fnum);
514         SCVAL(outbuf,smb_vwv3,LOCKING_ANDX_OPLOCK_RELEASE);
515         SCVAL(outbuf,smb_vwv3+1,level2 ? OPLOCKLEVEL_II : OPLOCKLEVEL_NONE);
516 }
517
518 /****************************************************************************
519  Function to do the waiting before sending a local break.
520 ****************************************************************************/
521
522 static void wait_before_sending_break(BOOL local_request)
523 {
524         if(local_request) {
525                 struct timeval cur_tv;
526                 long wait_left = (long)lp_oplock_break_wait_time();
527
528                 if (wait_left == 0)
529                         return;
530
531                 GetTimeOfDay(&cur_tv);
532
533                 wait_left -= ((cur_tv.tv_sec - smb_last_time.tv_sec)*1000) +
534                 ((cur_tv.tv_usec - smb_last_time.tv_usec)/1000);
535
536                 if(wait_left > 0) {
537                         wait_left = MIN(wait_left, 1000);
538                         sys_usleep(wait_left * 1000);
539                 }
540         }
541 }
542
543 /****************************************************************************
544  Ensure that we have a valid oplock.
545 ****************************************************************************/
546
547 static files_struct *initial_break_processing(SMB_DEV_T dev, SMB_INO_T inode, unsigned long file_id)
548 {
549         files_struct *fsp = NULL;
550
551         if( DEBUGLVL( 3 ) ) {
552                 dbgtext( "initial_break_processing: called for dev = %x, inode = %.0f file_id = %lu\n",
553                         (unsigned int)dev, (double)inode, file_id);
554                 dbgtext( "Current oplocks_open (exclusive = %d, levelII = %d)\n",
555                         exclusive_oplocks_open, level_II_oplocks_open );
556         }
557
558         /*
559          * We need to search the file open table for the
560          * entry containing this dev and inode, and ensure
561          * we have an oplock on it.
562          */
563
564         fsp = file_find_dif(dev, inode, file_id);
565
566         if(fsp == NULL) {
567                 /* The file could have been closed in the meantime - return success. */
568                 if( DEBUGLVL( 3 ) ) {
569                         dbgtext( "initial_break_processing: cannot find open file with " );
570                         dbgtext( "dev = %x, inode = %.0f file_id = %lu", (unsigned int)dev,
571                                 (double)inode, file_id);
572                         dbgtext( "allowing break to succeed.\n" );
573                 }
574                 return NULL;
575         }
576
577         /* Ensure we have an oplock on the file */
578
579         /*
580          * There is a potential race condition in that an oplock could
581          * have been broken due to another udp request, and yet there are
582          * still oplock break messages being sent in the udp message
583          * queue for this file. So return true if we don't have an oplock,
584          * as we may have just freed it.
585          */
586
587         if(fsp->oplock_type == NO_OPLOCK) {
588                 if( DEBUGLVL( 3 ) ) {
589                         dbgtext( "initial_break_processing: file %s ", fsp->fsp_name );
590                         dbgtext( "(dev = %x, inode = %.0f, file_id = %lu) has no oplock.\n",
591                                 (unsigned int)dev, (double)inode, fsp->file_id );
592                         dbgtext( "Allowing break to succeed regardless.\n" );
593                 }
594                 return NULL;
595         }
596
597         return fsp;
598 }
599
600 /****************************************************************************
601  Process a level II oplock break directly.
602  We must call this function with the share mode entry locked.
603 ****************************************************************************/
604
605 static BOOL oplock_break_level2(files_struct *fsp, BOOL local_request)
606 {
607         char outbuf[128];
608         SMB_DEV_T dev = fsp->dev;
609         SMB_INO_T inode = fsp->inode;
610
611         /*
612          * We can have a level II oplock even if the client is not
613          * level II oplock aware. In this case just remove the
614          * flags and don't send the break-to-none message to
615          * the client.
616          */
617
618         if (global_client_caps & CAP_LEVEL_II_OPLOCKS) {
619                 BOOL sign_state;
620
621                 /*
622                  * If we are sending an oplock break due to an SMB sent
623                  * by our own client we ensure that we wait at leat
624                  * lp_oplock_break_wait_time() milliseconds before sending
625                  * the packet. Sending the packet sooner can break Win9x
626                  * and has reported to cause problems on NT. JRA.
627                  */
628
629                 wait_before_sending_break(local_request);
630
631                 /* Prepare the SMBlockingX message. */
632                 prepare_break_message( outbuf, fsp, False);
633
634                 /* Save the server smb signing state. */
635                 sign_state = srv_oplock_set_signing(False);
636
637                 if (!send_smb(smbd_server_fd(), outbuf))
638                         exit_server("oplock_break_level2: send_smb failed.");
639
640                 /* Restore the sign state to what it was. */
641                 srv_oplock_set_signing(sign_state);
642         }
643
644         /*
645          * Now we must update the shared memory structure to tell
646          * everyone else we no longer have a level II oplock on 
647          * this open file. We must call this function with the share mode
648          * entry locked so we can change the entry directly.
649          */
650
651         if(remove_share_oplock(fsp)==False) {
652                 DEBUG(0,("oplock_break_level2: unable to remove level II oplock for file %s\n", fsp->fsp_name ));
653         }
654
655         release_file_oplock(fsp);
656
657         if(level_II_oplocks_open < 0) {
658                 DEBUG(0,("oplock_break_level2: level_II_oplocks_open < 0 (%d). PANIC ERROR\n",
659                         level_II_oplocks_open));
660                 abort();
661         }
662
663         if( DEBUGLVL( 3 ) ) {
664                 dbgtext( "oplock_break_level2: returning success for " );
665                 dbgtext( "dev = %x, inode = %.0f, file_id = %lu\n", (unsigned int)dev, (double)inode, fsp->file_id );
666                 dbgtext( "Current level II oplocks_open = %d\n", level_II_oplocks_open );
667         }
668
669         return True;
670 }
671
672 /****************************************************************************
673  Process an oplock break directly.
674  This is always called with the share mode lock *NOT* held.
675 ****************************************************************************/
676
677 static BOOL oplock_break(SMB_DEV_T dev, SMB_INO_T inode, unsigned long file_id, BOOL local_request)
678 {
679         char *inbuf = NULL;
680         char *outbuf = NULL;
681         files_struct *fsp = NULL;
682         time_t start_time;
683         BOOL shutdown_server = False;
684         BOOL oplock_timeout = False;
685         BOOL sign_state;
686         connection_struct *saved_user_conn;
687         connection_struct *saved_fsp_conn;
688         int saved_vuid;
689         pstring saved_dir; 
690         int timeout = (OPLOCK_BREAK_TIMEOUT * 1000);
691         pstring file_name;
692         BOOL using_levelII;
693
694         if((fsp = initial_break_processing(dev, inode, file_id)) == NULL)
695                 return True;
696
697         /*
698          * Deal with a level II oplock going break to none separately.
699          */
700
701         if (LEVEL_II_OPLOCK_TYPE(fsp->oplock_type)) {
702                 BOOL ret;
703                 /* We must always call oplock_break_level2() with
704                    the share mode entry locked. */
705                 if (lock_share_entry_fsp(fsp) == False) {
706                         DEBUG(0,("oplock_break: unable to lock share entry for file %s\n", fsp->fsp_name ));
707                         return False;
708                 }
709                 ret = oplock_break_level2(fsp, local_request);
710                 unlock_share_entry_fsp(fsp);
711                 return ret;
712         }
713
714         /* Mark the oplock break as sent - we don't want to send twice! */
715         if (fsp->sent_oplock_break) {
716                 if( DEBUGLVL( 0 ) ) {
717                         dbgtext( "oplock_break: ERROR: oplock_break already sent for " );
718                         dbgtext( "file %s ", fsp->fsp_name);
719                         dbgtext( "(dev = %x, inode = %.0f, file_id = %lu)\n", (unsigned int)dev, (double)inode, fsp->file_id );
720                 }
721
722                 /*
723                  * We have to fail the open here as we cannot send another oplock break on
724                  * this file whilst we are awaiting a response from the client - neither
725                  * can we allow another open to succeed while we are waiting for the client.
726                  */
727                 return False;
728         }
729
730         if(global_oplock_break) {
731                 DEBUG(0,("ABORT : ABORT : recursion in oplock_break !!!!!\n"));
732                 abort();
733         }
734
735         /*
736          * Now comes the horrid part. We must send an oplock break to the client,
737          * and then process incoming messages until we get a close or oplock release.
738          * At this point we know we need a new inbuf/outbuf buffer pair.
739          * We cannot use these staticaly as we may recurse into here due to
740          * messages crossing on the wire.
741          */
742
743         if((inbuf = (char *)SMB_MALLOC(BUFFER_SIZE + LARGE_WRITEX_HDR_SIZE + SAFETY_MARGIN))==NULL) {
744                 DEBUG(0,("oplock_break: malloc fail for input buffer.\n"));
745                 return False;
746         }
747
748         if((outbuf = (char *)SMB_MALLOC(BUFFER_SIZE + LARGE_WRITEX_HDR_SIZE + SAFETY_MARGIN))==NULL) {
749                 DEBUG(0,("oplock_break: malloc fail for output buffer.\n"));
750                 SAFE_FREE(inbuf);
751                 return False;
752         }
753
754         /*
755          * If we are sending an oplock break due to an SMB sent
756          * by our own client we ensure that we wait at leat
757          * lp_oplock_break_wait_time() milliseconds before sending
758          * the packet. Sending the packet sooner can break Win9x
759          * and has reported to cause problems on NT. JRA.
760          */
761
762         wait_before_sending_break(local_request);
763
764         /* Prepare the SMBlockingX message. */
765
766         if ((global_client_caps & CAP_LEVEL_II_OPLOCKS) && 
767                         !koplocks && /* NOTE: we force levelII off for kernel oplocks - this will change when it is supported */
768                         lp_level2_oplocks(SNUM(fsp->conn))) {
769                 using_levelII = True;
770         } else {
771                 using_levelII = False;
772         }
773
774         prepare_break_message( outbuf, fsp, using_levelII);
775         /* Remember if we just sent a break to level II on this file. */
776         fsp->sent_oplock_break = using_levelII? LEVEL_II_BREAK_SENT:EXCLUSIVE_BREAK_SENT;
777
778         /* Save the server smb signing state. */
779         sign_state = srv_oplock_set_signing(False);
780
781         if (!send_smb(smbd_server_fd(), outbuf)) {
782                 srv_oplock_set_signing(sign_state);
783                 exit_server("oplock_break: send_smb failed.");
784         }
785
786         /* Restore the sign state to what it was. */
787         srv_oplock_set_signing(sign_state);
788
789         /* We need this in case a readraw crosses on the wire. */
790         global_oplock_break = True;
791  
792         /* Process incoming messages. */
793
794         /*
795          * JRA - If we don't get a break from the client in OPLOCK_BREAK_TIMEOUT
796          * seconds we should just die....
797          */
798
799         start_time = time(NULL);
800
801         /*
802          * Save the information we need to re-become the
803          * user, then unbecome the user whilst we're doing this.
804          */
805         saved_user_conn = current_user.conn;
806         saved_vuid = current_user.vuid;
807         saved_fsp_conn = fsp->conn;
808         change_to_root_user();
809         /*
810          * Initialize saved_dir to something sensible: vfs_GetWd may not work well
811          * for root: the directory may be NFS-mounted and exported with root_squash
812          * (so has no root access).
813          */
814         pstrcpy(saved_dir,saved_fsp_conn->connectpath);
815         vfs_GetWd(saved_fsp_conn,saved_dir);
816         /* Save the chain fnum. */
817         file_chain_save();
818
819         /*
820          * From Charles Hoch <hoch@exemplary.com>. If the break processing
821          * code closes the file (as it often does), then the fsp pointer here
822          * points to free()'d memory. We *must* revalidate fsp each time
823          * around the loop.
824          */
825
826         pstrcpy(file_name, fsp->fsp_name);
827
828         while((fsp = initial_break_processing(dev, inode, file_id)) &&
829                         OPEN_FSP(fsp) && EXCLUSIVE_OPLOCK_TYPE(fsp->oplock_type)) {
830                 if(receive_smb(smbd_server_fd(),inbuf, timeout) == False) {
831                         /*
832                          * Die if we got an error.
833                          */
834
835                         if (smb_read_error == READ_EOF) {
836                                 DEBUG( 0, ( "oplock_break: end of file from client\n" ) );
837                                 shutdown_server = True;
838                         } else if (smb_read_error == READ_ERROR) {
839                                 DEBUG( 0, ("oplock_break: receive_smb error (%s)\n", strerror(errno)) );
840                                 shutdown_server = True;
841                         } else if (smb_read_error == READ_BAD_SIG) {
842                                 DEBUG( 0, ("oplock_break: bad signature from client\n" ));
843                                 shutdown_server = True;
844                         } else if (smb_read_error == READ_TIMEOUT) {
845                                 DEBUG( 0, ( "oplock_break: receive_smb timed out after %d seconds.\n", OPLOCK_BREAK_TIMEOUT ) );
846                                 oplock_timeout = True;
847                         }
848
849                         DEBUGADD( 0, ( "oplock_break failed for file %s ", file_name ) );
850                         DEBUGADD( 0, ( "(dev = %x, inode = %.0f, file_id = %lu).\n",
851                                 (unsigned int)dev, (double)inode, file_id));
852
853                         break;
854                 }
855
856                 /*
857                  * There are certain SMB requests that we shouldn't allow
858                  * to recurse. opens, renames and deletes are the obvious
859                  * ones. This is handled in the switch_message() function.
860                  * If global_oplock_break is set they will push the packet onto
861                  * the pending smb queue and return -1 (no reply).
862                  * JRA.
863                  */
864
865                 process_smb(inbuf, outbuf);
866
867                 /*
868                  * Die if we go over the time limit.
869                  */
870
871                 if((time(NULL) - start_time) > OPLOCK_BREAK_TIMEOUT) {
872                         if( DEBUGLVL( 0 ) ) {
873                                 dbgtext( "oplock_break: no break received from client " );
874                                 dbgtext( "within %d seconds.\n", OPLOCK_BREAK_TIMEOUT );
875                                 dbgtext( "oplock_break failed for file %s ", fsp->fsp_name );
876                                 dbgtext( "(dev = %x, inode = %.0f, file_id = %lu).\n",  
877                                         (unsigned int)dev, (double)inode, file_id );
878                         }
879                         oplock_timeout = True;
880                         break;
881                 }
882         }
883
884         /*
885          * Go back to being the user who requested the oplock
886          * break.
887          */
888         if((saved_user_conn != NULL) && (saved_vuid != UID_FIELD_INVALID) && !change_to_user(saved_user_conn, saved_vuid)) {
889                 DEBUG( 0, ( "oplock_break: unable to re-become user!" ) );
890                 DEBUGADD( 0, ( "Shutting down server\n" ) );
891                 close(oplock_sock);
892                 exit_server("unable to re-become user");
893         }
894
895         /* Including the directory. */
896         vfs_ChDir(saved_fsp_conn,saved_dir);
897
898         /* Restore the chain fnum. */
899         file_chain_restore();
900
901         /* Free the buffers we've been using to recurse. */
902         SAFE_FREE(inbuf);
903         SAFE_FREE(outbuf);
904
905         /* We need this in case a readraw crossed on the wire. */
906         if(global_oplock_break)
907                 global_oplock_break = False;
908
909         /*
910          * If the client timed out then clear the oplock (or go to level II)
911          * and continue. This seems to be what NT does and is better than dropping
912          * the connection.
913          */
914
915         if(oplock_timeout && (fsp = initial_break_processing(dev, inode, file_id)) &&
916                         OPEN_FSP(fsp) && EXCLUSIVE_OPLOCK_TYPE(fsp->oplock_type)) {
917                 DEBUG(0,("oplock_break: client failure in oplock break in file %s\n", fsp->fsp_name));
918                 remove_oplock(fsp,True);
919 #if FASCIST_OPLOCK_BACKOFF
920                 global_client_failed_oplock_break = True; /* Never grant this client an oplock again. */
921 #endif
922         }
923
924         /*
925          * If the client had an error we must die.
926          */
927
928         if(shutdown_server) {
929                 DEBUG( 0, ( "oplock_break: client failure in break - " ) );
930                 DEBUGADD( 0, ( "shutting down this smbd.\n" ) );
931                 close(oplock_sock);
932                 exit_server("oplock break failure");
933         }
934
935         /* Santity check - remove this later. JRA */
936         if(exclusive_oplocks_open < 0) {
937                 DEBUG(0,("oplock_break: exclusive_oplocks_open < 0 (%d). PANIC ERROR\n", exclusive_oplocks_open));
938                 abort();
939         }
940
941         /* We know we have no saved errors here. */
942         set_saved_error_triple(0, 0, NT_STATUS_OK);
943
944         if( DEBUGLVL( 3 ) ) {
945                 dbgtext( "oplock_break: returning success for " );
946                 dbgtext( "dev = %x, inode = %.0f, file_id = %lu\n", (unsigned int)dev, (double)inode, file_id );
947                 dbgtext( "Current exclusive_oplocks_open = %d\n", exclusive_oplocks_open );
948         }
949
950         return True;
951 }
952
953 /****************************************************************************
954  Send an oplock break message to another smbd process. If the oplock is held 
955  by the local smbd then call the oplock break function directly.
956  This function is called with no share locks held.
957 ****************************************************************************/
958
959 BOOL request_oplock_break(share_mode_entry *share_entry)
960 {
961         char op_break_msg[OPLOCK_BREAK_MSG_LEN];
962         struct sockaddr_in addr_out;
963         pid_t pid = sys_getpid();
964         time_t start_time;
965         int time_left;
966         SMB_DEV_T dev = share_entry->dev;
967         SMB_INO_T inode = share_entry->inode;
968         unsigned long file_id = share_entry->share_file_id;
969         uint16 break_cmd_type;
970
971         if(pid == share_entry->pid) {
972                 /* We are breaking our own oplock, make sure it's us. */
973                 if(share_entry->op_port != global_oplock_port) {
974                         DEBUG(0,("request_oplock_break: corrupt share mode entry - pid = %d, port = %d \
975 should be %d\n", (int)pid, share_entry->op_port, global_oplock_port));
976                         return False;
977                 }
978
979                 DEBUG(5,("request_oplock_break: breaking our own oplock\n"));
980
981 #if 1 /* JRA PARANOIA TEST.... */
982                 {
983                         files_struct *fsp = file_find_dif(dev, inode, file_id);
984                         if (!fsp) {
985                                 DEBUG(0,("request_oplock_break: PANIC : breaking our own oplock requested for \
986 dev = %x, inode = %.0f, file_id = %lu and no fsp found !\n",
987             (unsigned int)dev, (double)inode, file_id ));
988                                 smb_panic("request_oplock_break: no fsp found for our own oplock\n");
989                         }
990                 }
991 #endif /* END JRA PARANOIA TEST... */
992
993                 /* Call oplock break direct. */
994                 return oplock_break(dev, inode, file_id, True);
995         }
996
997         /* We need to send a OPLOCK_BREAK_CMD message to the port in the share mode entry. */
998
999         if (LEVEL_II_OPLOCK_TYPE(share_entry->op_type)) {
1000                 break_cmd_type = LEVEL_II_OPLOCK_BREAK_CMD;
1001         } else {
1002                 break_cmd_type = OPLOCK_BREAK_CMD;
1003         }
1004
1005         SSVAL(op_break_msg,OPBRK_MESSAGE_CMD_OFFSET,break_cmd_type);
1006         memcpy(op_break_msg+OPLOCK_BREAK_PID_OFFSET,(char *)&pid,sizeof(pid));
1007         memcpy(op_break_msg+OPLOCK_BREAK_DEV_OFFSET,(char *)&dev,sizeof(dev));
1008         memcpy(op_break_msg+OPLOCK_BREAK_INODE_OFFSET,(char *)&inode,sizeof(inode));
1009         memcpy(op_break_msg+OPLOCK_BREAK_FILEID_OFFSET,(char *)&file_id,sizeof(file_id));
1010
1011         /* Set the address and port. */
1012         memset((char *)&addr_out,'\0',sizeof(addr_out));
1013         addr_out.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
1014         addr_out.sin_port = htons( share_entry->op_port );
1015         addr_out.sin_family = AF_INET;
1016    
1017         if( DEBUGLVL( 3 ) ) {
1018                 dbgtext( "request_oplock_break: sending a synchronous oplock break message to " );
1019                 dbgtext( "pid %d on port %d ", (int)share_entry->pid, share_entry->op_port );
1020                 dbgtext( "for dev = %x, inode = %.0f, file_id = %lu\n",
1021             (unsigned int)dev, (double)inode, file_id );
1022         }
1023
1024         if(sys_sendto(oplock_sock,op_break_msg,OPLOCK_BREAK_MSG_LEN,0,
1025                         (struct sockaddr *)&addr_out,sizeof(addr_out)) < 0) {
1026                 if( DEBUGLVL( 0 ) ) {
1027                         dbgtext( "request_oplock_break: failed when sending a oplock " );
1028                         dbgtext( "break message to pid %d ", (int)share_entry->pid );
1029                         dbgtext( "on port %d ", share_entry->op_port );
1030                         dbgtext( "for dev = %x, inode = %.0f, file_id = %lu\n",
1031                                 (unsigned int)dev, (double)inode, file_id );
1032                         dbgtext( "Error was %s\n", strerror(errno) );
1033                 }
1034                 return False;
1035         }
1036
1037         /*
1038          * Now we must await the oplock broken message coming back
1039          * from the target smbd process. Timeout if it fails to
1040          * return in (OPLOCK_BREAK_TIMEOUT + OPLOCK_BREAK_TIMEOUT_FUDGEFACTOR) seconds.
1041          * While we get messages that aren't ours, loop.
1042          */
1043
1044         start_time = time(NULL);
1045         time_left = OPLOCK_BREAK_TIMEOUT+OPLOCK_BREAK_TIMEOUT_FUDGEFACTOR;
1046
1047         while(time_left >= 0) {
1048                 char op_break_reply[OPBRK_CMD_HEADER_LEN+OPLOCK_BREAK_MSG_LEN];
1049                 uint16 reply_from_port;
1050                 char *reply_msg_start;
1051
1052                 if(receive_local_message(op_break_reply, sizeof(op_break_reply),
1053                                 time_left ? time_left * 1000 : 1) == False) {
1054                         if(smb_read_error == READ_TIMEOUT) {
1055                                 if( DEBUGLVL( 0 ) ) {
1056                                         dbgtext( "request_oplock_break: no response received to oplock " );
1057                                         dbgtext( "break request to pid %d ", (int)share_entry->pid );
1058                                         dbgtext( "on port %d ", share_entry->op_port );
1059                                         dbgtext( "for dev = %x, inode = %.0f, file_id = %lu\n",
1060                                                         (unsigned int)dev, (double)inode, file_id );
1061                                 }
1062
1063                                 /*
1064                                  * This is a hack to make handling of failing clients more robust.
1065                                  * If a oplock break response message is not received in the timeout
1066                                  * period we may assume that the smbd servicing that client holding
1067                                  * the oplock has died and the client changes were lost anyway, so
1068                                  * we should continue to try and open the file.
1069                                  */
1070                                 break;
1071                         } else {
1072                                 if( DEBUGLVL( 0 ) ) {
1073                                         dbgtext( "request_oplock_break: error in response received " );
1074                                         dbgtext( "to oplock break request to pid %d ", (int)share_entry->pid );
1075                                         dbgtext( "on port %d ", share_entry->op_port );
1076                                         dbgtext( "for dev = %x, inode = %.0f, file_id = %lu\n",
1077                                                 (unsigned int)dev, (double)inode, file_id );
1078                                         dbgtext( "Error was (%s).\n", strerror(errno) );
1079                                 }
1080                         }
1081                         return False;
1082                 }
1083
1084                 reply_from_port = SVAL(op_break_reply,OPBRK_CMD_PORT_OFFSET);
1085                 reply_msg_start = &op_break_reply[OPBRK_CMD_HEADER_LEN];
1086
1087                 /*
1088                  * Test to see if this is the reply we are awaiting (ie. the one we sent with the CMD_REPLY flag OR'ed in).
1089                  */
1090                 if((SVAL(reply_msg_start,OPBRK_MESSAGE_CMD_OFFSET) & CMD_REPLY) &&
1091                         ((SVAL(reply_msg_start,OPBRK_MESSAGE_CMD_OFFSET) & ~CMD_REPLY) == break_cmd_type) &&
1092                         (reply_from_port == share_entry->op_port) && 
1093                         (memcmp(&reply_msg_start[OPLOCK_BREAK_PID_OFFSET], &op_break_msg[OPLOCK_BREAK_PID_OFFSET],
1094                                 OPLOCK_BREAK_MSG_LEN - OPLOCK_BREAK_PID_OFFSET) == 0)) {
1095
1096                         /*
1097                          * This is the reply we've been waiting for.
1098                          */
1099                         break;
1100                 } else {
1101                         /*
1102                          * This is another message - a break request.
1103                          * Note that both kernel oplock break requests
1104                          * and UDP inter-smbd oplock break requests will
1105                          * be processed here.
1106                          *
1107                          * Process it to prevent potential deadlock.
1108                          * Note that the code in switch_message() prevents
1109                          * us from recursing into here as any SMB requests
1110                          * we might process that would cause another oplock
1111                          * break request to be made will be queued.
1112                          * JRA.
1113                          */
1114
1115                         process_local_message(op_break_reply, sizeof(op_break_reply));
1116                 }
1117
1118                 time_left -= (time(NULL) - start_time);
1119         }
1120
1121         DEBUG(3,("request_oplock_break: broke oplock.\n"));
1122
1123         return True;
1124 }
1125
1126 /****************************************************************************
1127   Attempt to break an oplock on a file (if oplocked).
1128   Returns True if the file was closed as a result of
1129   the oplock break, False otherwise.
1130   Used as a last ditch attempt to free a space in the 
1131   file table when we have run out.
1132 ****************************************************************************/
1133
1134 BOOL attempt_close_oplocked_file(files_struct *fsp)
1135 {
1136         DEBUG(5,("attempt_close_oplocked_file: checking file %s.\n", fsp->fsp_name));
1137
1138         if (EXCLUSIVE_OPLOCK_TYPE(fsp->oplock_type) && !fsp->sent_oplock_break && (fsp->fd != -1)) {
1139                 /* Try and break the oplock. */
1140                 if (oplock_break(fsp->dev, fsp->inode, fsp->file_id, True)) {
1141                         if(file_find_fsp(fsp) == NULL) /* Did the oplock break close the file ? */
1142                                 return True;
1143                 }
1144         }
1145
1146         return False;
1147 }
1148
1149 /****************************************************************************
1150  Send an asynchronous oplock break message to another smbd process.
1151 ****************************************************************************/
1152
1153 static BOOL request_remote_level2_async_oplock_break(share_mode_entry *share_entry)
1154 {
1155         char op_break_msg[OPLOCK_BREAK_MSG_LEN];
1156         struct sockaddr_in addr_out;
1157         pid_t pid = sys_getpid();
1158         SMB_DEV_T dev = share_entry->dev;
1159         SMB_INO_T inode = share_entry->inode;
1160         unsigned long file_id = share_entry->share_file_id;
1161
1162         /* We need to send a ASYNC_LEVEL_II_OPLOCK_BREAK_CMD message to the port in the share mode entry. */
1163
1164         SSVAL(op_break_msg,OPBRK_MESSAGE_CMD_OFFSET,ASYNC_LEVEL_II_OPLOCK_BREAK_CMD);
1165         memcpy(op_break_msg+OPLOCK_BREAK_PID_OFFSET,(char *)&pid,sizeof(pid));
1166         memcpy(op_break_msg+OPLOCK_BREAK_DEV_OFFSET,(char *)&dev,sizeof(dev));
1167         memcpy(op_break_msg+OPLOCK_BREAK_INODE_OFFSET,(char *)&inode,sizeof(inode));
1168         memcpy(op_break_msg+OPLOCK_BREAK_FILEID_OFFSET,(char *)&file_id,sizeof(file_id));
1169
1170         /* Set the address and port. */
1171         memset((char *)&addr_out,'\0',sizeof(addr_out));
1172         addr_out.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
1173         addr_out.sin_port = htons( share_entry->op_port );
1174         addr_out.sin_family = AF_INET;
1175    
1176         if( DEBUGLVL( 3 ) ) {
1177                 dbgtext( "request_remote_level2_async_oplock_break: sending an asynchronous oplock break message to ");
1178                 dbgtext( "pid %d on port %d ", (int)share_entry->pid, share_entry->op_port );
1179                 dbgtext( "for dev = %x, inode = %.0f, file_id = %lu\n",
1180             (unsigned int)dev, (double)inode, file_id );
1181         }
1182
1183         if(sys_sendto(oplock_sock,op_break_msg,OPLOCK_BREAK_MSG_LEN,0,
1184                         (struct sockaddr *)&addr_out,sizeof(addr_out)) < 0) {
1185                 if( DEBUGLVL( 0 ) ) {
1186                         dbgtext( "request_remote_level2_async_oplock_break: failed when sending a oplock " );
1187                         dbgtext( "break message to pid %d ", (int)share_entry->pid );
1188                         dbgtext( "on port %d ", share_entry->op_port );
1189                         dbgtext( "for dev = %x, inode = %.0f, file_id = %lu\n",
1190                                 (unsigned int)dev, (double)inode, file_id );
1191                         dbgtext( "Error was %s\n", strerror(errno) );
1192                 }
1193                 return False;
1194         }
1195
1196         DEBUG(3,("request_remote_level2_async_oplock_break: sent async break message to level II entry.\n"));
1197         return True;
1198 }
1199
1200 /****************************************************************************
1201  This function is called on any file modification or lock request. If a file
1202  is level 2 oplocked then it must tell all other level 2 holders to break to none.
1203 ****************************************************************************/
1204
1205 void release_level_2_oplocks_on_change(files_struct *fsp)
1206 {
1207         share_mode_entry *share_list = NULL;
1208         pid_t pid = sys_getpid();
1209         int num_share_modes = 0;
1210         int i;
1211
1212         /*
1213          * If this file is level II oplocked then we need
1214          * to grab the shared memory lock and inform all
1215          * other files with a level II lock that they need
1216          * to flush their read caches. We keep the lock over
1217          * the shared memory area whilst doing this.
1218          */
1219
1220         if (!LEVEL_II_OPLOCK_TYPE(fsp->oplock_type))
1221                 return;
1222
1223         if (lock_share_entry_fsp(fsp) == False) {
1224                 DEBUG(0,("release_level_2_oplocks_on_change: failed to lock share mode entry for file %s.\n", fsp->fsp_name ));
1225         }
1226
1227         num_share_modes = get_share_modes(fsp->conn, fsp->dev, fsp->inode, &share_list);
1228
1229         DEBUG(10,("release_level_2_oplocks_on_change: num_share_modes = %d\n", 
1230                         num_share_modes ));
1231
1232         for(i = 0; i < num_share_modes; i++) {
1233                 share_mode_entry *share_entry = &share_list[i];
1234
1235                 /*
1236                  * As there could have been multiple writes waiting at the lock_share_entry
1237                  * gate we may not be the first to enter. Hence the state of the op_types
1238                  * in the share mode entries may be partly NO_OPLOCK and partly LEVEL_II
1239                  * oplock. It will do no harm to re-send break messages to those smbd's
1240                  * that are still waiting their turn to remove their LEVEL_II state, and
1241                  * also no harm to ignore existing NO_OPLOCK states. JRA.
1242                  */
1243
1244                 DEBUG(10,("release_level_2_oplocks_on_change: share_entry[%i]->op_type == %d\n",
1245                                 i, share_entry->op_type ));
1246
1247                 if (share_entry->op_type == NO_OPLOCK)
1248                         continue;
1249
1250                 /* Paranoia .... */
1251                 if (EXCLUSIVE_OPLOCK_TYPE(share_entry->op_type)) {
1252                         DEBUG(0,("release_level_2_oplocks_on_change: PANIC. share mode entry %d is an exlusive oplock !\n", i ));
1253                         unlock_share_entry(fsp->conn, fsp->dev, fsp->inode);
1254                         abort();
1255                 }
1256
1257                 /*
1258                  * Check if this is a file we have open (including the
1259                  * file we've been called to do write_file on. If so
1260                  * then break it directly without releasing the lock.
1261                  */
1262
1263                 if (pid == share_entry->pid) {
1264                         files_struct *new_fsp = file_find_dif(share_entry->dev, share_entry->inode, share_entry->share_file_id);
1265
1266                         /* Paranoia check... */
1267                         if(new_fsp == NULL) {
1268                                 DEBUG(0,("release_level_2_oplocks_on_change: PANIC. share mode entry %d is not a local file !\n", i ));
1269                                 unlock_share_entry(fsp->conn, fsp->dev, fsp->inode);
1270                                 abort();
1271                         }
1272
1273                         DEBUG(10,("release_level_2_oplocks_on_change: breaking our own oplock.\n"));
1274
1275                         oplock_break_level2(new_fsp, True);
1276
1277                 } else {
1278
1279                         /*
1280                          * This is a remote file and so we send an asynchronous
1281                          * message.
1282                          */
1283
1284                         DEBUG(10,("release_level_2_oplocks_on_change: breaking remote oplock (async).\n"));
1285                         request_remote_level2_async_oplock_break(share_entry);
1286                 }
1287         }
1288
1289         SAFE_FREE(share_list);
1290         unlock_share_entry_fsp(fsp);
1291
1292         /* Paranoia check... */
1293         if (LEVEL_II_OPLOCK_TYPE(fsp->oplock_type)) {
1294                 DEBUG(0,("release_level_2_oplocks_on_change: PANIC. File %s still has a level II oplock.\n", fsp->fsp_name));
1295                 smb_panic("release_level_2_oplocks_on_change");
1296         }
1297 }
1298
1299 /****************************************************************************
1300  Send a 'retry your open' message to a process with a deferred open entry.
1301 ****************************************************************************/
1302
1303 BOOL send_deferred_open_retry_message(deferred_open_entry *entry)
1304 {
1305         char de_msg[DEFERRED_OPEN_MSG_LEN];
1306         struct sockaddr_in addr_out;
1307         pid_t pid = sys_getpid();
1308
1309         memset(de_msg, '\0', DEFERRED_OPEN_MSG_LEN);
1310         SSVAL(de_msg,DEFERRED_OPEN_CMD_OFFSET,RETRY_DEFERRED_OPEN_CMD);
1311         memcpy(de_msg+DEFERRED_OPEN_PID_OFFSET,(char *)&pid,sizeof(pid));
1312         memcpy(de_msg+DEFERRED_OPEN_DEV_OFFSET,(char *)&entry->dev,sizeof(entry->dev));
1313         memcpy(de_msg+DEFERRED_OPEN_INODE_OFFSET,(char *)&entry->inode,sizeof(entry->inode));
1314         memcpy(de_msg+DEFERRED_OPEN_MID_OFFSET,(char *)&entry->mid,sizeof(entry->mid));
1315
1316         /* Set the address and port. */
1317         memset((char *)&addr_out,'\0',sizeof(addr_out));
1318         addr_out.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
1319         addr_out.sin_port = htons( entry->port );
1320         addr_out.sin_family = AF_INET;
1321    
1322         if( DEBUGLVL( 3 ) ) {
1323                 dbgtext( "send_deferred_open_retry_message: sending a message to ");
1324                 dbgtext( "pid %d on port %d ", (int)entry->pid, entry->port );
1325                 dbgtext( "for dev = %x, inode = %.0f, mid = %u\n",
1326                         (unsigned int)entry->dev, (double)entry->inode, (unsigned int)entry->mid );
1327         }
1328
1329         if(sys_sendto(oplock_sock,de_msg,DEFERRED_OPEN_MSG_LEN,0,
1330                         (struct sockaddr *)&addr_out,sizeof(addr_out)) < 0) {
1331                 if( DEBUGLVL( 0 ) ) {
1332                         dbgtext( "send_deferred_open_retry_message: failed sending a message to ");
1333                         dbgtext( "pid %d on port %d ", (int)entry->pid, entry->port );
1334                         dbgtext( "for dev = %x, inode = %.0f, mid = %u\n",
1335                                 (unsigned int)entry->dev, (double)entry->inode, (unsigned int)entry->mid );
1336                         dbgtext( "Error was %s\n", strerror(errno) );
1337                 }
1338                 return False;
1339         }
1340         return True;
1341 }
1342
1343 /****************************************************************************
1344  Setup oplocks for this process.
1345 ****************************************************************************/
1346
1347 BOOL init_oplocks(void)
1348 {
1349         struct sockaddr_in sock_name;
1350         socklen_t len = sizeof(sock_name);
1351
1352         DEBUG(3,("open_oplock_ipc: opening loopback UDP socket.\n"));
1353
1354         /* Open a lookback UDP socket on a random port. */
1355         oplock_sock = open_socket_in(SOCK_DGRAM, 0, 0, htonl(INADDR_LOOPBACK),False);
1356         if (oplock_sock == -1) {
1357                 DEBUG(0,("open_oplock_ipc: Failed to get local UDP socket for \
1358 address %lx. Error was %s\n", (long)htonl(INADDR_LOOPBACK), strerror(errno)));
1359                 global_oplock_port = 0;
1360                 return(False);
1361         }
1362
1363         /* Find out the transient UDP port we have been allocated. */
1364         if(getsockname(oplock_sock, (struct sockaddr *)&sock_name, &len)<0) {
1365                 DEBUG(0,("open_oplock_ipc: Failed to get local UDP port. Error was %s\n",
1366                          strerror(errno)));
1367                 close(oplock_sock);
1368                 oplock_sock = -1;
1369                 global_oplock_port = 0;
1370                 return False;
1371         }
1372         global_oplock_port = ntohs(sock_name.sin_port);
1373
1374         if (lp_kernel_oplocks()) {
1375 #if HAVE_KERNEL_OPLOCKS_IRIX
1376                 koplocks = irix_init_kernel_oplocks();
1377 #elif HAVE_KERNEL_OPLOCKS_LINUX
1378                 koplocks = linux_init_kernel_oplocks();
1379 #endif
1380         }
1381
1382         DEBUG(3,("open_oplock ipc: pid = %d, global_oplock_port = %u\n", 
1383                  (int)sys_getpid(), global_oplock_port));
1384
1385         return True;
1386 }