2 Unix SMB/Netbios implementation.
5 Copyright (C) Andrew Tridgell 1992-1998
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.
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.
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.
24 extern int DEBUGLEVEL;
26 /* Oplock ipc UDP socket. */
27 static int oplock_sock = -1;
28 uint16 global_oplock_port = 0;
30 /* Current number of oplocks we have outstanding. */
31 static int32 exclusive_oplocks_open = 0;
32 static int32 level_II_oplocks_open = 0;
33 BOOL global_client_failed_oplock_break = False;
34 BOOL global_oplock_break = False;
36 extern int smb_read_error;
38 static struct kernel_oplocks *koplocks;
40 static BOOL oplock_break(SMB_DEV_T dev, SMB_INO_T inode, struct timeval *tval, BOOL local);
42 /****************************************************************************
43 Get the number of current exclusive oplocks.
44 ****************************************************************************/
46 int32 get_number_of_exclusive_open_oplocks(void)
48 return exclusive_oplocks_open;
52 /****************************************************************************
53 Read an oplock break message from either the oplock UDP fd or the
54 kernel (if kernel oplocks are supported).
56 If timeout is zero then *fds contains the file descriptors that
57 are ready to be read and acted upon. If timeout is non-zero then
58 *fds contains the file descriptors to be selected on for read.
59 The timeout is in milliseconds
61 ****************************************************************************/
63 BOOL receive_local_message(fd_set *fds, char *buffer, int buffer_len, int timeout)
65 struct sockaddr_in from;
66 int fromlen = sizeof(from);
74 int maxfd = oplock_sock;
76 if (koplocks && koplocks->notification_fd != -1) {
77 FD_SET(koplocks->notification_fd, fds);
78 maxfd = MAX(maxfd, koplocks->notification_fd);
81 to.tv_sec = timeout / 1000;
82 to.tv_usec = (timeout % 1000) * 1000;
84 selrtn = sys_select(maxfd+1,fds,&to);
86 if (selrtn == -1 && errno == EINTR) {
87 /* could be a kernel oplock interrupt */
88 if (koplocks && koplocks->msg_waiting(fds)) {
89 return koplocks->receive_message(fds, buffer, buffer_len);
95 /* something is wrong. Maybe the socket is dead? */
96 smb_read_error = READ_ERROR;
100 /* Did we timeout ? */
102 smb_read_error = READ_TIMEOUT;
107 if (koplocks && koplocks->msg_waiting(fds)) {
108 return koplocks->receive_message(fds, buffer, buffer_len);
111 if (!FD_ISSET(oplock_sock, fds)) return False;
114 * From here down we deal with the smbd <--> smbd
115 * oplock break protocol only.
119 * Read a loopback udp message.
121 msg_len = recvfrom(oplock_sock, &buffer[OPBRK_CMD_HEADER_LEN],
122 buffer_len - OPBRK_CMD_HEADER_LEN, 0,
123 (struct sockaddr *)&from, &fromlen);
126 DEBUG(0,("receive_local_message. Error in recvfrom. (%s).\n",strerror(errno)));
130 /* Validate message length. */
131 if(msg_len > (buffer_len - OPBRK_CMD_HEADER_LEN)) {
132 DEBUG(0,("receive_local_message: invalid msg_len (%d) max can be %d\n",
134 buffer_len - OPBRK_CMD_HEADER_LEN));
138 /* Validate message from address (must be localhost). */
139 if(from.sin_addr.s_addr != htonl(INADDR_LOOPBACK)) {
140 DEBUG(0,("receive_local_message: invalid 'from' address \
141 (was %lx should be 127.0.0.1\n", (long)from.sin_addr.s_addr));
145 /* Setup the message header */
146 SIVAL(buffer,OPBRK_CMD_LEN_OFFSET,msg_len);
147 SSVAL(buffer,OPBRK_CMD_PORT_OFFSET,ntohs(from.sin_port));
152 /****************************************************************************
153 Attempt to set an oplock on a file. Always succeeds if kernel oplocks are
154 disabled (just sets flags). Returns True if oplock set.
155 ****************************************************************************/
156 BOOL set_file_oplock(files_struct *fsp, int oplock_type)
158 if (koplocks && !koplocks->set_oplock(fsp, oplock_type))
161 fsp->oplock_type = oplock_type;
162 fsp->sent_oplock_break = NO_BREAK_SENT;
163 if (oplock_type == LEVEL_II_OPLOCK)
164 level_II_oplocks_open++;
166 exclusive_oplocks_open++;
168 DEBUG(5,("set_file_oplock: granted oplock on file %s, dev = %x, inode = %.0f, tv_sec = %x, tv_usec = %x\n",
169 fsp->fsp_name, (unsigned int)fsp->dev, (double)fsp->inode,
170 (int)fsp->open_time.tv_sec, (int)fsp->open_time.tv_usec ));
175 /****************************************************************************
176 Attempt to release an oplock on a file. Decrements oplock count.
177 ****************************************************************************/
179 void release_file_oplock(files_struct *fsp)
181 if (koplocks) koplocks->release_oplock(fsp);
183 if (fsp->oplock_type == LEVEL_II_OPLOCK)
184 level_II_oplocks_open--;
186 exclusive_oplocks_open--;
188 fsp->oplock_type = NO_OPLOCK;
189 fsp->sent_oplock_break = NO_BREAK_SENT;
191 flush_write_cache(fsp, OPLOCK_RELEASE_FLUSH);
194 /****************************************************************************
195 Attempt to downgrade an oplock on a file. Doesn't decrement oplock count.
196 ****************************************************************************/
198 static void downgrade_file_oplock(files_struct *fsp)
200 if (koplocks) koplocks->release_oplock(fsp);
201 fsp->oplock_type = LEVEL_II_OPLOCK;
202 exclusive_oplocks_open--;
203 level_II_oplocks_open++;
204 fsp->sent_oplock_break = NO_BREAK_SENT;
207 /****************************************************************************
208 Remove a file oplock. Copes with level II and exclusive.
209 Locks then unlocks the share mode lock. Client can decide to go directly
210 to none even if a "break-to-level II" was sent.
211 ****************************************************************************/
213 BOOL remove_oplock(files_struct *fsp, BOOL break_to_none)
215 SMB_DEV_T dev = fsp->dev;
216 SMB_INO_T inode = fsp->inode;
219 /* Remove the oplock flag from the sharemode. */
220 if (lock_share_entry_fsp(fsp) == False) {
221 DEBUG(0,("remove_oplock: failed to lock share entry for file %s\n",
226 if (fsp->sent_oplock_break == EXCLUSIVE_BREAK_SENT || break_to_none) {
228 * Deal with a reply when a break-to-none was sent.
231 if(remove_share_oplock(fsp)==False) {
232 DEBUG(0,("remove_oplock: failed to remove share oplock for file %s fnum %d, \
233 dev = %x, inode = %.0f\n", fsp->fsp_name, fsp->fnum, (unsigned int)dev, (double)inode));
237 release_file_oplock(fsp);
240 * Deal with a reply when a break-to-level II was sent.
242 if(downgrade_share_oplock(fsp)==False) {
243 DEBUG(0,("remove_oplock: failed to downgrade share oplock for file %s fnum %d, \
244 dev = %x, inode = %.0f\n", fsp->fsp_name, fsp->fnum, (unsigned int)dev, (double)inode));
248 downgrade_file_oplock(fsp);
251 unlock_share_entry_fsp(fsp);
255 /****************************************************************************
256 Setup the listening set of file descriptors for an oplock break
257 message either from the UDP socket or from the kernel. Returns the maximum
259 ****************************************************************************/
261 int setup_oplock_select_set( fd_set *fds)
263 int maxfd = oplock_sock;
265 if(oplock_sock == -1)
268 FD_SET(oplock_sock,fds);
270 if (koplocks && koplocks->notification_fd != -1) {
271 FD_SET(koplocks->notification_fd, fds);
272 maxfd = MAX(maxfd, koplocks->notification_fd);
278 /****************************************************************************
279 Process an oplock break message - whether it came from the UDP socket
281 ****************************************************************************/
282 BOOL process_local_message(char *buffer, int buf_size)
291 struct timeval *ptval = NULL;
292 uint16 break_cmd_type;
294 msg_len = IVAL(buffer,OPBRK_CMD_LEN_OFFSET);
295 from_port = SVAL(buffer,OPBRK_CMD_PORT_OFFSET);
297 msg_start = &buffer[OPBRK_CMD_HEADER_LEN];
299 DEBUG(5,("process_local_message: Got a message of length %d from port (%d)\n",
300 msg_len, from_port));
303 * Pull the info out of the requesting packet.
306 break_cmd_type = SVAL(msg_start,OPBRK_MESSAGE_CMD_OFFSET);
308 switch(break_cmd_type)
310 case KERNEL_OPLOCK_BREAK_CMD:
312 DEBUG(0,("unexpected kernel oplock break!\n"));
315 if (!koplocks->parse_message(msg_start, msg_len, &inode, &dev)) {
316 DEBUG(0,("kernel oplock break parse failure!\n"));
320 case OPLOCK_BREAK_CMD:
321 case LEVEL_II_OPLOCK_BREAK_CMD:
323 /* Ensure that the msg length is correct. */
324 if(msg_len != OPLOCK_BREAK_MSG_LEN)
326 DEBUG(0,("process_local_message: incorrect length for OPLOCK_BREAK_CMD (was %d, should be %d).\n",
327 (int)msg_len, (int)OPLOCK_BREAK_MSG_LEN));
334 memcpy((char *)&inode, msg_start+OPLOCK_BREAK_INODE_OFFSET,sizeof(inode));
335 memcpy((char *)&dev, msg_start+OPLOCK_BREAK_DEV_OFFSET,sizeof(dev));
336 memcpy((char *)&sec, msg_start+OPLOCK_BREAK_SEC_OFFSET,sizeof(sec));
338 memcpy((char *)&usec, msg_start+OPLOCK_BREAK_USEC_OFFSET, sizeof(usec));
343 memcpy((char *)&remotepid, msg_start+OPLOCK_BREAK_PID_OFFSET,sizeof(remotepid));
345 DEBUG(5,("process_local_message: (%s) oplock break request from \
346 pid %d, port %d, dev = %x, inode = %.0f\n",
347 (break_cmd_type == OPLOCK_BREAK_CMD) ? "exclusive" : "level II",
348 (int)remotepid, from_port, (unsigned int)dev, (double)inode));
353 * Keep this as a debug case - eventually we can remove it.
356 DEBUG(0,("process_local_message: Received unsolicited break \
357 reply - dumping info.\n"));
359 if(msg_len != OPLOCK_BREAK_MSG_LEN)
361 DEBUG(0,("process_local_message: ubr: incorrect length for reply \
362 (was %d, should be %d).\n", (int)msg_len, (int)OPLOCK_BREAK_MSG_LEN));
367 memcpy((char *)&inode, msg_start+OPLOCK_BREAK_INODE_OFFSET,sizeof(inode));
368 memcpy((char *)&remotepid, msg_start+OPLOCK_BREAK_PID_OFFSET,sizeof(remotepid));
369 memcpy((char *)&dev, msg_start+OPLOCK_BREAK_DEV_OFFSET,sizeof(dev));
371 DEBUG(0,("process_local_message: unsolicited oplock break reply from \
372 pid %d, port %d, dev = %x, inode = %.0f\n", (int)remotepid, from_port, (unsigned int)dev, (double)inode));
378 DEBUG(0,("process_local_message: unknown UDP message command code (%x) - ignoring.\n",
379 (unsigned int)SVAL(msg_start,0)));
384 * Now actually process the break request.
387 if((exclusive_oplocks_open + level_II_oplocks_open) != 0)
389 if (oplock_break(dev, inode, ptval, False) == False)
391 DEBUG(0,("process_local_message: oplock break failed.\n"));
398 * If we have no record of any currently open oplocks,
399 * it's not an error, as a close command may have
400 * just been issued on the file that was oplocked.
401 * Just log a message and return success in this case.
403 DEBUG(3,("process_local_message: oplock break requested with no outstanding \
404 oplocks. Returning success.\n"));
408 * Do the appropriate reply - none in the kernel or level II case.
411 if(SVAL(msg_start,OPBRK_MESSAGE_CMD_OFFSET) == OPLOCK_BREAK_CMD)
413 struct sockaddr_in toaddr;
415 /* Send the message back after OR'ing in the 'REPLY' bit. */
416 SSVAL(msg_start,OPBRK_MESSAGE_CMD_OFFSET,OPLOCK_BREAK_CMD | CMD_REPLY);
418 memset((char *)&toaddr,'\0',sizeof(toaddr));
419 toaddr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
420 toaddr.sin_port = htons(from_port);
421 toaddr.sin_family = AF_INET;
423 if(sendto( oplock_sock, msg_start, OPLOCK_BREAK_MSG_LEN, 0,
424 (struct sockaddr *)&toaddr, sizeof(toaddr)) < 0)
426 DEBUG(0,("process_local_message: sendto process %d failed. Errno was %s\n",
427 (int)remotepid, strerror(errno)));
431 DEBUG(5,("process_local_message: oplock break reply sent to \
432 pid %d, port %d, for file dev = %x, inode = %.0f\n",
433 (int)remotepid, from_port, (unsigned int)dev, (double)inode));
439 /****************************************************************************
440 Set up an oplock break message.
441 ****************************************************************************/
443 static void prepare_break_message(char *outbuf, files_struct *fsp, BOOL level2)
445 memset(outbuf,'\0',smb_size);
446 set_message(outbuf,8,0,True);
448 SCVAL(outbuf,smb_com,SMBlockingX);
449 SSVAL(outbuf,smb_tid,fsp->conn->cnum);
450 SSVAL(outbuf,smb_pid,0xFFFF);
451 SSVAL(outbuf,smb_uid,0);
452 SSVAL(outbuf,smb_mid,0xFFFF);
453 SCVAL(outbuf,smb_vwv0,0xFF);
454 SSVAL(outbuf,smb_vwv2,fsp->fnum);
455 SCVAL(outbuf,smb_vwv3,LOCKING_ANDX_OPLOCK_RELEASE);
456 SCVAL(outbuf,smb_vwv3+1,level2 ? OPLOCKLEVEL_II : OPLOCKLEVEL_NONE);
459 /****************************************************************************
460 Function to do the waiting before sending a local break.
461 ****************************************************************************/
463 static void wait_before_sending_break(BOOL local_request)
465 extern struct timeval smb_last_time;
468 struct timeval cur_tv;
469 long wait_left = (long)lp_oplock_break_wait_time();
474 GetTimeOfDay(&cur_tv);
476 wait_left -= ((cur_tv.tv_sec - smb_last_time.tv_sec)*1000) +
477 ((cur_tv.tv_usec - smb_last_time.tv_usec)/1000);
480 wait_left = MIN(wait_left, 1000);
481 sys_usleep(wait_left * 1000);
486 /****************************************************************************
487 Ensure that we have a valid oplock.
488 ****************************************************************************/
489 static files_struct *initial_break_processing(SMB_DEV_T dev, SMB_INO_T inode, struct timeval *tval)
491 files_struct *fsp = NULL;
495 dbgtext( "initial_break_processing: called for dev = %x, inode = %.0f tv_sec = %x, tv_usec = %x.\n",
496 (unsigned int)dev, (double)inode, tval ? (int)tval->tv_sec : 0,
497 tval ? (int)tval->tv_usec : 0);
498 dbgtext( "Current oplocks_open (exclusive = %d, levelII = %d)\n",
499 exclusive_oplocks_open, level_II_oplocks_open );
502 /* We need to search the file open table for the
503 entry containing this dev and inode, and ensure
504 we have an oplock on it. */
505 fsp = file_find_dit(dev, inode, tval);
509 /* The file could have been closed in the meantime - return success. */
512 dbgtext( "initial_break_processing: cannot find open file with " );
513 dbgtext( "dev = %x, inode = %.0f ", (unsigned int)dev, (double)inode);
514 dbgtext( "allowing break to succeed.\n" );
519 /* Ensure we have an oplock on the file */
521 /* There is a potential race condition in that an oplock could
522 have been broken due to another udp request, and yet there are
523 still oplock break messages being sent in the udp message
524 queue for this file. So return true if we don't have an oplock,
525 as we may have just freed it.
528 if(fsp->oplock_type == NO_OPLOCK)
532 dbgtext( "initial_break_processing: file %s ", fsp->fsp_name );
533 dbgtext( "(dev = %x, inode = %.0f) has no oplock.\n", (unsigned int)dev, (double)inode );
534 dbgtext( "Allowing break to succeed regardless.\n" );
542 /****************************************************************************
543 Process a level II oplock break directly.
544 ****************************************************************************/
546 BOOL oplock_break_level2(files_struct *fsp, BOOL local_request, int token)
548 extern uint32 global_client_caps;
550 BOOL got_lock = False;
551 SMB_DEV_T dev = fsp->dev;
552 SMB_INO_T inode = fsp->inode;
555 * We can have a level II oplock even if the client is not
556 * level II oplock aware. In this case just remove the
557 * flags and don't send the break-to-none message to
561 if (global_client_caps & CAP_LEVEL_II_OPLOCKS) {
563 * If we are sending an oplock break due to an SMB sent
564 * by our own client we ensure that we wait at leat
565 * lp_oplock_break_wait_time() milliseconds before sending
566 * the packet. Sending the packet sooner can break Win9x
567 * and has reported to cause problems on NT. JRA.
570 wait_before_sending_break(local_request);
572 /* Prepare the SMBlockingX message. */
574 prepare_break_message( outbuf, fsp, False);
575 send_smb(smbd_server_fd(), outbuf);
579 * Now we must update the shared memory structure to tell
580 * everyone else we no longer have a level II oplock on
581 * this open file. If local_request is true then token is
582 * the existing lock on the shared memory area.
585 if(!local_request && lock_share_entry_fsp(fsp) == False) {
586 DEBUG(0,("oplock_break_level2: unable to lock share entry for file %s\n", fsp->fsp_name ));
591 if(remove_share_oplock(fsp)==False) {
592 DEBUG(0,("oplock_break_level2: unable to remove level II oplock for file %s\n", fsp->fsp_name ));
595 if (!local_request && got_lock)
596 unlock_share_entry_fsp(fsp);
598 fsp->oplock_type = NO_OPLOCK;
599 level_II_oplocks_open--;
601 if(level_II_oplocks_open < 0)
603 DEBUG(0,("oplock_break_level2: level_II_oplocks_open < 0 (%d). PANIC ERROR\n",
604 level_II_oplocks_open));
610 dbgtext( "oplock_break_level2: returning success for " );
611 dbgtext( "dev = %x, inode = %.0f\n", (unsigned int)dev, (double)inode );
612 dbgtext( "Current level II oplocks_open = %d\n", level_II_oplocks_open );
618 /****************************************************************************
619 Process an oplock break directly.
620 ****************************************************************************/
622 static BOOL oplock_break(SMB_DEV_T dev, SMB_INO_T inode, struct timeval *tval, BOOL local_request)
624 extern uint32 global_client_caps;
625 extern struct current_user current_user;
628 files_struct *fsp = NULL;
630 BOOL shutdown_server = False;
631 BOOL oplock_timeout = False;
632 connection_struct *saved_conn;
635 int timeout = (OPLOCK_BREAK_TIMEOUT * 1000);
639 if((fsp = initial_break_processing(dev, inode, tval)) == NULL)
643 * Deal with a level II oplock going break to none separately.
646 if (LEVEL_II_OPLOCK_TYPE(fsp->oplock_type))
647 return oplock_break_level2(fsp, local_request, -1);
649 /* Mark the oplock break as sent - we don't want to send twice! */
650 if (fsp->sent_oplock_break)
654 dbgtext( "oplock_break: ERROR: oplock_break already sent for " );
655 dbgtext( "file %s ", fsp->fsp_name);
656 dbgtext( "(dev = %x, inode = %.0f)\n", (unsigned int)dev, (double)inode );
659 /* We have to fail the open here as we cannot send another oplock break on
660 this file whilst we are awaiting a response from the client - neither
661 can we allow another open to succeed while we are waiting for the
667 if(global_oplock_break) {
668 DEBUG(0,("ABORT : ABORT : recursion in oplock_break !!!!!\n"));
672 /* Now comes the horrid part. We must send an oplock break to the client,
673 and then process incoming messages until we get a close or oplock release.
674 At this point we know we need a new inbuf/outbuf buffer pair.
675 We cannot use these staticaly as we may recurse into here due to
676 messages crossing on the wire.
679 if((inbuf = (char *)malloc(BUFFER_SIZE + SAFETY_MARGIN))==NULL)
681 DEBUG(0,("oplock_break: malloc fail for input buffer.\n"));
685 if((outbuf = (char *)malloc(BUFFER_SIZE + SAFETY_MARGIN))==NULL)
687 DEBUG(0,("oplock_break: malloc fail for output buffer.\n"));
694 * If we are sending an oplock break due to an SMB sent
695 * by our own client we ensure that we wait at leat
696 * lp_oplock_break_wait_time() milliseconds before sending
697 * the packet. Sending the packet sooner can break Win9x
698 * and has reported to cause problems on NT. JRA.
701 wait_before_sending_break(local_request);
703 /* Prepare the SMBlockingX message. */
705 if ((global_client_caps & CAP_LEVEL_II_OPLOCKS) &&
706 !koplocks && /* NOTE: we force levelII off for kernel oplocks -
707 this will change when it is supported */
708 lp_level2_oplocks(SNUM(fsp->conn))) {
709 using_levelII = True;
711 using_levelII = False;
714 prepare_break_message( outbuf, fsp, using_levelII);
715 /* Remember if we just sent a break to level II on this file. */
716 fsp->sent_oplock_break = using_levelII?
717 LEVEL_II_BREAK_SENT:EXCLUSIVE_BREAK_SENT;
719 send_smb(smbd_server_fd(), outbuf);
721 /* We need this in case a readraw crosses on the wire. */
722 global_oplock_break = True;
724 /* Process incoming messages. */
726 /* JRA - If we don't get a break from the client in OPLOCK_BREAK_TIMEOUT
727 seconds we should just die.... */
729 start_time = time(NULL);
732 * Save the information we need to re-become the
733 * user, then unbecome the user whilst we're doing this.
735 saved_conn = fsp->conn;
736 saved_vuid = current_user.vuid;
737 vfs_GetWd(saved_conn,saved_dir);
739 /* Save the chain fnum. */
743 * From Charles Hoch <hoch@exemplary.com>. If the break processing
744 * code closes the file (as it often does), then the fsp pointer here
745 * points to free()'d memory. We *must* revalidate fsp each time
749 pstrcpy(file_name, fsp->fsp_name);
751 while((fsp = initial_break_processing(dev, inode, tval)) &&
752 OPEN_FSP(fsp) && EXCLUSIVE_OPLOCK_TYPE(fsp->oplock_type))
754 if(receive_smb(smbd_server_fd(),inbuf, timeout) == False)
757 * Die if we got an error.
760 if (smb_read_error == READ_EOF) {
761 DEBUG( 0, ( "oplock_break: end of file from client\n" ) );
762 shutdown_server = True;
763 } else if (smb_read_error == READ_ERROR) {
764 DEBUG( 0, ("oplock_break: receive_smb error (%s)\n", strerror(errno)) );
765 shutdown_server = True;
766 } else if (smb_read_error == READ_TIMEOUT) {
767 DEBUG( 0, ( "oplock_break: receive_smb timed out after %d seconds.\n",
768 OPLOCK_BREAK_TIMEOUT ) );
769 oplock_timeout = True;
772 DEBUGADD( 0, ( "oplock_break failed for file %s ", file_name ) );
773 DEBUGADD( 0, ( "(dev = %x, inode = %.0f).\n", (unsigned int)dev, (double)inode));
779 * There are certain SMB requests that we shouldn't allow
780 * to recurse. opens, renames and deletes are the obvious
781 * ones. This is handled in the switch_message() function.
782 * If global_oplock_break is set they will push the packet onto
783 * the pending smb queue and return -1 (no reply).
787 process_smb(inbuf, outbuf);
790 * Die if we go over the time limit.
793 if((time(NULL) - start_time) > OPLOCK_BREAK_TIMEOUT)
797 dbgtext( "oplock_break: no break received from client " );
798 dbgtext( "within %d seconds.\n", OPLOCK_BREAK_TIMEOUT );
799 dbgtext( "oplock_break failed for file %s ", fsp->fsp_name );
800 dbgtext( "(dev = %x, inode = %.0f).\n", (unsigned int)dev, (double)inode );
802 oplock_timeout = True;
808 * Go back to being the user who requested the oplock
811 if(!become_user(saved_conn, saved_vuid))
813 DEBUG( 0, ( "oplock_break: unable to re-become user!" ) );
814 DEBUGADD( 0, ( "Shutting down server\n" ) );
816 exit_server("unable to re-become user");
818 /* Including the directory. */
819 vfs_ChDir(saved_conn,saved_dir);
821 /* Restore the chain fnum. */
822 file_chain_restore();
824 /* Free the buffers we've been using to recurse. */
828 /* We need this in case a readraw crossed on the wire. */
829 if(global_oplock_break)
830 global_oplock_break = False;
833 * If the client timed out then clear the oplock (or go to level II)
834 * and continue. This seems to be what NT does and is better than dropping
838 if(oplock_timeout && (fsp = initial_break_processing(dev, inode, tval)) &&
839 OPEN_FSP(fsp) && EXCLUSIVE_OPLOCK_TYPE(fsp->oplock_type))
841 DEBUG(0,("oplock_break: client failure in oplock break in file %s\n", fsp->fsp_name));
842 remove_oplock(fsp,True);
843 global_client_failed_oplock_break = True; /* Never grant this client an oplock again. */
847 * If the client had an error we must die.
852 DEBUG( 0, ( "oplock_break: client failure in break - " ) );
853 DEBUGADD( 0, ( "shutting down this smbd.\n" ) );
855 exit_server("oplock break failure");
858 /* Santity check - remove this later. JRA */
859 if(exclusive_oplocks_open < 0)
861 DEBUG(0,("oplock_break: exclusive_oplocks_open < 0 (%d). PANIC ERROR\n",
862 exclusive_oplocks_open));
868 dbgtext( "oplock_break: returning success for " );
869 dbgtext( "dev = %x, inode = %.0f\n", (unsigned int)dev, (double)inode );
870 dbgtext( "Current exclusive_oplocks_open = %d\n", exclusive_oplocks_open );
876 /****************************************************************************
877 Send an oplock break message to another smbd process. If the oplock is held
878 by the local smbd then call the oplock break function directly.
879 ****************************************************************************/
881 BOOL request_oplock_break(share_mode_entry *share_entry,
882 SMB_DEV_T dev, SMB_INO_T inode)
884 char op_break_msg[OPLOCK_BREAK_MSG_LEN];
885 struct sockaddr_in addr_out;
886 pid_t pid = sys_getpid();
892 if(pid == share_entry->pid)
894 /* We are breaking our own oplock, make sure it's us. */
895 if(share_entry->op_port != global_oplock_port)
897 DEBUG(0,("request_oplock_break: corrupt share mode entry - pid = %d, port = %d \
898 should be %d\n", (int)pid, share_entry->op_port, global_oplock_port));
902 DEBUG(5,("request_oplock_break: breaking our own oplock\n"));
904 /* Call oplock break direct. */
905 return oplock_break(dev, inode, &share_entry->time, True);
908 /* We need to send a OPLOCK_BREAK_CMD message to the
909 port in the share mode entry. */
911 if (LEVEL_II_OPLOCK_TYPE(share_entry->op_type)) {
912 SSVAL(op_break_msg,OPBRK_MESSAGE_CMD_OFFSET,LEVEL_II_OPLOCK_BREAK_CMD);
914 SSVAL(op_break_msg,OPBRK_MESSAGE_CMD_OFFSET,OPLOCK_BREAK_CMD);
916 memcpy(op_break_msg+OPLOCK_BREAK_PID_OFFSET,(char *)&pid,sizeof(pid));
917 sec = (time_t)share_entry->time.tv_sec;
918 memcpy(op_break_msg+OPLOCK_BREAK_SEC_OFFSET,(char *)&sec,sizeof(sec));
919 usec = (long)share_entry->time.tv_usec;
920 memcpy(op_break_msg+OPLOCK_BREAK_USEC_OFFSET,(char *)&usec,sizeof(usec));
921 memcpy(op_break_msg+OPLOCK_BREAK_DEV_OFFSET,(char *)&dev,sizeof(dev));
922 memcpy(op_break_msg+OPLOCK_BREAK_INODE_OFFSET,(char *)&inode,sizeof(inode));
924 /* set the address and port */
925 memset((char *)&addr_out,'\0',sizeof(addr_out));
926 addr_out.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
927 addr_out.sin_port = htons( share_entry->op_port );
928 addr_out.sin_family = AF_INET;
932 dbgtext( "request_oplock_break: sending a oplock break message to " );
933 dbgtext( "pid %d on port %d ", (int)share_entry->pid, share_entry->op_port );
934 dbgtext( "for dev = %x, inode = %.0f, tv_sec = %x, tv_usec = %x\n",
935 (unsigned int)dev, (double)inode, (int)share_entry->time.tv_sec,
936 (int)share_entry->time.tv_usec );
940 if(sendto(oplock_sock,op_break_msg,OPLOCK_BREAK_MSG_LEN,0,
941 (struct sockaddr *)&addr_out,sizeof(addr_out)) < 0)
945 dbgtext( "request_oplock_break: failed when sending a oplock " );
946 dbgtext( "break message to pid %d ", (int)share_entry->pid );
947 dbgtext( "on port %d ", share_entry->op_port );
948 dbgtext( "for dev = %x, inode = %.0f, tv_sec = %x, tv_usec = %x\n",
949 (unsigned int)dev, (double)inode, (int)share_entry->time.tv_sec,
950 (int)share_entry->time.tv_usec );
951 dbgtext( "Error was %s\n", strerror(errno) );
957 * If we just sent a message to a level II oplock share entry then
958 * we are done and may return.
961 if (LEVEL_II_OPLOCK_TYPE(share_entry->op_type)) {
962 DEBUG(3,("request_oplock_break: sent break message to level II entry.\n"));
967 * Now we must await the oplock broken message coming back
968 * from the target smbd process. Timeout if it fails to
969 * return in (OPLOCK_BREAK_TIMEOUT + OPLOCK_BREAK_TIMEOUT_FUDGEFACTOR) seconds.
970 * While we get messages that aren't ours, loop.
973 start_time = time(NULL);
974 time_left = OPLOCK_BREAK_TIMEOUT+OPLOCK_BREAK_TIMEOUT_FUDGEFACTOR;
976 while(time_left >= 0)
978 char op_break_reply[OPBRK_CMD_HEADER_LEN+OPLOCK_BREAK_MSG_LEN];
979 uint16 reply_from_port;
980 char *reply_msg_start;
984 FD_SET(oplock_sock,&fds);
986 if (koplocks && koplocks->notification_fd != -1) {
987 FD_SET(koplocks->notification_fd, &fds);
990 if(receive_local_message(&fds, op_break_reply, sizeof(op_break_reply),
991 time_left ? time_left * 1000 : 1) == False)
993 if(smb_read_error == READ_TIMEOUT)
997 dbgtext( "request_oplock_break: no response received to oplock " );
998 dbgtext( "break request to pid %d ", (int)share_entry->pid );
999 dbgtext( "on port %d ", share_entry->op_port );
1000 dbgtext( "for dev = %x, inode = %.0f\n", (unsigned int)dev, (double)inode );
1001 dbgtext( "for dev = %x, inode = %.0f, tv_sec = %x, tv_usec = %x\n",
1002 (unsigned int)dev, (double)inode, (int)share_entry->time.tv_sec,
1003 (int)share_entry->time.tv_usec );
1007 * This is a hack to make handling of failing clients more robust.
1008 * If a oplock break response message is not received in the timeout
1009 * period we may assume that the smbd servicing that client holding
1010 * the oplock has died and the client changes were lost anyway, so
1011 * we should continue to try and open the file.
1018 dbgtext( "request_oplock_break: error in response received " );
1019 dbgtext( "to oplock break request to pid %d ", (int)share_entry->pid );
1020 dbgtext( "on port %d ", share_entry->op_port );
1021 dbgtext( "for dev = %x, inode = %.0f, tv_sec = %x, tv_usec = %x\n",
1022 (unsigned int)dev, (double)inode, (int)share_entry->time.tv_sec,
1023 (int)share_entry->time.tv_usec );
1024 dbgtext( "Error was (%s).\n", strerror(errno) );
1029 reply_from_port = SVAL(op_break_reply,OPBRK_CMD_PORT_OFFSET);
1031 reply_msg_start = &op_break_reply[OPBRK_CMD_HEADER_LEN];
1035 * Test to see if this is the reply we are awaiting.
1037 if((SVAL(reply_msg_start,OPBRK_MESSAGE_CMD_OFFSET) & CMD_REPLY) &&
1038 ((SVAL(reply_msg_start,OPBRK_MESSAGE_CMD_OFFSET) & ~CMD_REPLY) == OPLOCK_BREAK_CMD) &&
1039 (reply_from_port == share_entry->op_port) &&
1040 (memcmp(&reply_msg_start[OPLOCK_BREAK_PID_OFFSET],
1041 &op_break_msg[OPLOCK_BREAK_PID_OFFSET],
1042 OPLOCK_BREAK_MSG_LEN - OPLOCK_BREAK_PID_OFFSET) == 0))
1045 * This is the reply we've been waiting for.
1052 * This is another message - a break request.
1053 * Note that both kernel oplock break requests
1054 * and UDP inter-smbd oplock break requests will
1055 * be processed here.
1057 * Process it to prevent potential deadlock.
1058 * Note that the code in switch_message() prevents
1059 * us from recursing into here as any SMB requests
1060 * we might process that would cause another oplock
1061 * break request to be made will be queued.
1065 process_local_message(op_break_reply, sizeof(op_break_reply));
1068 time_left -= (time(NULL) - start_time);
1071 DEBUG(3,("request_oplock_break: broke oplock.\n"));
1076 /****************************************************************************
1077 Attempt to break an oplock on a file (if oplocked).
1078 Returns True if the file was closed as a result of
1079 the oplock break, False otherwise.
1080 Used as a last ditch attempt to free a space in the
1081 file table when we have run out.
1082 ****************************************************************************/
1083 BOOL attempt_close_oplocked_file(files_struct *fsp)
1086 DEBUG(5,("attempt_close_oplocked_file: checking file %s.\n", fsp->fsp_name));
1088 if (EXCLUSIVE_OPLOCK_TYPE(fsp->oplock_type) && !fsp->sent_oplock_break && (fsp->fd != -1)) {
1089 /* Try and break the oplock. */
1090 if (oplock_break(fsp->dev, fsp->inode, &fsp->open_time, True)) {
1091 if(file_find_fsp(fsp) == NULL) /* Did the oplock break close the file ? */
1099 /****************************************************************************
1100 This function is called on any file modification or lock request. If a file
1101 is level 2 oplocked then it must tell all other level 2 holders to break to none.
1102 ****************************************************************************/
1104 void release_level_2_oplocks_on_change(files_struct *fsp)
1106 share_mode_entry *share_list = NULL;
1107 pid_t pid = sys_getpid();
1109 int num_share_modes = 0;
1113 * If this file is level II oplocked then we need
1114 * to grab the shared memory lock and inform all
1115 * other files with a level II lock that they need
1116 * to flush their read caches. We keep the lock over
1117 * the shared memory area whilst doing this.
1120 if (!LEVEL_II_OPLOCK_TYPE(fsp->oplock_type))
1123 if (lock_share_entry_fsp(fsp) == False) {
1124 DEBUG(0,("release_level_2_oplocks_on_change: failed to lock share mode entry for file %s.\n", fsp->fsp_name ));
1127 num_share_modes = get_share_modes(fsp->conn, fsp->dev, fsp->inode, &share_list);
1129 for(i = 0; i < num_share_modes; i++) {
1130 share_mode_entry *share_entry = &share_list[i];
1133 * As there could have been multiple writes waiting at the lock_share_entry
1134 * gate we may not be the first to enter. Hence the state of the op_types
1135 * in the share mode entries may be partly NO_OPLOCK and partly LEVEL_II
1136 * oplock. It will do no harm to re-send break messages to those smbd's
1137 * that are still waiting their turn to remove their LEVEL_II state, and
1138 * also no harm to ignore existing NO_OPLOCK states. JRA.
1141 if (share_entry->op_type == NO_OPLOCK)
1145 if (EXCLUSIVE_OPLOCK_TYPE(share_entry->op_type)) {
1146 DEBUG(0,("release_level_2_oplocks_on_change: PANIC. share mode entry %d is an exlusive oplock !\n", i ));
1147 unlock_share_entry(fsp->conn, fsp->dev, fsp->inode);
1152 * Check if this is a file we have open (including the
1153 * file we've been called to do write_file on. If so
1154 * then break it directly without releasing the lock.
1157 if (pid == share_entry->pid) {
1158 files_struct *new_fsp = file_find_dit(fsp->dev, fsp->inode, &share_entry->time);
1160 /* Paranoia check... */
1161 if(new_fsp == NULL) {
1162 DEBUG(0,("release_level_2_oplocks_on_change: PANIC. share mode entry %d is not a local file !\n", i ));
1163 unlock_share_entry(fsp->conn, fsp->dev, fsp->inode);
1167 oplock_break_level2(new_fsp, True, token);
1172 * This is a remote file and so we send an asynchronous
1176 request_oplock_break(share_entry, fsp->dev, fsp->inode);
1180 free((char *)share_list);
1181 unlock_share_entry_fsp(fsp);
1183 /* Paranoia check... */
1184 if (LEVEL_II_OPLOCK_TYPE(fsp->oplock_type)) {
1185 DEBUG(0,("release_level_2_oplocks_on_change: PANIC. File %s still has a level II oplock.\n", fsp->fsp_name));
1190 /****************************************************************************
1191 setup oplocks for this process
1192 ****************************************************************************/
1193 BOOL init_oplocks(void)
1195 struct sockaddr_in sock_name;
1196 int len = sizeof(sock_name);
1198 DEBUG(3,("open_oplock_ipc: opening loopback UDP socket.\n"));
1200 /* Open a lookback UDP socket on a random port. */
1201 oplock_sock = open_socket_in(SOCK_DGRAM, 0, 0, htonl(INADDR_LOOPBACK),False);
1202 if (oplock_sock == -1) {
1203 DEBUG(0,("open_oplock_ipc: Failed to get local UDP socket for \
1204 address %lx. Error was %s\n", (long)htonl(INADDR_LOOPBACK), strerror(errno)));
1205 global_oplock_port = 0;
1209 /* Find out the transient UDP port we have been allocated. */
1210 if(getsockname(oplock_sock, (struct sockaddr *)&sock_name, &len)<0) {
1211 DEBUG(0,("open_oplock_ipc: Failed to get local UDP port. Error was %s\n",
1215 global_oplock_port = 0;
1218 global_oplock_port = ntohs(sock_name.sin_port);
1220 if (lp_kernel_oplocks()) {
1221 #if HAVE_KERNEL_OPLOCKS_IRIX
1222 koplocks = irix_init_kernel_oplocks();
1223 #elif HAVE_KERNEL_OPLOCKS_LINUX
1224 koplocks = linux_init_kernel_oplocks();
1228 DEBUG(3,("open_oplock ipc: pid = %d, global_oplock_port = %u\n",
1229 (int)sys_getpid(), global_oplock_port));