Merge of receive_local_message fix from 2.2.5.
authorJeremy Allison <jra@samba.org>
Wed, 22 May 2002 01:04:58 +0000 (01:04 +0000)
committerJeremy Allison <jra@samba.org>
Wed, 22 May 2002 01:04:58 +0000 (01:04 +0000)
Jeremy.

source/smbd/oplock.c
source/smbd/oplock_irix.c
source/smbd/oplock_linux.c
source/smbd/process.c

index 781de075b6407044a40d9269c428b625a63310cc..bf0e1cf69afa13807d8b62d3d5f5996edee616b0 100644 (file)
@@ -72,11 +72,12 @@ BOOL oplock_message_waiting(fd_set *fds)
 
 ****************************************************************************/
 
-BOOL receive_local_message(fd_set *fds, char *buffer, int buffer_len, int timeout)
+BOOL receive_local_message( char *buffer, int buffer_len, int timeout)
 {
        struct sockaddr_in from;
        socklen_t fromlen = sizeof(from);
        int32 msg_len = 0;
+       fd_set fds;
 
        smb_read_error = 0;
 
@@ -90,26 +91,29 @@ BOOL receive_local_message(fd_set *fds, char *buffer, int buffer_len, int timeou
 
                starttime = time(NULL);
 
-               if (koplocks && koplocks->notification_fd != -1) {
-                       FD_SET(koplocks->notification_fd, fds);
-                       maxfd = MAX(maxfd, koplocks->notification_fd);
-               }
+               FD_ZERO(&fds);
+               maxfd = setup_oplock_select_set(&fds);
 
                to.tv_sec = timeout / 1000;
                to.tv_usec = (timeout % 1000) * 1000;
 
-               selrtn = sys_select(maxfd+1,fds,NULL,NULL,&to);
+               DEBUG(5,("receive_local_message: doing select with timeout of %d ms\n", timeout));
+
+               selrtn = sys_select(maxfd+1,&fds,NULL,NULL,&to);
 
                if (selrtn == -1 && errno == EINTR) {
                        /* could be a kernel oplock interrupt */
-                       if (koplocks && koplocks->msg_waiting(fds)) {
-                               return koplocks->receive_message(fds, buffer, buffer_len);
+                       if (koplocks && koplocks->msg_waiting(&fds)) {
+                               return koplocks->receive_message(&fds, buffer, buffer_len);
                        }
                        /* Not a kernel interrupt - could be a SIGUSR1 message. We must restart. */
                        /* We need to decrement the timeout here. */
                        timeout -= ((time(NULL) - starttime)*1000);
                        if (timeout < 0)
                                timeout = 0;
+
+                       DEBUG(5,("receive_local_message: EINTR : new timeout %d ms\n", timeout));
+
                        goto again;
                }
 
@@ -127,11 +131,11 @@ BOOL receive_local_message(fd_set *fds, char *buffer, int buffer_len, int timeou
                }
        }
 
-       if (koplocks && koplocks->msg_waiting(fds)) {
-               return koplocks->receive_message(fds, buffer, buffer_len);
+       if (koplocks && koplocks->msg_waiting(&fds)) {
+               return koplocks->receive_message(&fds, buffer, buffer_len);
        }
 
-       if (!FD_ISSET(oplock_sock, fds))
+       if (!FD_ISSET(oplock_sock, &fds))
                return False;
 
        /*
@@ -978,16 +982,8 @@ dev = %x, inode = %.0f, file_id = %lu and no fsp found !\n",
                char op_break_reply[OPBRK_CMD_HEADER_LEN+OPLOCK_BREAK_MSG_LEN];
                uint16 reply_from_port;
                char *reply_msg_start;
-               fd_set fds;
-
-               FD_ZERO(&fds);
-               FD_SET(oplock_sock,&fds);
-
-               if (koplocks && koplocks->notification_fd != -1) {
-                       FD_SET(koplocks->notification_fd, &fds);
-               }
 
-               if(receive_local_message(&fds, op_break_reply, sizeof(op_break_reply),
+               if(receive_local_message(op_break_reply, sizeof(op_break_reply),
                                time_left ? time_left * 1000 : 1) == False) {
                        if(smb_read_error == READ_TIMEOUT) {
                                if( DEBUGLVL( 0 ) ) {
index c712e7d3ec45a92ae9dc33371dae3deb32b1266d..ffcf3d0af4dad5250980d5c24642fbdc9cbf919c 100644 (file)
@@ -99,7 +99,7 @@ static BOOL irix_oplock_receive_message(fd_set *fds, char *buffer, int buffer_le
         */
 
        if(read(oplock_pipe_read, &dummy, 1) != 1) {
-               DEBUG(0,("receive_local_message: read of kernel notification failed. \
+               DEBUG(0,("irix_oplock_receive_message: read of kernel notification failed. \
 Error was %s.\n", strerror(errno) ));
                smb_read_error = READ_ERROR;
                return False;
@@ -112,7 +112,7 @@ Error was %s.\n", strerror(errno) ));
         */
 
        if(sys_fcntl_ptr(oplock_pipe_read, F_OPLKSTAT, &os) < 0) {
-               DEBUG(0,("receive_local_message: fcntl of kernel notification failed. \
+               DEBUG(0,("irix_oplock_receive_message: fcntl of kernel notification failed. \
 Error was %s.\n", strerror(errno) ));
                if(errno == EAGAIN) {
                        /*
@@ -131,12 +131,12 @@ Error was %s.\n", strerror(errno) ));
         */
 
        if ((fsp = file_find_di_first((SMB_DEV_T)os.os_dev, (SMB_INO_T)os.os_ino)) == NULL) {
-               DEBUG(0,("receive_local_message: unable to find open file with dev = %x, inode = %.0f\n",
+               DEBUG(0,("irix_oplock_receive_message: unable to find open file with dev = %x, inode = %.0f\n",
                        (unsigned int)os.os_dev, (double)os.os_ino ));
                return False;
        }
      
-       DEBUG(5,("receive_local_message: kernel oplock break request received for \
+       DEBUG(5,("irix_oplock_receive_message: kernel oplock break request received for \
 dev = %x, inode = %.0f\n, file_id = %ul", (unsigned int)fsp->dev, (double)fsp->inode, fsp->file_id ));
      
        /*
@@ -166,19 +166,19 @@ static BOOL irix_set_kernel_oplock(files_struct *fsp, int oplock_type)
 {
        if (sys_fcntl_long(fsp->fd, F_OPLKREG, oplock_pipe_write) == -1) {
                if(errno != EAGAIN) {
-                       DEBUG(0,("set_file_oplock: Unable to get kernel oplock on file %s, dev = %x, \
+                       DEBUG(0,("irix_set_kernel_oplock: Unable to get kernel oplock on file %s, dev = %x, \
 inode = %.0f, file_id = %ul. Error was %s\n", 
                                 fsp->fsp_name, (unsigned int)fsp->dev, (double)fsp->inode, fsp->file_id,
                                 strerror(errno) ));
                } else {
-                       DEBUG(5,("set_file_oplock: Refused oplock on file %s, fd = %d, dev = %x, \
+                       DEBUG(5,("irix_set_kernel_oplock: Refused oplock on file %s, fd = %d, dev = %x, \
 inode = %.0f, file_id = %ul. Another process had the file open.\n",
                                 fsp->fsp_name, fsp->fd, (unsigned int)fsp->dev, (double)fsp->inode, fsp->file_id ));
                }
                return False;
        }
        
-       DEBUG(10,("set_file_oplock: got kernel oplock on file %s, dev = %x, inode = %.0f, file_id = %ul\n",
+       DEBUG(10,("irix_set_kernel_oplock: got kernel oplock on file %s, dev = %x, inode = %.0f, file_id = %ul\n",
                  fsp->fsp_name, (unsigned int)fsp->dev, (double)fsp->inode, fsp->file_id));
 
        return True;
@@ -196,7 +196,7 @@ static void irix_release_kernel_oplock(files_struct *fsp)
                 * oplock state of this file.
                 */
                int state = sys_fcntl_long(fsp->fd, F_OPLKACK, -1);
-               dbgtext("release_kernel_oplock: file %s, dev = %x, inode = %.0f file_id = %ul, has kernel \
+               dbgtext("irix_release_kernel_oplock: file %s, dev = %x, inode = %.0f file_id = %ul, has kernel \
 oplock state of %x.\n", fsp->fsp_name, (unsigned int)fsp->dev,
                         (double)fsp->inode, fsp->file_id, state );
        }
@@ -206,7 +206,7 @@ oplock state of %x.\n", fsp->fsp_name, (unsigned int)fsp->dev,
         */
        if(sys_fcntl_long(fsp->fd, F_OPLKACK, OP_REVOKE) < 0) {
                if( DEBUGLVL( 0 )) {
-                       dbgtext("release_kernel_oplock: Error when removing kernel oplock on file " );
+                       dbgtext("irix_release_kernel_oplock: Error when removing kernel oplock on file " );
                        dbgtext("%s, dev = %x, inode = %.0f, file_id = %ul. Error was %s\n",
                                fsp->fsp_name, (unsigned int)fsp->dev, 
                                (double)fsp->inode, fsp->file_id, strerror(errno) );
index d9465783807e830d1eff32ca46806824ec8f5c5f..372ad857c400e1c48ef48c7abdc0afcdd3e87cf7 100644 (file)
@@ -136,7 +136,7 @@ static BOOL linux_oplock_receive_message(fd_set *fds, char *buffer, int buffer_l
                goto out;
        }
 
-       DEBUG(3,("receive_local_message: kernel oplock break request received for \
+       DEBUG(3,("linux_oplock_receive_message: kernel oplock break request received for \
 dev = %x, inode = %.0f\n", (unsigned int)fsp->dev, (double)fsp->inode ));
      
        /*
@@ -171,14 +171,14 @@ dev = %x, inode = %.0f\n", (unsigned int)fsp->dev, (double)fsp->inode ));
 static BOOL linux_set_kernel_oplock(files_struct *fsp, int oplock_type)
 {
        if (linux_setlease(fsp->fd, F_WRLCK) == -1) {
-               DEBUG(3,("set_file_oplock: Refused oplock on file %s, fd = %d, dev = %x, \
+               DEBUG(3,("linux_set_kernel_oplock: Refused oplock on file %s, fd = %d, dev = %x, \
 inode = %.0f. (%s)\n",
                         fsp->fsp_name, fsp->fd, 
                         (unsigned int)fsp->dev, (double)fsp->inode, strerror(errno)));
                return False;
        }
        
-       DEBUG(3,("set_file_oplock: got kernel oplock on file %s, dev = %x, inode = %.0f, file_id = %lu\n",
+       DEBUG(3,("linux_set_kernel_oplock: got kernel oplock on file %s, dev = %x, inode = %.0f, file_id = %lu\n",
                  fsp->fsp_name, (unsigned int)fsp->dev, (double)fsp->inode, fsp->file_id));
 
        return True;
@@ -196,7 +196,7 @@ static void linux_release_kernel_oplock(files_struct *fsp)
                 * oplock state of this file.
                 */
                int state = fcntl(fsp->fd, F_GETLEASE, 0);
-               dbgtext("release_kernel_oplock: file %s, dev = %x, inode = %.0f file_id = %lu has kernel \
+               dbgtext("linux_release_kernel_oplock: file %s, dev = %x, inode = %.0f file_id = %lu has kernel \
 oplock state of %x.\n", fsp->fsp_name, (unsigned int)fsp->dev,
                         (double)fsp->inode, fsp->file_id, state );
        }
@@ -206,7 +206,7 @@ oplock state of %x.\n", fsp->fsp_name, (unsigned int)fsp->dev,
         */
        if (linux_setlease(fsp->fd, F_UNLCK) == -1) {
                if (DEBUGLVL(0)) {
-                       dbgtext("release_kernel_oplock: Error when removing kernel oplock on file " );
+                       dbgtext("linux_release_kernel_oplock: Error when removing kernel oplock on file " );
                        dbgtext("%s, dev = %x, inode = %.0f, file_id = %lu. Error was %s\n",
                                fsp->fsp_name, (unsigned int)fsp->dev, 
                                (double)fsp->inode, fsp->file_id, strerror(errno) );
index 67ceb985398d84ae1fea7b9f2835d2a86cb4d750..53f9ff035fa71ed43720f023d6bf054afdb1d008 100644 (file)
@@ -109,10 +109,10 @@ BOOL push_oplock_pending_smb_message(char *buf, int msg_len)
  oplock messages, change notify events etc.
 ****************************************************************************/
 
-static void async_processing(fd_set *fds, char *buffer, int buffer_len)
+static void async_processing(char *buffer, int buffer_len)
 {
        /* check for oplock messages (both UDP and kernel) */
-       if (receive_local_message(fds, buffer, buffer_len, 0)) {
+       if (receive_local_message(buffer, buffer_len, 0)) {
                process_local_message(buffer, buffer_len);
        }
 
@@ -206,7 +206,7 @@ static BOOL receive_message_or_smb(char *buffer, int buffer_len, int timeout)
           is the best we can do until the oplock code knows more about
           signals */
        if (selrtn == -1 && errno == EINTR) {
-               async_processing(&fds, buffer, buffer_len);
+               async_processing(buffer, buffer_len);
                /*
                 * After async processing we must go and do the select again, as
                 * the state of the flag in fds for the server file descriptor is
@@ -235,7 +235,7 @@ static BOOL receive_message_or_smb(char *buffer, int buffer_len, int timeout)
         */
 
        if (oplock_message_waiting(&fds)) {
-               async_processing(&fds, buffer, buffer_len);
+               async_processing(buffer, buffer_len);
                /*
                 * After async processing we must go and do the select again, as
                 * the state of the flag in fds for the server file descriptor is
@@ -275,7 +275,6 @@ BOOL receive_next_smb(char *inbuf, int bufsize, int timeout)
 void respond_to_all_remaining_local_messages(void)
 {
   char buffer[1024];
-  fd_set fds;
 
   /*
    * Assert we have no exclusive open oplocks.
@@ -287,24 +286,13 @@ void respond_to_all_remaining_local_messages(void)
     return;
   }
 
-  /*
-   * Setup the select read fd set.
-   */
-
-  FD_ZERO(&fds);
-  if(!setup_oplock_select_set(&fds))
-    return;
-
   /*
    * Keep doing receive_local_message with a 1 ms timeout until
    * we have no more messages.
    */
-  while(receive_local_message(&fds, buffer, sizeof(buffer), 1)) {
+  while(receive_local_message(buffer, sizeof(buffer), 1)) {
          /* Deal with oplock break requests from other smbd's. */
          process_local_message(buffer, sizeof(buffer));
-
-         FD_ZERO(&fds);
-         (void)setup_oplock_select_set(&fds);
   }
 
   return;